redis-memory-full

Redis 内存打满的定位与修复

现象

写入报 OOM command not allowed when used memory > 'maxmemory',或大量 key 被淘汰、延迟升高。INFO memory 显示 used_memory 接近上限。

快速定位

redis-cli INFO memory
redis-cli INFO stats | grep -E 'evicted_keys|expired_keys'
redis-cli CONFIG GET maxmemory
redis-cli CONFIG GET maxmemory-policy
redis-cli --bigkeys
redis-cli MEMORY USAGE <key>
redis-cli --scan --pattern 'session:*' | head

常见根因

  1. 未设置 maxmemory,内存无限增长。
  2. 淘汰策略不合适,写满后拒绝写入或误删重要 key。
  3. 大 key(超大 hash/list/set)占用异常。
  4. key 没有 TTL,历史数据长期堆积。
  5. 内存碎片、复制缓冲区或客户端输出缓冲区占用。

修复

相关命令

读完自测

合上页面,先回答,再展开对照。

  1. 写入报 OOM command not allowed 的直接原因是什么?
  2. 如何定位异常的大 key?
  3. 设置 maxmemory-policy 时要注意什么?
答案
  1. used_memory 已达到 maxmemory,且当前策略不允许继续写入或淘汰。可结合 INFO memory 和 CONFIG GET maxmemory-policy 判断。
  2. 用 redis-cli --bigkeys 找大 key。再用 MEMORY USAGE <key> 确认单个 key 的占用。
  3. 要按业务选择策略,如 allkeys-lru 或 volatile-ttl。不合适的策略会拒绝写入或误删重要 key,缓存 key 还应设置 TTL。