Redis过期策略与内存淘汰机制
Redis中键的过期策略有哪些(定期删除、惰性删除)?当内存满时Redis的8种内存淘汰策略分别是什么?如何选择合适的内存淘汰策略?
回答
屠龙少年
过期策略:
-
定期删除:
- Redis每100ms随机抽查一批(默认20个)设置了过期时间的key
- 删除其中已过期的key
- 若过期key超过25%,则继续抽查(防止过多过期key堆积)
- 时间上限25ms(防止阻塞太久)
-
惰性删除:
- 当客户端访问某个key时,检查是否过期,若过期则删除
- 补充定期删除未清理到的过期key
- 存在缺陷:若过期key长时间不被访问,会一直占用内存
内存淘汰策略(8种,maxmemory-policy配置):
- noeviction(默认):不淘汰,写入直接报错OOM
- allkeys-lru:全空间淘汰最近最少使用的key
- volatile-lru:在设置了过期时间的key中淘汰最近最少使用的
- allkeys-lfu(4.0+):全空间淘汰最不经常使用的key
- volatile-lfu(4.0+):在过期key中淘汰最不经常使用的
- allkeys-random:全空间随机淘汰
- volatile-random:在过期key中随机淘汰
- volatile-ttl:淘汰剩余存活时间最短的key
选择建议:
- 缓存场景:allkeys-lru(最常用,兼顾命中率)
- 冷热分明:allkeys-lfu(如CDN缓存)
- 不同key重要性不同:volatile-ttl+设置不同TTL
- 所有key必须存在:noeviction(适合做数据库的场景,如队列)