Redis在银河麒麟OS上内存持续增长致OOM需调优:先查当前策略(redis-cli config get maxmemory-policy)和内存状态(redis-cli info memory),若为noeviction且mem_fragmentation_ratio>1.5,需设maxmemory≤物理内存45%并改用allkeys-lru或volatile-lru策略,禁用noeviction于计数器场景,最后通过测试键与日志验证淘汰生效。

当Redis在银河麒麟OS上运行时内存持续增长甚至触发OOM Killer导致服务中断,必须针对性调整内存淘汰策略而非仅依赖默认配置。
确认当前淘汰策略与内存使用现状
登录Redis CLI执行:redis-cli config get maxmemory-policy,查看返回值。若为noeviction(默认值),说明内存满后写入将直接报错,无法自动释放空间。
同时运行redis-cli info memory | grep -E "(used_memory_human|maxmemory_human|mem_fragmentation_ratio)",确认实际内存占用、配置上限及碎片率。若mem_fragmentation_ratio > 1.5,说明jemalloc分配器存在严重碎片,需同步检查是否启用jemalloc。
修改maxmemory并启用主动淘汰机制
编辑Redis配置文件:sudo vim /etc/redis.conf。
取消# maxmemory <bytes></bytes>行的注释,设置合理上限——该值【不能超过物理内存的45%】,例如服务器有32GB内存,则设为maxmemory 14gb。过高易引发系统级内存争抢,过低则浪费Redis性能优势。
紧接着设置淘汰策略:取消# maxmemory-policy noeviction注释,改为maxmemory-policy allkeys-lru(推荐开发/测试环境)或volatile-lru(生产环境有TTL键时更安全)。
保存退出后,重启服务生效:sudo systemctl restart redis。
根据业务特征选择精准淘汰策略
方法一:缓存场景(如页面HTML、API响应体)→ 使用allkeys-lru
最常用,对所有键按最近最少使用排序淘汰,适合无明确过期时间但可随时重建的数据。
方法二:会话/临时凭证类数据 → 使用volatile-ttl
只淘汰设置了TTL的键,且优先淘汰剩余生存时间最短者。避免误删长期有效的配置类key。
方法三:写多读少、需强一致性的计数器 → 使用noeviction + 监控告警
【禁止在该场景下启用自动淘汰】,否则INCR/DECR原子操作可能因内存满而失败,导致业务逻辑错乱。应改用扩容或分片方案。
验证淘汰行为是否真实触发
第一步:向Redis批量写入带TTL的测试键:for i in {1..1000}; do redis-cli set testkey$i $i EX 3600; done。
第二步:手动触发内存压力:redis-cli config set maxmemory 2mb(远低于当前used_memory)。
第三步:观察淘汰日志:sudo tail -f /var/log/redis/redis-server.log | grep "evicted"。出现类似1000000000:evicted 123 keys (0 volatile)即表示策略已生效。
第四步:恢复原maxmemory值:redis-cli config set maxmemory 14gb,避免测试残留影响生产。


















