Redis凭借其超高的读写性能,广泛应用于缓存、会话存储、排行榜等场景。然而,一旦内存使用失控,轻则系统变慢,重则OOM崩溃。本文详细介绍在CentOS系统下如何配置和管理Redis内存限制,涵盖配置文件修改、运行时命令、监控告警等实操方法。
一、为什么要限制Redis内存
1.1 防止内存耗尽
Redis默认不会主动限制内存使用,如果程序存在缺陷或遭受攻击,内存可能无限增长,最终导致服务器宕机。设置maxmemory参数可以在内存达到阈值时触发淘汰策略,保证系统稳定性。
1.2 合理分配服务器资源
在多业务共用一台服务器的场景下,为Redis分配合适的内存配额,避免挤占其他服务(如MySQL、Nginx)的资源,确保整体服务可用性。
1.3 控制成本
云服务器通常按内存规格收费,精确控制Redis内存占用可以直接降低基础设施成本。
二、通过配置文件限制内存
2.1 找到Redis配置文件
在CentOS中,Redis配置文件通常位于:
/etc/redis.conf # 主配置文件
/etc/redis/redis.conf # 部分发行版的路径
编辑前建议先备份:
sudo cp /etc/redis.conf /etc/redis.conf.bak
2.2 设置maxmemory参数
打开配置文件,搜索maxmemory,找到对应行(通常被注释),修改为实际需求值:
# 单位:字节
# 推荐使用人类可读单位,如 256mb、2gb
maxmemory 2gb
常见单位: k/K(千字节)、m/M(兆字节)、g/G(吉字节)。建议使用小写字母,避免解析歧义。
2.3 设置内存淘汰策略(maxmemory-policy)
当内存达到上限后,Redis需要决定淘汰哪些数据。配置项maxmemory-policy控制这一行为:
| 策略名称 | 行为说明 |
|---|---|
noeviction |
不淘汰任何数据,写入操作返回错误(默认策略) |
allkeys-lru |
对所有key进行LRU淘汰,优先删除最近最少使用的key |
allkeys-random |
随机删除任意key |
volatile-lru |
仅对设置了过期时间的key进行LRU淘汰 |
volatile-random |
仅对设置了过期时间的key进行随机删除 |
volatile-ttl |
仅对设置了过期时间的key,删除TTL最小的 |
推荐配置: 大多数缓存场景使用allkeys-lru,兼顾数据淘汰效果与系统稳定性:
maxmemory-policy allkeys-lru
2.4 保存并重启Redis
修改配置后,重启Redis使配置生效:
# CentOS 7 及以上(systemd)
sudo systemctl restart redis
# CentOS 6 及更早版本(SysVinit)
sudo service redis restart
三、运行时动态修改内存限制
如果不想重启Redis,可以通过命令行在运行时调整:
3.1 查看当前配置
redis-cli config get maxmemory
# 输出示例:1) "maxmemory" 2) "2147483648"(单位:字节)
redis-cli config get maxmemory-policy
# 输出示例:1) "maxmemory-policy" 2) "allkeys-lru"
3.2 动态修改maxmemory
# 将内存限制改为1GB
redis-cli config set maxmemory 1gb
# 将内存限制改为512MB
redis-cli config set maxmemory 512mb
注意:
CONFIG SET只对当前实例生效,Redis重启后会恢复为配置文件中的值。如需永久生效,请同时修改配置文件。
3.3 动态修改淘汰策略
redis-cli config set maxmemory-policy allkeys-lru
四、内存使用监控
4.1 查看实时内存信息
# 查看内存使用概况
redis-cli info memory
# 关键指标说明:
# used_memory_human — 实际已使用内存
# used_memory_peak_human — 历史峰值内存
# maxmemory_human — 设置的最大内存限制
# mem_fragmentation_ratio — 内存碎片率(>1.5需关注)
4.2 查看内存排名前10的Key
在生产环境中,定位占用内存最多的Key非常关键:
redis-cli --bigkeys
# 或使用以下命令找出最大的String类型Key:
redis-cli --scan --pattern '*' | redis-cli --pipe-times 0 --bigdata
4.3 设置内存告警
在/etc/redis.conf中开启内存不足提醒:
maxmemory-policy allkeys-lru
结合Linux定时任务(cron)发送告警:
# 每5分钟检查一次,写入日志
*/5 * * * * USAGE=$(redis-cli info memory | grep used_memory_human | cut -d: -f2 | tr -d '\r'); THRESHOLD=1800; CUR_MB=$(echo $USAGE | numfmt --from=iec --to-unit-i=MB 2>/dev/null || echo 0); [ "$CUR_MB" -gt "$THRESHOLD" ] && echo "[$(date)] Redis内存使用告警: ${USAGE}" >> /var/log/redis-alert.log
五、实战案例:配置缓存服务器
假设一台4GB内存的CentOS服务器,需要将Redis配置为高效的缓存服务,推荐配置如下:
# /etc/redis.conf 关键配置
# 最大使用3GB内存,保留1GB给系统和Redis进程
maxmemory 3gb
# 使用LRU策略,TTL较长的数据优先淘汰
maxmemory-policy allkeys-lru
# 禁用RDB快照(AOF持久化更适合缓存)
appendonly no
# 设置后台保存策略(内存镜像)
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /var/lib/redis
# 限制最大客户端连接数
maxclients 10000
配置完成后,验证生效:
redis-cli config get maxmemory
redis-cli config get maxmemory-policy
redis-cli info memory | grep -E 'used_memory_human|maxmemory_human|mem_fragmentation_ratio'
六、常见问题排查
问题1:Redis内存已达上限但数据仍在增长
- 检查淘汰策略是否为
noeviction(默认不淘汰) - 确认
maxmemory参数已正确设置且生效 - 使用
redis-cli --bigkeys排查是否有大Key
问题2:内存碎片率过高
Redis在频繁删除和更新数据后,可能产生内存碎片。处理方法:
# 动态触发内存碎片整理(Redis 4.0+)
redis-cli memory purge
如果碎片率持续高于1.5,建议重启Redis或升级到更新版本。
问题3:CONFIG SET修改后Redis重启失效
这是正常现象。CONFIG SET仅影响当前运行时环境,永久生效需修改/etc/redis.conf并重启。
七、最佳实践总结
- 始终设置
maxmemory,即使作为缓存使用,也给一个保守的上限值 - 选择合适的淘汰策略:作为缓存优先用
allkeys-lru;需要严格保留数据时用noeviction - 定期监控内存趋势:设置告警阈值,防止内存突增
- 使用
BIGKEY定期检查:及时发现异常大的Key,避免单Key撑爆内存 - 合理规划持久化策略:RDB快照和AOF会额外占用内存,需在
maxmemory之外预留空间
通过以上配置和监控手段,可以在CentOS环境下将Redis内存使用牢牢控制在安全范围内,既保障服务稳定,又实现资源的高效利用。