当前位置:首页 > 问答 > 正文

Redis缓存回收其实没那么复杂,简单几招就能搞定缓存清理和管理

说到Redis缓存回收,很多人可能觉得这是个很深奥的技术话题,动不动就要研究内存分配、算法细节,但其实对于大多数日常使用来说,你只需要理解几个核心要点,就能轻松搞定缓存的清理和管理,不让它成为系统的负担,咱们今天就不扯那些难懂的专业词,用大白话把这事儿说清楚。

第一招:搞清楚Redis为啥要“回收”内存

你可以把Redis的内存想象成一个仓库,这个仓库不是无限大的,你不停地往里面塞东西(写入缓存),总有一天它会满,仓库满了之后,你再想塞新东西进去,怎么办?只有两个选择:要么扩建仓库(给Redis加内存,这是硬件成本),要么把仓库里的一些旧东西或者不重要的东西扔掉,腾出空间(这就是缓存回收),我们讨论的回收,指的就是后一种方法。

第二招:设定内存上限,这是管理的第一步

这是最最重要的一步,但很多人会忽略,就好像你管理自己的钱包,你得知道自己钱包最多能装多少钱,才不会把钱撑破,Redis也一样,你必须在配置文件(redis.conf)里用 maxmemory 这个参数给它设一个内存使用的上限,比如你的服务器有8G内存,你打算分4G给Redis,那就设成 maxmemory 4gb,设了这个上限之后,当Redis的内存使用达到这个值,回收机制才会被触发,如果你不设,Redis可能会把系统内存吃光,导致服务器卡死甚至崩溃。

Redis缓存回收其实没那么复杂,简单几招就能搞定缓存清理和管理

第三招:选择你的“扔东西”策略,这是核心

设好了仓库大小,接下来就得定规矩:当仓库满了,接下来要扔哪些东西?这就是Redis的回收策略,通过 maxmemory-policy 参数来设置,主要有几种常见的思路,你可以根据自己业务的实际情况来选:

  1. allkeys-lru:这是最常用、最省心的策略之一,LRU的意思是“最近最少使用”,这个策略就是说,当内存不够时,Redis会去看所有key(不管有没有设过期时间),把那个最长时间没被访问过的key踢掉,这很符合常识:长时间没人用的,很可能就是不重要的,扔掉最不可惜,如果你的应用是那种有些热点数据经常被访问,有些冷数据偶尔才用,用这个策略就很合适。

  2. volatile-lru:这个和上面的区别是,它只会在那些“设置了过期时间(TTL)的key”里面,踢掉最近最少使用的,如果你能明确区分哪些数据是重要的(比如用户基本信息,你不希望被轻易踢掉),哪些数据是临时性的、可以丢的(比如短信验证码、临时会话),就给临时数据设置一个过期时间,然后用这个策略,这样可以保护你的重要数据不被回收。

    Redis缓存回收其实没那么复杂,简单几招就能搞定缓存清理和管理

  3. allkeys-random:简单粗暴,内存满了就随机挑一个key扔掉,这个策略听起来不智能,但在某些特殊场景下有用,比如你所有的key访问概率都差不多,没有明显的冷热区分。

  4. volatile-ttl:这个策略只针对设了过期时间的key,但它不是看谁最近没用过,而是看谁的“剩余寿命”最短,比如有两个key,一个10分钟后过期,一个1小时后过期,它就优先把那个10分钟后过期的踢掉,这适合那种缓存数据都有TTL,并且你希望更精确地按过期顺序来清理的场景。

  5. noeviction:这是默认策略,但它不是回收策略,它的意思是“禁止驱逐”,当内存满了,再有写请求进来(比如要添加新key),Redis就直接报错,拒绝写入,这个策略适用于你把这个Redis实例当成一个严格的数据库来用,里面的数据绝对不能丢的场景,但对于纯缓存场景,一般不推荐用这个,因为会导致服务不可用。

简单总结一下怎么选:如果你不确定,或者业务模式是常见的有冷有热,就直接用 allkeys-lru,基本不会错,如果你想更好地保护核心数据,就给非核心数据设好过期时间,然后用 volatile-lru

Redis缓存回收其实没那么复杂,简单几招就能搞定缓存清理和管理

第四招:别忘了给缓存设个“保质期”

这是一个非常好的习惯,在往Redis里存数据的时候,只要可能,就顺手给它设置一个过期时间(TTL)。SET user:123 "张三" EX 3600,这个 EX 3600 就是让这个key在3600秒(1小时)后自动过期,这样做有两个巨大好处:

  • 避免垃圾数据堆积:有些数据可能只用一次,或者用完后业务逻辑忘了删,设了过期时间就能自动清理,防止它们永远占着内存。
  • 辅助回收策略:就像上面说的,如果你用了 volatile-lruvolatile-ttl 策略,设了过期时间的数据才会被纳入回收范围,让你的回收更精准。

第五招:定期检查,做到心中有数

管理缓存不能“设好就不管”,你需要定期用一些简单的命令看看缓存的状态。

  • INFO memory:查看Redis内存使用的详细情况,比如用了多少内存,最大内存是多少,当前用的回收策略是啥。
  • DBSIZE:看看当前数据库里总共有多少个key,如果key的数量异常增多,可能是有地方在不停地写缓存却没设过期时间。
  • KEYS prefix:* (生产环境慎用,可以用SCAN命令替代):可以帮你查看某个模式下的key有多少,判断缓存是否按预期在存储。

通过这几招,你基本上就能把Redis的缓存回收和管理掌握个八九不离十了,核心就是:设定内存上限 -> 选择合适的回收策略 -> 养成设过期时间的好习惯 -> 偶尔看一眼运行状态,Redis的缓存回收不是为了追求理论的完美,而是为了解决实际业务问题,所以选择最适合你业务场景的那一招,就是最好的招数。