Redis的过期策略与内存淘汰机制
更多面试题请看这里:https://interview.raoyunsoft.com/
面试题专栏会持续更新欢迎关注订阅
📌 Redis的过期策略
Redis采用双重过期管理机制确保内存高效利用:
-
定期删除
- 默认每
100ms
随机抽取部分key检查过期状态 - 仅删除抽样中发现已过期的key(非全量扫描)
- 平衡点:避免高频扫描导致的CPU资源消耗
- 默认每
-
惰性删除
- 在客户端访问key时实时检查过期状态
- 若发现过期立即删除并返回空值
- 关键优势:零额外CPU开销
⚠️ 为何不用定时删除?
定时器精确监控每个key过期虽能及时释放内存,但会严重消耗CPU资源。在高并发场景下,CPU应优先处理请求而非执行删除操作。
🚨 内存淘汰机制
当定期删除+惰性删除仍导致内存堆积时,触发内存淘汰策略(需在redis.conf
配置):
# redis.conf关键配置
maxmemory 4gb # 设置最大内存
maxmemory-policy volatile-lru # 设置淘汰策略
🔥 六大淘汰策略
策略 | 作用范围 | 淘汰逻辑 | 适用场景 |
---|---|---|---|
volatile-lru | 仅过期集合 | 淘汰最近最少使用的key | 热点数据集中场景 |
volatile-ttl | 仅过期集合 | 淘汰剩余寿命最短的key | 时效性敏感数据 |
volatile-random | 仅过期集合 | 随机淘汰key | 无特殊要求场景 |
allkeys-lru | 所有key | 全局LRU淘汰 | 内存不足时优先保证新写入 |
allkeys-random | 所有key | 全局随机淘汰 | 数据均匀分布场景 |
noeviction | - | 禁止淘汰,拒绝新写入 | 数据绝对不可丢失场景 |
💡 关键细节:
- 未设置过期时间的key不会被
volatile-*
策略淘汰allkeys-*
策略会无视过期状态操作所有key- 生产环境推荐
allkeys-lru
(平衡命中率与内存控制)
🛠️ 策略选择建议
- 金融场景 → 优先
noeviction
+ 独立扩容方案 - 电商缓存 → 首选
allkeys-lru
保证高命中率 - 实时日志 → 使用
volatile-ttl
自动清理旧数据
⚠️ 实际案例:某社交平台使用
volatile-lru
后,缓存命中率从82%提升至94%,同时内存溢出故障减少87%