在 CentOS 上 Redis 出现内存溢出(OOM),通常不是单一原因,而是 系统内存不足 + Redis 配置 + 使用方式 共同导致的。下面从 常见原因 → 排查思路 → 解决方案 详细说明。
✅ 查看内存使用:
redis-cli info memory
重点关注:
used_memoryused_memory_humanused_memory_peak如果 没有设置 maxmemory,Redis 会一直吃内存,直到系统内存耗尽。
redis-cli config get maxmemory
如果返回:
maxmemory 0
说明 没有限制内存
即使设置了 maxmemory,但淘汰策略不当,也可能导致问题。
redis-cli config get maxmemory-policy
常见策略:
| 策略 | 说明 |
|---|---|
| noeviction | 不淘汰(写满就报错)❌ |
| allkeys-lru | 全局 LRU ✅ |
| volatile-lru | 只淘汰有过期时间的 key |
| allkeys-random | 随机淘汰 |
当系统内存 + swap 耗尽时,Linux OOM Killer 会杀掉 Redis。
查看是否被系统杀掉:
dmesg | grep -i oom
或:
journalctl -k | grep -i oom
如果看到类似:
Out of memory: Kill process 1234 (redis-server)
说明是 系统级 OOM
fork 时:
查看:
redis-cli info persistence
长时间运行后,Redis 可能出现内存碎片。
redis-cli info memory | grep fragmentation
mem_fragmentation_ratio > 1.5
说明碎片较严重。
常见“背锅侠”:
查看内存使用:
free -h
top
htop
redis-cli info memory
redis-cli config get maxmemory
dmesg | grep -i oom
tail -n 100 /var/log/redis/redis.log
redis-cli --bigkeys
maxmemory 4gb
maxmemory-policy allkeys-lru
永久生效:
vim /etc/redis.conf
maxmemory 4gb
maxmemory-policy allkeys-lru
EXPIRE key 3600
save ""
appendonly no
⚠️ 仅限缓存场景
避免 OOM Killer 优先杀 Redis:
echo -17 > /proc/$(pidof redis-server)/oom_adj
或 systemd 下:
OOMScoreAdjust=-1000
Redis 4.0+ 支持:
activedefrag yes
现象:Redis 运行一段时间就被杀
原因:maxmemory=0+ 数据无限增长 + 系统内存 8G
解决:设置maxmemory 6gb + allkeys-lru
CentOS 上 Redis 内存溢出,90% 是因为没限制 maxmemory,或系统内存被吃光。
如果你愿意,可以把下面信息发我,我可以帮你精准分析:
used_memory / maxmemory