一、介绍
解析redis的dump.rdb文件,分析内存,以JSON格式导出数据。提供的功能有:
1. 生成内存报告。
2. 转储文件到JSON。
3. 使用标准的diff工具比较两个dump文件。
Rdbtools是以python语言开发的。
GITHUP:https://github.com/sripathikrishnan/redis-rdb-tools/
二、安装
1. 最好使用python2.7版本(CentOS7)。
2. redis-py可选,只运行在测试用例下。
1 2 |
$ easy_install pip $ pip install rdbtools |
语法:
1 2 3 4 5 6 7 8 9 10 |
$ rdb [options] /path/to/dump.rdb -c FILE #指定rdb文件; -f FILE #指定导出文件; -n DBS #解析指定数据库,如果不指定默认包含所有; -k KEYS #指定需要导出的KEY,可以使用正则表达式; -o NOT_KEYS #指定不需要导出的KEY,可以使用正则表达式; -t TYPES #指定解析的数据类型,可能的值有:string,hash,set,sortedset,list;可以提供多个类型,如果没有指定,所有数据类型都返回; -b BYTES #限制输出KEY大大小; -l LARGEST #根据大小限制的top key; -e ESCAPE #指定输出编码,默认RAW; |
三、转换dump文件到JSON
1 2 3 4 5 6 7 8 9 10 |
$ rdb --command json /var/redis/6379/dump.rdb [{ "user003":{"fname":"Ron","sname":"Bumquist"}, "lizards":["Bush anole","Jackson's chameleon","Komodo dragon","Ground agama","Bearded dragon"], "user001":{"fname":"Raoul","sname":"Duke"}, "user002":{"fname":"Gonzo","sname":"Dr"}, "user_list":["user003","user002","user001"]},{ "baloon":{"helium":"birthdays","medical":"angioplasty","weather":"meteorology"}, "armadillo":["chacoan naked-tailed","giant","Andean hairy","nine-banded","pink fairy"], "aroma":{"pungent":"vinegar","putrid":"rotten eggs","floral":"roses"}}] |
只解析符合正则的keys
1 2 3 4 5 |
$ rdb --command justkeyvals --key "user.*" /var/redis/6379/dump.rdb user003 fname Ron,sname Bumquist, user001 fname Raoul,sname Duke, user002 fname Gonzo,sname Dr, user_list user003,user002,user001 |
只解析以“a”为开头的hash且位于数据库ID为2的
1 2 3 |
$ rdb -c json --db 2 --type hash --key "a.*" /var/redis/6379/dump.rdb [{},{ "aroma":{"pungent":"vinegar","putrid":"rotten eggs","floral":"roses"}}] |
四、生成内存报告
生成CSV格式的内存报告。包含的列有:数据库ID,数据类型,key,内存使用量(byte),编码。内存使用量包含key、value和其他值。
注意:内存使用量是近似的。在一般情况下,略低于实际值。可以根据key或数据库ID或数据类型对报告的内容进行过滤。
内存报告有助于检测是否是应用程序逻辑导致的内存泄露,也有助于优化reids内存使用情况。
1 2 3 4 5 6 7 8 |
$ rdb -c memory /data/redis_data/6379/dump.rdb > redis_memory_report.csv $ cat redis_memory_report.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所使用的内存。如果全部导出来在查找将是很愚蠢且耗时的。对于这种情景,可以使用redis-memory-for-key命令。
redis-memory-for-key需要依赖redis-py包。
1 |
$ pip install redis |
语法
1 2 3 4 5 6 7 8 |
$ redis-memory-for-key person:1 $ redis-memory-for-key -s localhost -p 6379 -a mypassword person:1 Key person:1 Bytes 111 Type hash Encoding ziplist Number of Elements 2 Length of Largest Element 8 |
六、比较RDB文件
使用--command diff
选项,并通过管道来进行排序。
1 2 |
$ rdb --command diff /var/redis/6379/dump1.rdb | sort > dump1.txt $ rdb --command diff /var/redis/6379/dump2.rdb | sort > dump2.txt |
使用 kdiff3 工具来进行比较,kdiff3 是图形化的工具,比较直观。kdiff3 工具比较两个或三个输入文件或目录。
安装 kdiff3(需要 epel 源)
1 2 |
$ yum install kdiff3 $ kdiff3 dump1.txt dump2.txt |
PS:rdbtools 还有很多其他功能,具体看官网即可。
<延伸>
http://trumandu.github.io/categories/redis/