Redis内存淘汰策略
1)内存淘汰触发条件
当Redis内存使用量达到maxmemory配置阈值时触发淘汰机制(默认关闭,需主动设置maxmemory参数)
2)8种核心淘汰策略
①noeviction(默认策略)
机制:拒绝所有写入操作(DEL等删除操作仍允许),返回OOM错误。
场景:数据不可丢失的持久化存储场景
命令:maxmemory-policy noeviction
②allkeys-lru(生产常用)
机制:从所有key中淘汰最近最少使用的键(Least Recently Used)
实现:近似LRU算法(随机采样5个key淘汰最旧)
场景:缓存系统、热点数据分布明显场景
命令:maxmemory-policy allkeys-lru
③volatile-lru
机制:仅从设置过期时间的key中淘汰LRU键
注意:若无过期时间key,退化为noeviction
场景:混合持久化+缓存场景
④allkeys-random
机制:随机淘汰任意键
特点:性能最佳但可能误删热点数据
场景:无明确访问模式或数据均匀分布场景
⑤volatile-random
机制:随机淘汰有过期时间的键
场景:需保留永久key的临时数据存储
⑥volatile-ttl
机制:优先淘汰剩余存活时间最短的键(TTL越小优先级越高)
场景:时效性敏感数据(如验证码、临时会话)
⑦allkeys-lfu(Redis 4.0+)
机制:淘汰访问频率最低的键(Least Frequently Used)
实现:基于频率的衰减计数器
场景:长尾访问分布、热点数据识别
命令:maxmemory-policy allkeys-lfu
⑧volatile-lfu
机制:仅淘汰有过期时间的LFU键
场景:需要LFU算法但需保留永久key的场景
3)策略对比表
|
策略 |
作用范围 |
算法类型 |
版本要求 |
适用场景 |
|
noeviction |
不淘汰 |
- |
所有版本 |
数据持久化 |
|
allkeys-lru |
所有key |
近似LRU |
>=2.8 |
常规缓存 |
|
volatile-lru |
带过期时间key |
近似LRU |
>=2.8 |
混合存储 |
|
allkeys-random |
所有key |
随机 |
>=2.8 |
快速淘汰 |
|
volatile-random |
带过期时间key |
随机 |
>=2.8 |
临时数据存储 |
|
volatile-ttl |
带过期时间key |
TTL排序 |
>=2.8 |
时效敏感数据 |
|
allkeys-lfu |
所有key |
精确LFU |
>=4.0 |
热点数据识别 |
|
volatile-lfu |
带过期时间key |
精确LFU |
>=4.0 |
临时热点数据 |
4)配置建议
①缓存场景
优先选择allkeys-lru或allkeys-lfu
示例配置:

②混合存储场景
使用volatile-lru + 关键数据不设过期时间
示例配置:

③高频更新场景
使用allkeys-lfu避免热点数据被误删
调整LFU衰减系数(默认lfu-decay-time 1):

5)高级优化技巧
①内存碎片控制
启用activedefrag yes自动内存碎片整理
监控指标:mem_fragmentation_ratio > 1.5时需干预
②淘汰策略监控
关键指标

③混合策略实现
通过多个Redis实例分片,不同实例采用不同淘汰策略:

6)注意事项
①LRU精度与性能平衡
调整采样数量(默认5):

②LFU计数器衰减
lfu-log-factor控制计数器增长速度(范围0-100)
lfu-decay-time控制计数器衰减速度(单位分钟)
③持久化影响
RDB/AOF持久化时,fork操作会占用额外内存,建议预留20%内存空间
根据数据访问模式和业务需求选择合适的策略,通常生产环境推荐allkeys-lru或allkeys-lfu,配合监控指标动态调整参数。
本文来自博客园,作者:it-小林,转载请注明原文链接:https://www.cnblogs.com/linruitao/p/18820197

浙公网安备 33010602011771号