研究一下Redis里头缓存是怎么删的,感觉挺复杂又有点讲究
- 问答
- 2026-01-24 10:19:19
- 4
说到Redis缓存是怎么删除的,这事儿确实不像表面上看起来“删了就没了”那么简单,它背后有一套挺有意思的逻辑,就像你管理一个空间有限的小仓库,东西不能只进不出,但什么时候出、怎么出、先出哪个,就很有讲究了,这主要涉及到两个方面:一是删除的策略,也就是决定哪些数据该被淘汰;二是删除的时机和方式,是等到满了再删,还是平时就悄悄地删。
当缓存满了怎么办?淘汰策略是关键
Redis的内存是有限的,不可能无限制地存数据,当内存快要用完时,如果再想存入新的数据,就必须先扔掉一些旧数据,这个过程叫“内存淘汰”,Redis提供了好几种淘汰策略让你选,这直接决定了系统的行为和性能。
根据Redis官方文档,主要的策略可以分成几类:
-
“不淘汰”策略:
noeviction,这是Redis的默认策略,选择这个,当内存不够时,所有会引发增加新数据的命令(比如SET)都会报错,而像GET这种只是读取的命令还能正常用,这适合你非常确定某些关键数据绝对不能丢的场景,宁可系统写不进去,也不能随便删东西。 -
在所有的键中随机淘汰:
allkeys-lru:这是最常用、最经典的策略之一,LRU是“最近最少使用”的缩写,它会尝试淘汰掉所有键中,最长时间没有被访问过的那些键,它的逻辑是,认为最近没被用到的数据,将来被用到的可能性也小,淘汰它们对缓存命中率的影响相对较小,这比较适合那种热点数据比较集中的业务。allkeys-lfu:LFU是“最不经常使用”的缩写,这是Redis 4.0以后加入的新策略,它不再只看“有没有用,而是统计每个键被访问的“频率”,它会优先淘汰掉访问次数最少的键,这适合那种访问模式比较平稳,需要根据长期热度来淘汰的场景,比如一个文章的排行榜,老的热门文章可能比新的冷门文章更值得保留。allkeys-random:简单粗暴,从所有键中随机挑一个淘汰,这个策略的好处是速度快,因为不需要计算LRU或LFU这些额外信息,但缺点也很明显,可能会误删掉非常重要的热点数据,导致缓存命中率下降,一般用得比较少。
-
只在设置了过期时间的键中淘汰:
- 这类策略和上面的很像,只是范围缩小了,比如
volatile-lru、volatile-lfu、volatile-random,它们只会在那些你明确设置了过期时间(TTL)的键里面进行挑选和淘汰,而那些你没设置过期时间的“永久”键,会被保护起来,不会被淘汰,这适合你有一些特别重要的基础数据想永久保存在缓存里,其他临时数据可以随意清理的场景。 - 这里面还有个特别的策略叫
volatile-ttl,它不是看使用情况,而是看谁的“剩余寿命”最短,它会优先淘汰掉过期时间最近的键,哪怕这个键刚刚被访问过,这有点像处理冰箱里的食物,先吃掉最快过期的那个。
- 这类策略和上面的很像,只是范围缩小了,比如
选择哪种策略,没有绝对的好坏,完全取决于你的业务特点,如果你的数据访问没什么规律,可能用allkeys-lru比较稳妥;如果你能清晰地分辨出关键数据和非关键数据,可以用volatile-*系列策略。
删除的时机和方式:不只是满了才动手
除了内存满了被迫淘汰,Redis更大量的删除动作其实是针对那些设置了过期时间的键,这些键的删除也有两种主要方式,可以理解为“懒汉式”和“勤快式”的结合。
-
惰性删除:这是最基础的方式,当一个带有过期时间的键被客户端访问时,Redis会先检查一下它是否已经过期了,如果过期了,就立刻删除它,然后返回一个空值给客户端,就像这个键从来不存在一样,这种方式的好处是节约CPU,只在需要的时候才做检查,但坏处是,如果某个过期的键永远不再被访问,那么它就永远占着内存,成了“垃圾”,直到下次内存淘汰时才有可能被清理掉。
-
定期删除:为了解决惰性删除可能积累大量垃圾的问题,Redis还有一个后台任务,会定期地(默认是每100毫秒一次)随机抽查一批设置了过期时间的键,它会检查这些键是否过期,如果过期就删除,它还会自适应地控制检查的强度和时长:如果发现过期的键很多,它会在下一次检查时多抽查一些;如果发现过期的很少,就少抽查一些,这是一种权衡,既不会一直占用太多CPU,又能比较及时地清理掉大部分过期数据。
实际运行中,一个过期的键通常是这样被删除的:要么在定期删除的那一秒被扫描到并清理;要么在它被访问的那一刻,由惰性删除机制给干掉,两者配合,保证了内存回收的效率和及时性。
总结一下
感觉Redis的删除“复杂又讲究”就对了,它不是一个单一的动作,而是一个由多种策略和机制组合而成的系统,你需要根据业务情况,精心选择“淘汰策略”来应对内存不足的紧急状况;Redis自身又通过“惰性删除”和“定期删除”这套组合拳,在日常运行中默默无闻地维护着缓存的新鲜度,清理掉废旧数据,理解了这些,你才能更好地配置和使用Redis,让它既高效又可靠地为你服务。

本文由寇乐童于2026-01-24发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://www.haoid.cn/wenda/85024.html
