CONFIG SET maxmemory可临时缓解OOM但非长久之计,需确认权限、实例状态及系统内存,设后不持久且不自动驱逐旧key,须配合适当驱逐策略并监控evicted_keys。
能临时救,但不是长久之计——CONFIG SET maxmemory 可以立刻缓解 OOM 报错,前提是 Redis 实例没被操作系统 kill,且你有 CONFIG 权限。
为什么 CONFIG SET maxmemory 有时根本执行不了
常见错误现象:ERR unknown command 'CONFIG' 或 ERR Permission denied。这通常是因为:
- Redis 启动时加了
--protected-mode yes(默认开启),且未配置bind或requirepass,导致本地以外连接被拒绝 - 用户权限受限:6.0+ 版本启用了 ACL,当前用户没被授予
config类命令权限(如缺少+config或+@admin) - 实例已进入严重 OOM 状态,连命令解析都失败,此时
redis-cli连上去直接断连或超时
执行前必须确认的三件事
别急着敲命令,先验证基础状态:
- 用
redis-cli -h host -p port -a password INFO memory查看当前used_memory_human和maxmemory,确认是否真卡在内存上限(而非碎片率高、客户端缓冲区爆满等伪 OOM) - 检查系统剩余内存:
free -h,如果物理内存只剩几百 MB,放大maxmemory只会让 Redis 更快被 OOM Killer 干掉 - 确认 Redis 是 standalone 模式还是集群:集群中每个 node 的
maxmemory需单独设置,且不能超过节点所在机器的可用内存余量
CONFIG SET maxmemory 的实操要点
参数差异和副作用比想象中多:
-
maxmemory值必须是整数,单位是字节;写2gb会报错,得写2147483648或2g(注意是小写g,大写不识别) - 设完后不会立即释放内存,只是放宽准入门槛;已有 key 不会被自动驱逐,新写入/更新才触发 LRU/LFU 策略(取决于
maxmemory-policy) - 如果原策略是
noeviction,改大内存后仍需手动切到allkeys-lru等可驱逐策略,否则新写入继续报OOM command not allowed - 该设置不持久:重启后失效,必须同步改
redis.conf中的maxmemory行,否则下次启动又回到旧值
omegafw.sepis.com.cn
rolexfw.sepis.com.cn
patekfw.sepis.com.cn
omega1.gmcwatch.cn
rolex1.gmcwatch.cn
patek1.gmcwatch.cn
omega1.swatchsh.com
rolex1.swatchsh.com
patek1.swatchsh.com
omegawx.paydyj.com
rolexwx.paydyj.com
patekwx.paydyj.com
omegawx.watchku.com
rolexwx.watchku.com
patekwx.watchku.com
真正危险的信号:什么情况下放大内存反而加速崩溃
性能与兼容性影响常被忽略:
- 当
mem_fragmentation_ratio> 1.5 时,说明内存碎片严重,此时增大maxmemory会加剧碎片,可能引发频繁的malloc失败,报错变成Cannot allocate memory - 主从复制场景下,如果从库
maxmemory设得比主库小,且主库正在做大量写入,从库可能因无法驱逐足够 key 而全量重同步失败 - 使用 RedisJSON 或 RedisSearch 等模块时,它们的内存不计入
used_memory统计,但受同一maxmemory限制,盲目调大可能掩盖模块内存泄漏问题
最易被跳过的动作:改完 maxmemory 后,立刻用 INFO memory 对比 maxmemory 和 used_memory,再盯 2 分钟 evicted_keys 是否上涨——不涨,说明策略没生效或压根没触发驱逐逻辑。