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,配合监控指标动态调整参数。

posted @ 2025-04-11 10:52  it-小林  阅读(351)  评论(0)    收藏  举报