Redis 提供 8 种内存淘汰策略,以下是详细解析及场景建议:
一、核心策略解析
noeviction (默认策略)
- 机制:内存满时拒绝新写入操作,返回错误
- 优势:绝对数据安全
- 场景:金融交易系统、医疗数据存储
allkeys-lru (推荐通用策略)
- 机制:全局淘汰最久未使用的键
- 优势:自动识别冷热数据
- 场景:电商商品缓存、新闻资讯系统
volatile-lru
- 机制:仅淘汰带过期时间的LRU键
- 优势:保护持久化数据
- 场景:会话缓存 + 持久化数据混合存储
allkeys-random
- 机制:随机淘汰任意键
- 优势:简单高效
- 场景:临时数据缓存、压力测试环境
volatile-random
- 机制:随机淘汰带过期时间的键
- 优势:有限范围内的随机淘汰
- 场景:定时刷新缓存池
二、特殊场景策略
volatile-ttl
- 机制:优先淘汰最快过期的键
- 优势:精确控制数据生命周期
- 场景:限时抢购库存缓存、验证码存储
allkeys-lfu (4.0+)
- 机制:淘汰使用频率最低的键
- 优势:长期保留高频数据
- 场景:用户画像数据、热门推荐数据
volatile-lfu (4.0+)
- 机制:淘汰带过期时间的低频键
- 优势:兼顾频率和有效期
- 场景:周期性热点数据缓存
三、配置示例
# 设置最大内存为4GB
maxmemory 4gb
# 使用LFU策略(生产推荐)
maxmemory-policy allkeys-lfu
四、决策树参考
内存敏感型系统 → 选择LFU策略
时间敏感型数据 → 选择TTL策略
数据重要性分层 → 使用volatile系列
突发流量防护 → 使用allkeys-random
注:LFU策略需Redis 4.0+版本支持,建议生产环境优先使用LFU系列策略,可通过OBJECT FREQ
命令实时监控键访问频率。
过期键删除策略
Redis 的过期键删除策略主要有两种,配合内存淘汰机制共同管理键生命周期:
1. 惰性删除(被动删除)
实现原理:
当客户端访问某个键时,Redis 会先检查该键是否已过期。如果过期则立即删除,否则返回数据。
优势:
- 节省 CPU 资源(只在访问时检查)
- 对正常读写无性能影响
适用场景:
- 过期键被频繁访问的场景
- 对内存占用不敏感的长期运行系统
2. 定期删除(主动删除)
实现原理:
Redis 以固定频率(默认每秒 10 次)随机扫描设置了过期时间的键:
- 从过期字典中随机抽取 20 个键
- 删除其中已过期的键
- 如果过期的键比例超过 25%,重复步骤 1
优势:
- 主动释放内存空间
- 减少内存泄漏风险
适用场景:
- 存在大量长期不访问的过期键
- 对内存敏感需要主动清理的场景
3. 内存淘汰机制(补充策略)
当内存达到 maxmemory
限制时,Redis 会根据配置执行淘汰策略,常用策略包括:
volatile-lru
:淘汰最近最少使用的过期键volatile-ttl
:淘汰剩余存活时间最短的键allkeys-lru
:淘汰整个数据集中的最近最少使用键
策略组合:
Redis 默认采用 惰性删除 + 定期删除 组合策略,配合内存淘汰机制形成三级防御:
- 定期删除主动清理大部分过期键
- 惰性删除处理漏网之鱼
- 内存淘汰机制兜底防止内存溢出