今天继续了解一下Redis的缓存淘汰策略
Redis 的缓存淘汰策略是当内存使用达到maxmemory限制时,为新数据腾出空间而采取的处理机制。理解这些策略对优化缓存命中率、减少数据库压力至关重要。以下是详细解释:
一、淘汰策略的分类
Redis 的淘汰策略可按是否筛选过期键和具体淘汰规则分为两大类,共 8 种策略(Redis 6.0+):
- 仅淘汰设置了过期时间的键(volatile-*)
volatile-lru:从已设置过期时间的键中,淘汰最近最少使用(Least Recently Used) 的键。
示例:缓存中存在 1 小时前访问的商品 A(过期时间 2 小时)和 10 分钟前访问的商品 B(过期时间 2 小时),新增数据时优先淘汰商品 A。
volatile-lfu:从已设置过期时间的键中,淘汰最近最少频率使用(Least Frequently Used) 的键(基于访问次数统计)。
示例:商品 C 每天被访问 10 次,商品 D 每天被访问 2 次,优先淘汰商品 D。
volatile-ttl:从已设置过期时间的键中,淘汰剩余过期时间最短(Time To Live) 的键。
示例:商品 E 剩余 10 分钟过期,商品 F 剩余 1 小时过期,优先淘汰商品 E。
volatile-random:从已设置过期时间的键中,随机淘汰一个键。 - 淘汰所有键(包括未设置过期时间的键,allkeys-*)
allkeys-lru:从所有键(无论是否设置过期时间)中,淘汰最近最少使用的键。
适用场景:缓存的键访问频率差异大(如热门商品和冷门商品)。
allkeys-lfu:从所有键中,淘汰最近最少频率使用的键。
适用场景:需要区分访问频率(如高频访问的活动页和低频访问的历史页)。
allkeys-random:从所有键中,随机淘汰一个键。
适用场景:键的访问概率接近随机(如随机推荐的临时数据)。 - 不淘汰键(特殊策略)
noeviction:默认策略,当内存不足时,拒绝写入新数据,并返回错误(OOM command not allowed when used memory > 'maxmemory')。
风险:可能导致业务写入失败,适用于不允许数据丢失的场景(需配合其他机制如内存扩容)。
二、策略选择的核心依据
键的过期时间设置:
若部分键需要长期缓存(如基础配置),部分键可过期(如临时数据),优先选择volatile-策略,避免误淘汰长期缓存的键。
若所有键都是临时缓存(如会话数据),可选择allkeys-策略。
访问模式:
访问频率有明显差异(如热门商品):用lru或lfu(lfu更适合区分 “偶尔高频” 和 “持续高频”)。
访问随机(如随机生成的临时 ID):用random。
需优先保留即将过期的临时数据:用volatile-ttl。