在日常开发过程中,经常将一些缓存数据临时缓存在redis中,但是如果redis中的缓存数据忘记设置过期时间,随着时间的推移,我们会发现redis所在的机器占用内存越来越多,这时必须要找出redis中占用内存过多的数据,并清理。
当遇到redis内存占用过多情况时,大概从以下几个步骤分析:
一、查看系统内存使用情况
[xxx@xxxxxxx bin]$ ./redis-cli -p 9001 info memory
# Memory
used_memory:22504000856
used_memory_human:20.96G // 用户数据所占用的内存
used_memory_rss:32022540288 // 表示redis物理内存的大小(rss for Resident Set Size)
used_memory_rss_human:29.82G
used_memory_peak:25982148872
used_memory_peak_human:24.20G
used_memory_peak_perc:86.61%
used_memory_overhead:68268612
used_memory_startup:1444936
used_memory_dataset:22435732244
used_memory_dataset_perc:99.70%
total_system_memory:67387289600
total_system_memory_human:62.76G
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:1.42 // 内存碎片率
mem_allocator:jemalloc-4.0.3
active_defrag_running:0
lazyfree_pending_objects:0
(-p 9001表示这个redis的端口号是9001)
可以看出用户数据占用内存为20.96G,实际占用物理内存为29.82G(内存存在碎片化,内存碎片率为1.42)
二、查看redis中的大key
[root@xxxx bin]# ./redis-cli -c --bigkeys
# Scanning the entire keyspace to find biggest keys as well as
# average sizes per key type. You can use -i 0.1 to sleep 0.1 sec
# per 100 SCAN commands (not usually needed).
[00.00%] Biggest string found so far '"c_cache_1000"' with 503 bytes
[00.00%] Biggest string found so far '"app:cfg:100001"' with 684 bytes
-------- summary -------
Sampled 14 keys in the keyspace!
Total key length in bytes is 193 (avg len 13.79)
Biggest string found '"app:cfg:100001"' has 684 bytes
0 lists with 0 items (00.00% of keys, avg size 0.00)
0 hashs with 0 fields (00.00% of keys, avg size 0.00)
14 strings with 6307 bytes (100.00% of keys, avg size 450.50)
0 streams with 0 entries (00.00% of keys, avg size 0.00)
0 sets with 0 members (00.00% of keys, avg size 0.00)
0 zsets with 0 members (00.00% of keys, avg size 0.00)
使用这个命令可以将redis中占用内存较大的key展示出来,但是这个命令不是太灵活,只能展示一部分数据,并且在线上操作可能会影响线上redis性能,慎用。
三、使用redis-rdb-tools工具分析RDB文件
redis-rdb-tools可以直接离线分析redis的RDB文件,与线上完全隔离,且可以灵活配置查找导出redis中占用内存大于多少字节的key。
1、安装redis-rdb-tools
源码安装
git clone https://github.com/sripathikrishnan/redis-rdb-tools
cd redis-rdb-tools
sudo python setup.py install
安装 python-lzf :加快解析速度
pip install python-lzf
PyPI安装(推荐)
pip install rdbtools python-lzf
常用的命令为
rdb -c memory dump.rdb --bytes 128 -f memory.csv
即将redis内存大于128字节的key导出来,可以分析这些大key中哪些是因为没有正确设置过期时间的key,在redis中手动删除或写程序删除,并且在代码中设置key的过期时间即可。
csv文件中包含database、type(key的类型)、key、占用字节数等信息,结合业务可以知道哪些key是忘删除的。
更多rdb-tools命令参考:https://www.cnblogs.com/zhoujinyi/p/13276697.html
四、回收内存
如果删除redis的key,redis占用内存没有明显降低,则需要将redis内存回收
./redis-cli -p 9001 MEMORY PURGE
或者在redis.conf中设置自动回收内存
CONFIG SET activedefrag yes