← 中文资源

简体中文版本

Redis — OOM command not allowed

通过检查 maxmemory、淘汰策略、大 key 和碎片率诊断 Redis 内存耗尽,然后有意识地选择扩容或淘汰。

阅读英文原文

策略决定到达上限后的行为

Redis 按 maxmemory-policy 执行 maxmemory。使用 noeviction 时,需要更多内存的写入会以 OOM command not allowed 失败;使用 LRU 或 TTL 策略时,Redis 淘汰 key 腾出空间。两种行为都不是普遍正确的,取决于数据是缓存还是持久存储。

redis-cli INFO memory | grep -E 'used_memory_human|maxmemory_human'
redis-cli CONFIG GET maxmemory-policy

区分缓存与持久数据

会话、队列和锁不应与会随意淘汰 key 的缓存共享实例。使用独立实例或带明确策略的数据库。缓存可以承受 allkeys-lru,队列不行。给缓存 key 设置 TTL,即使没有压力也能回收内存。

找到增长点

--bigkeys 采样键空间并按类型报告最大 key。单个大 hash 或 list 可能比成千上万小 key 占用更多内存。拆分、设置过期,或迁移到适合大值的存储。检查 mem_fragmentation_ratio;碎片率高可能需要重启或分配器调优,而不只是加内存。

留有余量地验证

把限制设在主机或容器限制之下,压测到峰值,确认缓存按预期淘汰,而持久写入不会静默失败。对内存百分比和淘汰速率告警。移除 maxmemory 不是修复;它把可控的写入错误变成不可预测的主机故障。