Redis 内存占用排查
在生产环境中,如果发现 Redis 占用内存过高,排查的思路通常分为两条:
- Key 少但大 → 关注大 Key。
- Key 多 → 关注为什么有这么多 Key,俗话说“小数怕长计”。
查看 Redis 内存基本情况
Redis 自带命令可以查看基础内存信息:
INFO MEMORY
该命令可以返回 Redis 实例的内存使用概况,包括总内存、碎片率、内存分配情况等。
使用 rdb-tools 深入分析
如果想对具体 Key 的内存占用进行分析,可以使用 redis-rdb-tools。虽然工具版本较旧(2020 年),但解析能力仍然够用。
安装 rdbtools
先决条件:
- python2.7 (没有的话建议用conda安装,环境隔离,避免遇到坑)
- python-lzf(可选,但强烈建议安装,可以大幅加快解析速度)
- redis-py(可选,用于测试用例)
安装方式(推荐从 PyPI 安装):
pip install rdbtools python-lzf
注意:不安装 python-lzf 也能解析,但 1G 的 RDB 文件可能需要 10~20 分钟。
导出内存信息到 CSV
rdb -c memory redis-dump.rdb -f memory.csv
导出的 CSV 文件格式示例:
> rdb -c memory /var/redis/6379/dump.rdb --bytes 128 -f memory.csv
> cat memory.csv
database,type,key,size_in_bytes,encoding,num_elements,len_largest_element
0,list,lizards,241,quicklist,5,19
0,list,user_list,190,quicklist,3,7
2,hash,baloon,138,ziplist,3,11
2,list,armadillo,231,quicklist,5,20
2,hash,aroma,129,ziplist,3,11
分析 Key 的有效期
- 无过期的 Key:用逗号结尾表示没有设置有效期。
grep ',$' memory.csv > noexp.csv
统计某类 Key 总大小:
grep 'xxxx' noexp.csv | awk -F, 'NR > 1 { total += $4 } END { print "Total Size = " total/1024/1024/1024 " Gbytes" }'
- 有过期的 Key:反过来不是逗号结尾的就是设置了有效期。
grep -v ',$' memory.csv > hasexp.csv
统计设置了有效期的 Key 占用的内存:
cat hasexp.csv | awk -F, 'NR > 1 { total += $4 } END { print "Total Size = " total/1024/1024/1024 " Gbytes" }'
按内存大小排序分析
可以根据 size_in_bytes
列对 CSV 文件排序,从而找到最占内存的 Key:
(head -n 1 memory.csv && tail -n +2 memory.csv | sort -t, -k4,4nr) > memory_sorted.csv
这样可以快速定位哪些 Key 占用了大量内存,从而优化存储策略。
总结
通过上述方法,你可以:
- 判断 Redis 内存占用是否异常;
- 找到大 Key 或数量过多的 Key;
- 分析 Key 是否合理设置了有效期;
- 制定优化方案,减少内存占用,提高 Redis 性能。
1111
wjtest:冰毒大麻海洛因