必须显式配置maxmemory和maxmemory-policy noeviction才能使Redis内存满时拒绝写入;仅设其一无效,需在redis.conf中持久化配置并验证生效,应用层须捕获OOM错误并降级处理。

要让 Redis 在内存满时强制拒绝写入、把失败明确暴露给应用层,必须显式配置 maxmemory-policy noeviction。它不是默认“保险”选项,而是需要你主动声明的硬性保护策略。
必须同时设置 maxmemory 和 noeviction
只设 maxmemory 不生效;只设 noeviction 但没配 maxmemory(或设为 0)也不触发。两者缺一不可:
-
maxmemory要设具体值,例如2gb、1024mb,单位支持b/kb/mb/gb -
maxmemory-policy必须是 noeviction(全小写、无空格、拼写精确) - 不推荐依赖版本默认值:Redis 4.0+ 默认是
noeviction,但低版本是volatile-lru,显式配置才可靠
配置方式与持久化要点
临时生效可用 CONFIG SET,但重启即失效;生产环境务必写入配置文件并持久化:
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 在
redis.conf中添加两行:
maxmemory 2gb
maxmemory-policy noeviction - 修改后执行
redis-cli CONFIG REWRITE,自动重写配置文件并生效
(比手动改 conf + 重启更安全,避免遗漏) - 验证是否生效:
redis-cli CONFIG GET maxmemory-policy应返回noeviction
识别和处理写失败异常
启用后,所有写命令(SET、HSET、LPUSH 等)在内存超限时会返回标准错误:
- 错误内容为:
(error) OOM command not allowed when used memory > 'maxmemory' - 客户端不能忽略该错误——例如 Python 的 redis-py 抛
ResponseError,Node.js 的 ioredis 抛ReplyError,message 字段含上述字符串 - 应用层需主动捕获、记录、告警,并执行降级逻辑(如切只读、走 DB 回源、限流等)
- 监控应关注该错误的出现频次,而非仅盯
evicted_keys(它在noeviction下恒为 0)
配套保障措施
noeviction 是“拒绝写入”,不是“内存绝对安全”。真实内存占用可能远超 maxmemory:
-
used_memory不统计 Lua 脚本内存、客户端输出缓冲区、AOF rewrite 子进程内存 - 建议将
maxmemory设为机器总内存的 45%–60%,预留空间给这些隐性开销 - 用
INFO clients查client_longest_output_list和client_biggest_input_buf,防输出缓冲区积压 - 定期运行
redis-cli memory doctor,排查 bigkey、slave buffer 堆积等“假满”原因

















