在生产环境中合理配置Redis过期策略是保障系统稳定性和内存效率的关键。以下配置建议基于实战经验,避免理论堆砌,直击核心要点:
一、核心策略配置:惰性删除 + 定期删除(默认已启用)
无需额外配置:Redis默认同时启用惰性删除和定期删除,这是最优组合。
切勿禁用:禁止修改
lazyfree-lazy-expire
为no
(默认yes
),确保异步删除不阻塞主线程。
二、关键参数调优:定期删除的精细化控制
hz
参数(核心调节器)作用:控制后台任务执行频率(包括定期删除),默认值
10
(即每秒执行10次)。生产建议:
常规场景:保持默认
10
。多数业务足够平衡CPU和内存释放速度。高过期键场景(如海量短TTL缓存):若监控发现内存释放延迟明显,可逐步提高至
20-50
。修改方式:
config set hz 20
+ 写入配置文件redis.conf
重要警告:
❌ 禁止盲目调高至
100
!高频扫描会显著增加CPU开销(尤其大实例),可能引发性能抖动。
maxmemory-samples
参数(淘汰策略相关但影响过期)作用:LRU/LFU淘汰策略的采样精度(默认5),不影响过期删除本身。
建议:若使用
allkeys-lru
等策略,可适当提高到10
增加淘汰准确性。
三、内存淘汰策略(maxmemory-policy
):过期的“兜底方案”
当内存达上限(maxmemory
)时,过期策略自动失效,由淘汰策略接管。配置建议:
策略 | 适用场景 | 生产推荐指数 |
---|---|---|
volatile-lru |
只淘汰设置了TTL的键(LRU算法) | ★★★★ |
volatile-ttl |
优先淘汰剩余TTL最短的键 | ★★★☆ |
volatile-lfu |
淘汰使用频率最低的过期键 | ★★★★ (Redis 4.0+) |
allkeys-lru |
淘汰所有键(含未设置TTL的) | ★★★★ (通用型) |
noeviction |
禁止淘汰,写请求返回错误 | ★★ (特殊场景) |
配置建议:
# 修改配置 (临时+永久)
config set maxmemory 16gb # 设置最大内存
config set maxmemory-policy volatile-lfu
config rewrite # 写入配置文件
四、生产环境必须规避的陷阱
内存溢出(OOM)风险
必须设置
maxmemory
(建议物理内存的70-80%)!禁用
noeviction
除非有特殊需求(如只读缓存),否则易引发服务崩溃。
过期键堆积问题
现象:内存持续增长但
expired_keys
计数低。根因:大量键过期后从未被访问(惰性删除未触发),且定期删除采样未命中。
解决方案:
✅ 适当调高hz
(如20
)
✅ 启用active-expire-effort
(Redis 7.0+,默认1,可增至2)提升定期删除强度
BigKey过期引发阻塞
问题:删除大Key(如Hash含百万字段)可能阻塞主线程数秒。
解决方案:
✅ 确认lazyfree-lazy-expire=yes
(默认开启异步删除)
✅ 拆分BigKey,避免单Key过大
五、监控与验证:用数据说话
关键监控指标(通过
INFO
命令获取):expired_keys
:累计过期键删除数量(持续增长正常)evicted_keys
:因内存不足淘汰的键数(>0 需警惕)used_memory
:当前内存使用量(接近maxmemory
告警)expired_stale_perc
:定期删除扫描中过期键占比(>25% 需调高hz
)
主动检测工具:
# 扫描过期键堆积情况 (采样检查) redis-cli --bigkeys | grep -i expired # 内存分析 (RDB工具) redis-rdb-tools dump.rdb --memory-report
六、终极配置建议模板(redis.conf)
# 内存上限 (根据实例调整) maxmemory 16gb # 内存淘汰策略 (Redis 4.0+) maxmemory-policy volatile-lfu # 定期删除基础频率 (默认10,按需调整) hz 10 # 异步删除开关 (必须开启!) lazyfree-lazy-expire yes # Redis 7.0+ 可增加定期删除强度 (可选) # active-expire-effort 2
核心原则:默认配置已优化,调参需谨慎。生产环境每次变更后,务必通过监控观察CPU、内存、QPS波动。