Redis LRU策略深度解析
一、核心工作原理
淘汰触发条件
当内存使用达到maxmemory阈值时自动激活
优先淘汰最久未被访问的键值数据
访问标记机制
每次读写操作更新键的访问时间戳(8字节空间开销)
通过双向链表维护访问顺序(新访问的键移动到链表头部)
二、实现策略类型
策略类型 | 作用范围 | 典型场景 |
---|---|---|
allkeys-lru | 所有键空间 | 全量缓存系统 |
volatile-lru | 仅设置过期时间的键 | 混合存储场景 |
三、底层实现优化
近似LRU算法
随机采样5个键进行淘汰(默认采样数可调)
# 调整采样池大小(需重启生效)
maxmemory-samples 10
内存压缩机制
对长字符串类型自动进行碎片整理
淘汰操作与内存整理协同工作
四、优劣势对比
✅ 优势
时间局部性表现优异(适合突发流量场景)
实现复杂度低于LFU(无频率计算开销)
❌ 劣势
无法识别周期性冷数据(如每月报表数据)
链表维护带来额外内存消耗(约5%内存开销)
五、典型应用场景
商品详情页缓存
80%访问集中在20%热销商品
配置示例:
maxmemory 16gb
maxmemory-policy allkeys-lru
用户会话数据存储
30分钟内未活跃会话自动淘汰
配置示例:
expire session:user123 1800 # 半小时过期
maxmemory-policy volatile-lru
六、监控与调优
关键指标监控
# 查看淘汰统计
redis-cli info stats | grep evicted_keys
# 输出示例:evicted_keys_lru:1532
参数调优建议
高并发场景增大采样池:maxmemory-samples 20
混合使用TTL策略降低误淘汰率
配置黄金法则:
全内存缓存系统优先采用allkeys-lru
含持久化数据时选用volatile-lru
突发流量场景配合本地缓存使用