必须同时设置maxmemory和maxmemory-policy noeviction;仅设maxmemory不触发淘汰,Redis持续写入致RSS爆满被OOM Killer终止,且单位错误(如2g)、拼写错误或未显式配置均导致策略失效。

必须同时设置 maxmemory 和 maxmemory-policy noeviction,缺一不可;只设一个、拼写错误(如 no-eviction、NoEviction)或单位不明确,Redis 仍可能被系统 OOM Killer 杀掉。
为什么只配 maxmemory 还会 OOM
maxmemory 不是保险丝,只是淘汰策略的触发开关。没配 maxmemory-policy,或配错,Redis 就不会启动内存淘汰逻辑,而是继续接收写入,直到 RSS 内存爆满,Linux 直接用 OOM Killer 终止进程。
- Redis 7.x 默认策略确实是
noeviction,但“默认”不等于“生效”——你没显式声明,就等于把行为交给版本和配置加载顺序,不可控 -
maxmemory 2g是非法写法:单位必须是kb/mb/gb,g或m会被忽略,实际变成maxmemory 2字节,一写就报 OOM - 执行
redis-cli CONFIG GET maxmemory-policy必须返回noeviction(全小写、无空格),否则策略未生效
怎么让 maxmemory 和 maxmemory-policy 真正落地
运行时 CONFIG SET 只影响当前实例,重启即丢。生产环境必须落盘且验证。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 编辑
redis.conf,在 MEMORY LIMIT 区块添加两行(顺序无关):maxmemory 2gbmaxmemory-policy noeviction - 改完别直接重启,先执行
redis-cli CONFIG REWRITE—— 它会安全重写配置文件,保留注释,自动清理无效行 - 重启前用
redis-cli SHUTDOWN SAVE确保 RDB 持久化完成,避免数据丢失 - 重启后立刻验证:
redis-cli CONFIG GET maxmemory和CONFIG GET maxmemory-policy,再跑INFO memory | grep used_memory看是否在预期范围内
应用层怎么正确响应 noeviction 触发的 OOM 错误
启用 noeviction 后,写命令失败不是网络异常,而是 Redis 主动拒绝,返回标准错误:(error) OOM command not allowed when used memory > 'maxmemory'。
- 这个错误必须由业务代码捕获并处理,不能静默吞掉或当连接超时重试
- 常见误操作:
SET config:timeout "30" EX 3600带了EX,本质是 volatile key ——noeviction不管过期,TTL 到点照样删,配置还是会丢 - 真正防丢配置,得用独立实例 +
noeviction+ 不带 TTL 的写法(如SET config:timeout "30"),再加监控used_memory增长趋势 - 某些客户端(如 Lettuce)在连接池满时可能丢弃命令,看起来像“没写进去”,其实根本没发到 Redis,得查客户端日志而非只盯 Redis 错误
最常被忽略的一点:容器或 cgroup 的内存限制如果紧贴 maxmemory,Redis 在自身淘汰机制起作用前,就会被宿主机 OOM Killer 先杀掉。预留至少 20% 内存给 fork、复制积压缓冲、客户端输出缓冲和系统开销,才是真实可用的安全水位。

















