Redis配置里那些淘汰策略到底是怎么回事,搞清楚才知道咋用才合适
- 问答
- 2026-01-13 09:25:13
- 3
说到Redis的淘汰策略,这其实是一个“家里地方就那么大,新东西不断买进来,旧东西该怎么处理?”的问题,你的电脑内存是有限的,Redis能用的内存也是有限的,当Redis把分配给它的内存都用完了,这时候客户端又发来一个写命令(比如SET一个新的键值对),要申请新的空间,Redis该怎么办?是直接拒绝,还是把一些旧的东西扔掉给新的腾地方?这个“扔东西”的规则,就是我们要说的淘汰策略。
你可以在Redis的配置文件redis.conf里找到一个叫maxmemory-policy的配置项,它就是用来设置这个规则的,不同的策略直接决定了Redis在内存不足时的行为,进而影响你的应用性能和数据留存,下面我们就一个个来看这些策略到底是怎么“扔东西”的。
不淘汰,直接报错:noeviction
这是Redis的默认策略,这个策略最简单粗暴:当内存不够用时,所有会申请更多内存的写命令(比如SET, LPUSH, HMSET等)直接返回一个错误,读命令(如GET)不受影响,这就像你家衣柜满了,你老婆又想买新衣服,你直接说“不行,没地儿放了,不准买!”
什么时候用这个策略? 当你把Redis用作一个纯缓存,并且允许部分数据丢失不会对核心业务造成严重影响时,绝对不要用这个策略,它只适合那些你把Redis当成唯一数据库的场景,里面的数据绝对不能丢,宁可系统暂时写不进去,也要保证已有数据的安全,这时候你需要在上游应用层做好降级处理,比如写不进去的时候先写到一个队列里等待。
“全体居民”大抽查:allkeys-lru
这个策略的运作方式是:当内存不足,它会尝试从整个键空间(就是所有key里)中,淘汰掉最近最少使用的那个键。
“最近最少使用”(LRU)听起来有点绕,你可以理解成一个“懒人排查法”,Redis不会精确记录每个key最后一次被访问的具体时间,那样成本太高,它会用一个近似算法,随机抽取一批key(默认是5个),然后从这5个里面挑出那个最久没被访问的key淘汰掉,这就像社区要清理闲置物品,不是挨家挨户查,而是随机抽几栋楼,找出里面最长时间没住人的那间房子把东西清走。

什么时候用这个策略? 这是最常用的策略之一,当你希望那些经常被访问的热点数据能尽量留在内存里,而不常用的冷数据被自动清理掉时,就用它,比如你有一个用户系统,活跃用户的资料经常被查询,就应该留在内存;而半年不登录的用户资料,被淘汰了也无所谓,这非常适合典型的缓存场景。
“有过期时间的居民”大抽查:volatile-lru
这个策略和allkeys-lru很像,区别在于它淘汰的范围,它只会在那些设置了过期时间的key中间,进行LRU淘汰,而那些没设置过期时间的key,会被认为是“永久数据”,受到保护,不会被淘汰。
这就像小区里,只清理那些租户(设置了租约/过期时间)里最久没回家的,而业主(没设过期时间)的房子哪怕空着也不能动。
什么时候用这个策略? 当你的数据集里,有一部分数据是希望永久保存的(比如系统配置、基础字典),另一部分数据是临时性的缓存(比如用户会话session、验证码),你用这个策略可以确保你的核心数据安全,只让缓存数据根据LRU规则自行淘汰。
随机淘汰:allkeys-random / volatile-random

顾名思义,就是随机淘汰。allkeys-random从所有key里随机选一个扔掉;volatile-random从设置了过期时间的key里随机选一个扔掉。
这个策略非常“随缘”,不考虑key的热度,也不考虑它的使用频率,全凭运气,这就像闭着眼睛从衣柜里随便扯一件衣服出来扔掉。
什么时候用这个策略? 当你确信所有key被访问的概率都差不多,没有明显的热点数据,或者说你不在乎淘汰掉哪个,只要能把内存空出来就行,这种场景比较少见,但如果你应用的访问模式确实是完全随机的,那用这个策略的开销会比LRU小一点。
按剩余寿命淘汰:volatile-ttl
这个策略只关心一件事:谁的“死期”它只在设置了过期时间的key中,优先淘汰剩余存活时间最短的那个。
这就像药房管理药品,快过期的药优先被清掉。

什么时候用这个策略? 当你给缓存数据设置的过期时间能明确代表其价值时,比如你的数据缓存1小时,你希望Redis能智能地提前清理那些马上就要自然过期的数据,从而更高效地腾出空间,这样可能比随机淘汰或LRU淘汰更有效。
最不经常使用:allkeys-lfu / volatile-lfu
这是Redis 4.0引入的新策略,LFU是“最不经常使用”,它淘汰的是访问频率最低的key,这和LRU(最近最少使用)有细微,但重要的区别,LRU关注的是“有没有用过,一个很久以前很火但现在无人问津的key,可能因为“被不小心点了一下,就不会被淘汰,而LFU关注的是“长期”的访问频率,一个key如果长期以来都没人用,即使它刚才被访问了一次,因为它历史访问次数太少,依然可能被淘汰。
这就像评选“年度优秀员工”和“本月优秀员工”的区别,LFU看的是“年度”总表现,LRU更看重“本月”的表现。
什么时候用这个策略? 当你的应用有非常明显的热点数据,并且希望淘汰策略能更精准地识别并保留这些长期热点,比如新闻网站的头条新闻、电商平台的爆款商品信息,使用LFU可以更好地对抗偶尔的、突发性的访问对LRU策略的干扰。
怎么选才合适?
选择哪个策略,就问自己几个问题:
- 数据能丢吗? 绝对不能丢,且没有其他备份,考虑
noeviction(但要做好应用层容错),可以丢,再往下看。 - 数据有分类吗? 一部分是重要数据(不设过期时间),一部分是缓存数据(设过期时间),选带
volatile-前缀的策略(如volatile-lru)。 - 数据没分类,全是缓存? 选带
allkeys-前缀的策略(如allkeys-lru)。 - 访问模式有规律吗? 有热点,希望留热点,用
...-lru或更精准的...-lfu,访问完全随机,可以用...-random。 - 过期时间设置得是否合理? 如果过期时间本身就能区分数据价值,可以尝试
volatile-ttl。
对于大多数缓存场景,allkeys-lru 是一个稳健且通用的起点,理解你的数据特性和业务需求,是做出正确选择的关键。
本文由召安青于2026-01-13发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/79847.html
