Redis内存淘汰策略的深度解析:从LRU到LFU的技术演进
Redis作为高性能内存数据库,其内存淘汰策略是保障系统稳定运行的关键机制。从Redis 4.0开始,默认采用Noeviction策略(不进行数据淘汰),而Redis 3.0之前则默认使用Volatile-lru策略。本文将深入剖析Redis支持的四种基于过期时间的淘汰策略,揭示其设计原理与适用场景。
![图片[1]- 卡尼奶资源网卡尼奶资源网-萧囡资源网-QQ活动_资源分享-源码基地-项目分享-安卓绿色软件基地](http://www.rulenetrs.com/wp-content/uploads/2026/01/image-53.png)
1. Volatile-lru:最近最少使用淘汰
Volatile-lru策略针对设置了过期时间的键,淘汰最久未被访问的数据。其核心数据结构是一个双向链表:头部为MRU(最近使用端),尾部为LRU(最久未使用端)。当数据被访问时,该数据节点将被移动到链表头部,其余节点依次后移。若链表已满且需插入新数据,则淘汰尾部节点(即最久未访问数据)。
设计思想与优化:
![图片[2]- 卡尼奶资源网卡尼奶资源网-萧囡资源网-QQ活动_资源分享-源码基地-项目分享-安卓绿色软件基地](http://www.rulenetrs.com/wp-content/uploads/2026/01/image-52.png)
传统LRU实现存在性能瓶颈:当链表长度较大时,访问尾部节点需遍历整个链表,导致高延迟。Redis采用近似LRU算法进行优化:每次访问时记录系统当前毫秒时间戳作为LRU值,并维护一个候选集合(固定大小的链表)。算法随机选取若干键加入候选集合,按LRU值降序排列(头部为最近访问,尾部为最久未访问)。淘汰时,从候选集合中选择LRU值最小的键优先淘汰,从而在降低计算开销的同时保持较高的淘汰准确性。
2. Volatile-random:随机淘汰
Volatile-random策略在设置了过期时间的键中随机选择淘汰对象。对于未到达过期时间的键,仅做随机淘汰;对于已到达过期时间的键,则必然被淘汰。此策略实现简单,适用于对淘汰顺序无特殊要求的场景。
3. Volatile-ttl:生存时间优先淘汰
Volatile-ttl策略依据键的剩余生存时间(TTL)进行淘汰,优先淘汰即将过期的键。算法会扫描设置了过期时间的键,选择TTL值最小的键进行删除。此策略适用于需要确保数据在过期后尽快释放内存的场景。
4. Volatile-lfu:最不常用淘汰
Volatile-lfu策略基于访问频率淘汰数据,淘汰使用频率最低的键。与LRU不同,LFU更关注历史访问次数而非最近访问时间。Redis通过维护每个键的访问计数器实现,淘汰时选择计数器值最小的键。此策略适用于缓存热点数据长期稳定的场景。























暂无评论内容