redis内存清理实践

在日常开发过程中,经常将一些缓存数据临时缓存在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

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值