淘汰策略怎么选
内存淘汰策略决定实例达到内存上限后怎么腾空间。策略分三条主线:不淘汰(写满直接报错)、在所有键里淘汰、只在设过过期的键里淘汰;挑选依据又分最近最少使用、访问频率最低、随机与剩余时间最短几种。纯缓存场景适合在所有键里淘汰,而缓存与持久数据混布时应该用只在过期键里淘汰的策略,否则持久数据也可能被当成缓存删掉。
基本信息
| 用途 | 内存达到上限后决定淘汰哪些键 |
|---|---|
| 三条主线 | 不淘汰、在所有键里淘汰、只在设过过期的键里淘汰 |
| 挑选依据 | 最近最少使用、访问频率最低、随机、剩余时间最短 |
| 纯缓存建议 | 在所有键里淘汰 |
| 混布建议 | 只在设过过期的键里淘汰,避免误删持久数据 |
| 相关参数 | 内存上限、淘汰策略、淘汰采样数 |
典型使用场景
- 纯缓存实例:允许任何键被淘汰,优先保证新数据能写进来
- 缓存与持久数据混布:只淘汰有保质期的键,保护持久数据
- 会话类数据:配合过期时间,按剩余时间最短优先淘汰
- 热点明显的业务:用访问频率低的策略保留高频数据
- 内存告警排查:确认当前策略与业务预期是否一致
设置与查看
设置与查看
CONFIG GET maxmemory-policy # 查看当前策略
CONFIG SET maxmemory-policy allkeys-lru # 纯缓存:在所有键中淘汰最久未使用的
CONFIG SET maxmemory-policy volatile-lru # 混布:只在设过过期时间的键中淘汰
INFO memory # 观察已用内存与内存上限策略对照
| 策略 | 淘汰范围 | 适用场景 |
|---|---|---|
| 不淘汰 | 不淘汰,写满即报错 | 不允许丢数据的场景 |
| 所有键最近最少使用 | 全部键 | 纯缓存,最常用的选择 |
| 所有键访问频率最低 | 全部键 | 热点集中且访问频率差异明显 |
| 所有键随机 | 全部键 | 访问分布均匀、没有热点 |
| 过期键最近最少使用 | 仅设过期的键 | 缓存与持久数据混布 |
| 过期键访问频率最低 | 仅设过期的键 | 混布且热点明显 |
| 过期键剩余时间最短 | 仅设过期的键 | 希望尽快回收即将到期的数据 |
只在过期键里淘汰的策略有个陷阱:如果大量键根本没设过期时间,内存打满之后写入依然会失败,纯缓存场景直接用所有键淘汰的策略更省心。
把不淘汰策略用在纯缓存实例上:内存写满后写入直接报错,缓存回源压力瞬间转移到数据库,容易引发连锁故障。
淘汰配置检查清单
- 确认实例承载的是纯缓存还是含持久数据
- 为缓存键统一设置过期时间
- 内存上限与淘汰策略配套设置,缺一不可
- 监控淘汰速率与内存水位变化
- 变更策略前评估对命中率的影响
淘汰策略生效的前提是设置了内存上限:没有上限时实例会一直占用内存直到被系统终止,此时再有策略也没机会执行。
内存与淘汰观测
内存与淘汰观测
INFO memory # 关注已用内存、内存上限与碎片率
INFO stats # 关注被淘汰的键数量
CONFIG SET maxmemory 4gb # 设置内存上限,淘汰策略才有机会生效淘汰速率突然上升说明内存水位已经顶到上限:此时命中率下降、回源压力上升,要先确认是流量增长还是键没有过期,再决定扩容还是调整过期策略。