首页/数据/数据库速查/8 种淘汰策略(maxmemory-policy)
Redis 运维与场景124 条

8 种淘汰策略(maxmemory-policy)

常用三条线:不淘汰(noeviction)、在所有键里淘汰(allkeys-*)、只在设过期的键里淘汰(volatile-*);LRU/LFU/random/ttl 决定选谁。

数据库速查数据更新于 2026-10-13

淘汰策略怎么选

内存淘汰策略决定实例达到内存上限后怎么腾空间。策略分三条主线:不淘汰(写满直接报错)、在所有键里淘汰、只在设过过期的键里淘汰;挑选依据又分最近最少使用、访问频率最低、随机与剩余时间最短几种。纯缓存场景适合在所有键里淘汰,而缓存与持久数据混布时应该用只在过期键里淘汰的策略,否则持久数据也可能被当成缓存删掉。

基本信息

用途内存达到上限后决定淘汰哪些键
三条主线不淘汰、在所有键里淘汰、只在设过过期的键里淘汰
挑选依据最近最少使用、访问频率最低、随机、剩余时间最短
纯缓存建议在所有键里淘汰
混布建议只在设过过期的键里淘汰,避免误删持久数据
相关参数内存上限、淘汰策略、淘汰采样数

典型使用场景

  • 纯缓存实例:允许任何键被淘汰,优先保证新数据能写进来
  • 缓存与持久数据混布:只淘汰有保质期的键,保护持久数据
  • 会话类数据:配合过期时间,按剩余时间最短优先淘汰
  • 热点明显的业务:用访问频率低的策略保留高频数据
  • 内存告警排查:确认当前策略与业务预期是否一致

设置与查看

设置与查看
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   # 设置内存上限,淘汰策略才有机会生效
淘汰速率突然上升说明内存水位已经顶到上限:此时命中率下降、回源压力上升,要先确认是流量增长还是键没有过期,再决定扩容还是调整过期策略。

易错点

  • 混布场景使用所有键淘汰:没有过期时间的持久数据同样会被删除,数据直接丢失
  • 用了只在过期键淘汰的策略但多数键没有过期:内存打满后写入依然失败
  • 纯缓存实例用不淘汰策略:写满即报错,压力全部回源到数据库
  • 只设内存上限不设淘汰策略:上限一到就按默认策略处理,与业务预期可能完全不符

数据来源与参考

  • Redis 官方文档: maxmemory-policy
  • Redis 官方文档: 键淘汰

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌