首页/数据/Redis 进阶速查/noeviction 下的 OOM 报错
内存与管理99 条

noeviction 下的 OOM 报错

noeviction 达到 maxmemory 后,写命令返回 OOM command not allowed when used memory > maxmemory,读命令不受影响(可配命令级放行)。

Redis 进阶速查数据更新于 2026-10-13

内存满了会拒绝写入

maxmemory-policy 设为 noeviction 时,内存用满后 Redis 不淘汰任何键,而是直接让写命令失败,报 OOM command not allowed when used memory > maxmemory。读命令默认仍然可用,这个设计的取向是「宁可拒绝写入,也不悄悄丢数据」,所以看到这类报错要当成容量或策略问题处理。

基本信息

典型报错OOM command not allowed when used memory > maxmemory
读命令默认仍可执行
写命令被拒绝,部分命令可按配置放行
相关配置maxmemory、maxmemory-policy

典型使用场景

  • 写接口突然大面积报错,确认是不是服务端内存打满
  • 把 Redis 当存储而非纯缓存时,评估 noeviction 的风险
  • 排查「同一份代码有的实例报错有的不报」
  • 容量评审时确认每个实例当前的淘汰策略
  • 上线前用压测验证内存打满时的行为是否可以接受

定位与确认

定位与确认
# 看当前用量与上限之间的差距
redis-cli INFO memory | grep -E 'used_memory_human|maxmemory_human'
# 确认淘汰策略:noeviction 表示不淘汰、写入直接失败
redis-cli CONFIG GET maxmemory-policy
# 是否已经出现淘汰与拒连
redis-cli INFO stats | grep -E 'evicted_keys|rejected_connections'
# 应急前先看有哪些大键可以评估清理
redis-cli --bigkeys

现象与含义对照

现象含义应对方向
OOM command not allowed达到上限且不允许淘汰扩容、改策略或清理数据
evicted_keys 持续增长已经在按策略淘汰键说明当前是可淘汰策略
used_memory 长期贴近上限容量已到边界提前规划扩容
mem_fragmentation_ratio 偏高碎片挤占可用额度碎片治理或安排重启
maxmemory 偏小上限设置低于业务增长复核实例规格与配置
noeviction 适合不允许丢数据的场景;纯缓存场景通常用 allkeys-lru 之类的策略,让新数据能写得进来,代价是旧键会被淘汰,业务要能接受这一点。
应急时把策略临时改成可淘汰策略,会立刻开始淘汰键;如果这个实例承载的是不能丢的数据,这个操作的破坏力等同于删数据,动手前必须先确认数据属性。

易错点

  • 把写报错当客户端问题排查 → 浪费故障窗口,服务端其实早已打满 → 先看内存用量与淘汰策略
  • 应急时直接清空数据释放空间 → 可能删掉不可再生成的数据,止血变事故 → 只清理确认可再生成的键并留档
  • 为恢复写入把上限设为 0(不限制)→ 内存继续增长,最终被系统 OOM 杀掉,损失更大 → 优先扩容或清理数据
  • 对读写可用性预期不清 → 设计上假设内存满时整个实例不可用 → 明确读仍可用、写会被拒的行为边界

数据来源与参考

  • Redis 官方文档:OOM 行为与错误说明
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌