温馨提示×

为何CentOS Redis内存溢出

小樊
42
2026-08-03 14:10:39
栏目: 云计算

CentOS 上 Redis 出现内存溢出(OOM),通常不是单一原因,而是 系统内存不足 + Redis 配置 + 使用方式 共同导致的。下面从 常见原因 → 排查思路 → 解决方案 详细说明。


一、Redis 内存溢出的常见原因

1️⃣ Redis 本身数据量过大

  • key 数量过多
  • 单个 value 过大(如大 hash、大 list、大 string)
  • 没有设置过期时间(TTL)

✅ 查看内存使用:

redis-cli info memory

重点关注:

  • used_memory
  • used_memory_human
  • used_memory_peak

2️⃣ 未配置最大内存限制(最常见)

如果 没有设置 maxmemory,Redis 会一直吃内存,直到系统内存耗尽。

redis-cli config get maxmemory

如果返回:

maxmemory 0

说明 没有限制内存


3️⃣ 淘汰策略不合理或未设置

即使设置了 maxmemory,但淘汰策略不当,也可能导致问题。

redis-cli config get maxmemory-policy

常见策略:

策略 说明
noeviction 不淘汰(写满就报错)❌
allkeys-lru 全局 LRU ✅
volatile-lru 只淘汰有过期时间的 key
allkeys-random 随机淘汰

4️⃣ CentOS 系统内存不足(OOM Killer)

当系统内存 + swap 耗尽时,Linux OOM Killer 会杀掉 Redis

查看是否被系统杀掉:

dmesg | grep -i oom

或:

journalctl -k | grep -i oom

如果看到类似:

Out of memory: Kill process 1234 (redis-server)

说明是 系统级 OOM


5️⃣ Redis 持久化导致内存翻倍

  • RDB fork 子进程
  • AOF rewrite

fork 时:

  • 使用 写时复制(COW)
  • 如果写操作多,内存可能瞬间暴涨

查看:

redis-cli info persistence

6️⃣ 内存碎片问题

长时间运行后,Redis 可能出现内存碎片。

redis-cli info memory | grep fragmentation

mem_fragmentation_ratio > 1.5
说明碎片较严重。


7️⃣ CentOS 内存被其他进程占用

常见“背锅侠”:

  • Java 应用
  • MySQL
  • Elasticsearch
  • Docker 容器

查看内存使用:

free -h
top
htop

二、快速排查步骤(推荐顺序)

✅ 1. 看 Redis 用了多少内存

redis-cli info memory

✅ 2. 看是否设置最大内存

redis-cli config get maxmemory

✅ 3. 看系统是否被 OOM

dmesg | grep -i oom

✅ 4. 看 Redis 日志

tail -n 100 /var/log/redis/redis.log

✅ 5. 看是否有大 key

redis-cli --bigkeys

三、解决方案(按优先级)

✅ 1. 设置 Redis 最大内存(必须)

maxmemory 4gb
maxmemory-policy allkeys-lru

永久生效:

vim /etc/redis.conf
maxmemory 4gb
maxmemory-policy allkeys-lru

✅ 2. 给大 key 设置过期时间

EXPIRE key 3600

✅ 3. 拆分大 key

  • hash → 拆成多个 hash
  • list → 分页
  • string → 压缩或拆分

✅ 4. 关闭或优化持久化(视业务)

save ""
appendonly no

⚠️ 仅限缓存场景


✅ 5. 调整 CentOS 内核参数

避免 OOM Killer 优先杀 Redis:

echo -17 > /proc/$(pidof redis-server)/oom_adj

或 systemd 下:

OOMScoreAdjust=-1000

✅ 6. 升级 Redis / 启用内存碎片整理

Redis 4.0+ 支持:

activedefrag yes

四、典型真实案例

现象:Redis 运行一段时间就被杀
原因maxmemory=0 + 数据无限增长 + 系统内存 8G
解决:设置 maxmemory 6gb + allkeys-lru


五、总结一句话

CentOS 上 Redis 内存溢出,90% 是因为没限制 maxmemory,或系统内存被吃光。

如果你愿意,可以把下面信息发我,我可以帮你精准分析:

  • Redis 版本
  • used_memory / maxmemory
  • 是否开启 RDB / AOF
  • 服务器内存大小
  • 是否被 OOM Killer 杀掉

0