Redis里那些数据什么时候该被清理,淘汰机制到底是怎么回事?
- 问答
- 2026-01-08 19:19:14
- 3
根据Redis官方文档的描述,Redis作为一个基于内存的键值数据库,其所有数据都存储在内存中,内存相对于硬盘来说容量有限且成本更高,因此当Redis实例使用的内存总量超过了系统配置的最大内存限制(通过maxmemory参数设置)时,就需要一种机制来决定哪些数据可以被移除,以便为新写入的数据腾出空间,这种机制就是Redis的淘汰机制。
什么时候数据会被清理?
数据被清理主要发生在以下两种核心场景中:
-
主动清理(过期键删除): 这是Redis的常规维护行为,当你为某个键设置了过期时间(TTL)后,Redis会通过两种策略来删除这些已过期的键,以防止它们永久占用内存。
- 惰性删除: 当客户端尝试访问一个键时,Redis会先检查这个键是否已经过期,如果过期了,那么Redis会立即删除这个键,然后返回空值给客户端,这种策略的优点是节省CPU资源,只在需要的时候进行检查,缺点是如果大量过期的键永远不再被访问,那么它们就会成为“内存垃圾”,一直占用着空间无法释放。
- 定期删除: 为了解决惰性删除的缺点,Redis会定期(默认每秒10次)随机抽取一部分设置了过期时间的键,检查它们是否过期,如果过期就删除,通过限制执行的时长和频率,定期删除减少了对CPU时间的影响,同时在一定程度上补偿了惰性删除的不足,官方文档指出,Redis会在这两种策略之间取得平衡,以高效地处理过期键。
-
被动清理(内存淘汰): 这是回答你问题的关键,当Redis的内存使用达到
maxmemory上限,且客户端试图执行一个会增加内存使用的命令(如写入新键、修改现有键导致值变大)时,触发被动清理,Redis会根据配置的淘汰策略(eviction policy),从所有键中(包括没有设置过期时间的键)选择一部分进行删除,直到腾出足够的内存来存放新数据。
淘汰机制到底是怎么回事?
淘汰机制的核心就是一套规则,用来回答“当内存不足时,应该牺牲谁?”这个问题,Redis提供了8种主要的淘汰策略,你可以根据自己应用的特性在配置文件中通过maxmemory-policy参数进行选择,这些策略大致可以分为三类:
-
不淘汰策略:
noeviction(默认策略):当内存不足时,新写入的操作会报错,所有可能导致内存增加的请求(如SET, LPUSH等)都会被拒绝,而读请求可以继续服务,这适用于你希望数据绝对可靠,宁愿暂时无法写入也不能丢失任何已有数据的场景。
-
在设置了过期时间的键中进行淘汰:
volatile-lru:使用LRU(最近最少使用)算法,从所有设置了过期时间的键中,淘汰那个最久没有被访问过的键。volatile-lfu:使用LFU(最不经常使用)算法,从所有设置了过期时间的键中,淘汰那个在一定时间内被访问频率最低的键。volatile-ttl:从所有设置了过期时间的键中,淘汰那个剩余存活时间(TTL)最短的键,也就是即将过期的键。volatile-random:从所有设置了过期时间的键中,随机选择一个键进行淘汰。
-
在所有键中进行淘汰(范围更广,更激进):
allkeys-lru:使用LRU算法,从所有键(不论是否设置过期时间)中,淘汰最久未使用的键。allkeys-lfu:使用LFU算法,从所有键中,淘汰访问频率最低的键。allkeys-random:从所有键中,随机选择一个键进行淘汰。
如何理解LRU和LFU?
Redis官方文档和社区解读中常用一个简单的比喻:
- LRU(最近最少使用):它认为“最近被用过的数据,将来被用到的可能性也更大”,所以它会优先淘汰最“冷僻”、最长时间没人惦记的数据,这比较通用,适合大多数场景。
- LFU(最不经常使用):它认为“被访问次数多的数据更重要”,一个热门商品的信息被频繁查询,即使它有一小段时间没被访问,也不应该被淘汰,而一个冷门商品信息虽然刚被访问过一次,但因为总访问次数极少,也可能被淘汰,LFU更适合那种需要区分“热点数据”和“长尾数据”的场景。
需要注意的是,Redis实现的LRU和LFU并非严格的算法,而是近似实现,它为了节省内存(不想为每个键维护一个完整的访问链表)和提升性能,采用随机采样的方式来估算键的“热度”或“新鲜度”,但实践证明这种近似算法在效果上已经足够好。
数据清理是Redis管理内存的生命线。过期键删除是日常保洁,而内存淘汰则是内存爆满时的紧急疏散,你应该根据你的业务需求来选择淘汰策略:如果你的数据都有明确的生命周期,且缓存丢失影响不大,可以选择volatile-开头的策略;如果你希望缓存能自动优胜劣汰,保留最有价值的数据,那么allkeys-lru或allkeys-lfu通常是更好的选择;如果你的数据至关重要,一点都不能丢,则可以使用noeviction,但要准备好应对写入失败的情况。

本文由芮以莲于2026-01-08发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://www.haoid.cn/wenda/76986.html
