redis内存满时不会自动释放,必须同时配置maxmemory和maxmemory-policy才能启用淘汰机制;仅设其一或都不设将导致oom或写入失败。

Redis 内存满时不会自动释放空间,必须提前配置 maxmemory 和 maxmemory-policy 才能触发淘汰行为。没设 maxmemory,Redis 会持续占用内存,直到被系统 OOM Killer 杀掉;只设了 maxmemory 却没配策略,它就用默认的 noeviction——写操作直接报错。
怎么开启淘汰机制
必须同时满足两个条件:
- 设置内存上限(
maxmemory) - 指定淘汰策略(
maxmemory-policy)
两者缺一不可。例如,即使你选了 allkeys-lru,但没设 maxmemory,Redis 根本不会启动淘汰逻辑。
配置方式有两种
永久生效:改 redis.conf 文件
打开配置文件,取消注释或添加两行:
maxmemory 2gb
maxmemory-policy allkeys-lru
保存后重启 Redis 生效。-
临时生效:运行时用命令设置
redis-cli CONFIG SET maxmemory 2gb redis-cli CONFIG SET maxmemory-policy allkeys-lru
这种改法立即起作用,但重启后丢失。适合快速验证或紧急调整。
八种淘汰策略怎么选
不淘汰数据
noeviction:写入失败报 OOM,读正常。适合金融类强一致性场景,但需业务自己兜底。从所有 key 中淘汰(不管有没有过期时间)
allkeys-lru:按最近访问时间,淘汰最久没用的。缓存系统首选,适配“二八定律”。allkeys-lfu:按访问频次,淘汰最少被访问的。比 LRU 更稳,适合长期热点明确的场景(如商品详情页)。allkeys-random:纯随机删。测试环境可用,生产慎用。只淘汰带过期时间的 key(volatile 系列)
volatile-lru/volatile-lfu:适用于部分 key 是永久存储(如配置)、部分是临时缓存(如 session)的混合场景。volatile-random:简单随机删带 TTL 的 key。volatile-ttl:优先删马上要过期的 key。适合 TTL 设置较集中的缓存,比如验证码、临时 token。
注意:如果用了 volatile-* 类策略,但大部分 key 没设过期时间,那实际可能一个都淘汰不了,最后还是触发 noeviction 效果——写失败。线上曾有案例因 60% key 无 TTL,volatile-lru 形同虚设。
检查和验证是否生效
运行以下命令确认当前配置:
redis-cli CONFIG GET maxmemory redis-cli CONFIG GET maxmemory-policy
再用 INFO memory 查看实时内存使用情况,重点关注 used_memory, mem_fragmentation_ratio, evicted_keys(该值递增说明淘汰已在工作)。
不复杂但容易忽略











