淘汰策略怎么挑
淘汰策略决定内存达到上限时删谁、以及允不允许删。纯缓存实例用 allkeys 系最直接,LRU 与 LFU 二选一即可;缓存与持久数据混部时用 volatile 系,前提是缓存键必须都带过期时间;不允许丢数据的实例用不淘汰策略并配套容量告警,把溢出变成明确的写入报错,而不是悄悄丢数据。
基本信息
| 纯缓存 | allkeys 系,全部键都可能被淘汰 |
|---|---|
| 混部场景 | volatile 系,仅淘汰带过期时间的键 |
| 不允许淘汰 | 不淘汰策略,内存满时写命令直接报错 |
| 选择依据 | 键是否都带过期时间、数据能否重建 |
| 验证方式 | 结合键数量与淘汰计数观察实际效果 |
典型使用场景
- 新建缓存实例时确定淘汰策略作为容量保护的兜底
- 缓存与业务数据混部在同一实例,需要防止业务数据被淘汰
- 热点集中且访问频次分化明显,用 LFU 提升命中率
- 核心账务类数据不允许丢失,用不淘汰策略加告警
- 排查集中淘汰把业务数据删掉的问题,回到策略选择本身
查看与设置
查看与设置
redis-cli CONFIG GET maxmemory-policy maxmemory
redis-cli CONFIG SET maxmemory-policy allkeys-lfu # 纯缓存,热点集中
redis-cli CONFIG SET maxmemory-policy noeviction # 不允许丢数据,改为报错
redis-cli INFO stats | grep -E 'evicted_keys|expired_keys' # 观察实际淘汰活动
redis-cli CONFIG REWRITE策略速查
| 策略 | 淘汰范围 | 适用场景 |
|---|---|---|
| allkeys-lru | 全部键,按最近使用 | 通用缓存,实现简单效果稳定 |
| allkeys-lfu | 全部键,按访问频率 | 热点集中、频次分化明显的缓存 |
| volatile-lru 等 | 仅带过期时间的键 | 缓存与持久数据混部 |
| noeviction | 不淘汰,写请求报错 | 不允许丢数据的核心数据 |
热点集中且访问频次差异明显时 LFU 的命中率通常更好,其余场景 LRU 已经足够稳,切换前最好用真实流量验证。
选择混部策略的前提是缓存键全部带过期时间:一旦有缓存键忘了设过期时间,它就不会被淘汰,内存仍会被占满。