redis内存使用率过高

内存满了的几种场景

  • 检查 Redis 内存占用情况
#.使用 info 查看内存使用情况
redis-cli -a RbY9k2_NBf1QWy8I -c -p 7100 info memory | grep used_memory:              #.redis存储数据实际已使用的内存
redis-cli -a RbY9k2_NBf1QWy8I -c -p 7100 info memory | grep used_memory_human         #.redis实际需要的内存
redis-cli -a RbY9k2_NBf1QWy8I -c -p 7100 info memory | grep used_memory_rss_human     #.redis实际占用的物理内存
redis-cli -a RbY9k2_NBf1QWy8I -c -p 7100 info memory | grep used_memory_peak_human    #.redis内存消耗的峰值
redis-cli -a RbY9k2_NBf1QWy8I -c -p 7100 info memory | grep used_memory_lua_human     #.lua脚本引擎占用的内存大小
redis-cli -a RbY9k2_NBf1QWy8I -c -p 7100 info memory | grep mem_fragmentation_ratio   #.内存碎片率

#.使用 config get 查看配置
redis-cli -a RbY9k2_NBf1QWy8I -c -p 7100 config get maxmemory                          #.最大内存
redis-cli -a RbY9k2_NBf1QWy8I -c -p 7100 config get maxmemory-policy                  #.淘汰算法
redis-cli -a RbY9k2_NBf1QWy8I -c -p 7100 config get activedefrag                      #.是否启用碎片自动整理

#.使用 info 查看其他指标
redis-cli -a RbY9k2_NBf1QWy8I -c -p 7100 info stats | grep ops                        #.每秒操作数
redis-cli -a RbY9k2_NBf1QWy8I -c -p 7100 info clients | grep connected_clients        #.客户端连接数量
redis-cli -a RbY9k2_NBf1QWy8I -c -p 7100 info replication | grep connected_slaves     #.从库数量

数据规模过大/无过期时间

  • 发生原因:如果 数据规模过大或 key 没有设置合理的 TTL 过期时间,则会导致数据无限堆积,这是最常见的原因
#.查看所有键及过期键的数量
redis-cli -a RbY9k2_NBf1QWy8I -c -p 7100 info keyspace
  • 解决方法:为所有Key设置合理的 TTL 过期时间,这是最有效的预防手段。对于没有过期时间的Key,需要定期审查
#.针对已存在的key设置TTL
set key1 "hello"
expire key1 60

#.创建key的时候设置TTL
set key2 "world" ex 60

内存上限和淘汰策略

  • 发生原因:如果没有设置 maxmemory 或淘汰算法不合理,Redis 会持续吃内存直到系统耗尽
#.通过config检查
redis-cli -a RbY9k2_NBf1QWy8I -c -p 7100 config get maxmemory*
redis-cli -a RbY9k2_NBf1QWy8I -c -p 7100 config get maxmemory-policy

#.通过info检查
redis-cli -a RbY9k2_NBf1QWy8I -c -p 7100 info memory | grep  maxmemory
  • 解决办法:设置合理的内存上限和淘汰策略,建议将maxmemory设置为物理内存的70%,为系统和fork子进程(如RDB/AOF重写)预留空间,防止OOM(内存溢出),淘汰策略务必谨慎调整,记得同步修改 redis.conf
#.修改配置
redis-cli -a RbY9k2_NBf1QWy8I -c -p 7100 config set maxmemory 12884901888
redis-cli -a RbY9k2_NBf1QWy8I -c -p 7100 config set maxmemory-policy volatile-lru

内存碎片过高

  • 发生原因:长期运行后,频繁的增删操作会产生内存碎片,导致 used_memory_rss(操作系统实际分配给Redis的物理内存)远大于 used_memory(Redis实际存储数据使用的内存)

注:内存碎片率的理想状态为 1.0 左右,若 mem_fragmentation_ratio 大于 1.5 则说明内存碎片率较高,建议立即清理碎片

#.查看内存碎片率
redis-cli -a RbY9k2_NBf1QWy8I -c -p 7100 info memory | grep mem_fragmentation_ratio
  • 临时方法:手动触发内存碎片整理,只有在 Redis 使用 jemalloc 作为内存分配器时才有效
#.手动触发内存碎片整理
redis-cli -a RbY9k2_NBf1QWy8I -c -p 7100 info memory | grep mem_allocator
redis-cli -a RbY9k2_NBf1QWy8I -c -p 7100 MEMORY PURGE
  • 长期方法:开启自动碎片整理,并配置合理的触发阈值
#.开启自动碎片整理
redis-cli -a RbY9k2_NBf1QWy8I -c -p 7100 config set activedefrag yes
redis-cli -a RbY9k2_NBf1QWy8I -c -p 7100 config get activedefrag

#.当内存碎片率达到 10% 时, 就会启动自动碎片整理功能
redis-cli -a RbY9k2_NBf1QWy8I -c -p 7100 config set active-defrag-threshold-lower 10

#.当触发碎片整理时, 至少使用 25% 的 CPU 时间去执行整理工作
redis-cli -a RbY9k2_NBf1QWy8I -c -p 7100 config set active-defrag-cycle-min 25

存在 Big Key

  • 存在大Key (Big Key):单个 Key(如一个包含百万成员的Hash)占用了过多内存,尤其在集群版中会导致内存倾斜(个别节点内存爆满而其他节点空闲)
#.找出每种数据类型中最大的Key
redis-cli -a RbY9k2_NBf1QWy8I -c -p 7100 --bigkeys | grep Biggest
  • 解决办法:将过大的 Hash、List、ZSet 等拆分成多个小 Key,并控制每个 Key 的大小(如Hash元素数不超过5000)

打开了 Monitor 监控

  • 发生原因:在业务压力较大的生产环境中打开 redis-cli monitor 非常容易引发内存紧张(客户端输出缓冲区急剧膨胀),甚至导致内存溢出(OOM)
#.打开monitor监控
redis-cli -a RbY9k2_NBf1QWy8I -c -p 7100 monitor
  • 解决办法:找到 monitor 进程并杀掉
#.找到进程
ps -ef | grep -v grep | grep monitor

#.杀掉进程
ps -ef | grep -v grep | grep monitor | awk '{print $2}' | xargs kill -9

其他

  • 场景1:内存满了但是key不多的分析
#.查看已连接客户端的数量, 不包括通过从属服务器连接的客户端
redis-cli -a RbY9k2_NBf1QWy8I -c -p 7100 client list

#.查看所有客户端连接, 包括哨兵及集群副本的连接
redis-cli -a RbY9k2_NBf1QWy8I -c -p 7100 info clients | grep connected_clients

#.针对 idle 的时间很长的链接做了kill操作
redis-cli -a RbY9k2_NBf1QWy8I -c -p 7100 client kill ip:port
Copyright © www.sqlfans.cn 2021 - 2026 All Right Reserved更新时间: 2026-08-05 12:11:58

results matching ""

    No results matching ""