必须先设置maxmemory再配置maxmemory-policy,否则淘汰机制不生效;maxmemory默认为0(无限制),需显式配置如maxmemory 2gb,且maxmemory-policy仅在maxmemory>0时生效,常用策略包括allkeys-lru、volatile-lru、allkeys-lfu和noeviction等。

Redis 要启用内存淘汰机制,必须先设置最大内存限制(maxmemory),再指定淘汰策略(maxmemory-policy。两者缺一不可,否则即使配了策略也不会触发淘汰。
设置最大内存限制
Redis 默认不限制内存使用(maxmemory 0),不设上限可能导致 OOM 被系统杀掉。必须显式配置:
- 在
redis.conf中取消注释并修改:maxmemory 2gb(支持单位:b/kb/mb/gb/tb) - 或运行时临时设置:
redis-cli CONFIG SET maxmemory 2gb - 注意:若 Redis 启用了主从复制,需为复制缓冲区预留空间,建议设为容器或系统内存的 70%~80%,避免 fork 时因 COW 内存不足触发 OOM
选择并配置淘汰策略
仅当 maxmemory > 0 时,maxmemory-policy 才生效。常用策略及适用场景如下:
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
- allkeys-lru:从所有 key 中淘汰最近最少使用的。适合通用缓存,热点数据保留效果好
- volatile-lru:只淘汰设置了 TTL 的 key。但若 60% 以上 key 没设过期时间,该策略实际无法释放内存,会退化为写失败
- allkeys-lfu:按访问频次淘汰,对长尾访问波动大的场景更稳定(Redis 4.0+)
- noeviction:默认策略,内存满时直接拒绝写入(返回 OOM 错误)。适合强一致性要求、不允许丢数据的场景
配置方式:
- 配置文件中:
maxmemory-policy allkeys-lru - 运行时设置:
redis-cli CONFIG SET maxmemory-policy allkeys-lru
验证配置是否生效
执行以下命令确认当前值:
redis-cli CONFIG GET maxmemoryredis-cli CONFIG GET maxmemory-policy- 观察
INFO memory中的maxmemory、used_memory、mem_fragmentation_ratio和evicted_keys计数器是否随压力上升而增加
避坑提醒
真实运维中容易忽略的关键点:
- 别只盯
used_memory,还要看mem_fragmentation_ratio(>1.4 表示 jemalloc 碎片高)、rss(实际物理内存占用) - 大 key 删除用
UNLINK替代DEL,避免主线程阻塞 - 容量规划要包含字典开销(key 名长度、数量)、过期字典、复制缓冲区等隐性内存消耗,不能只算 value 大小
- 容器部署时,
maxmemory必须低于容器 limit,留出至少 20% 余量给 fork、AOF rewrite 等瞬时内存峰值

















