redis查看某⼀个key的⼤⼩_分析rediskey⼤⼩的⼏种⽅法当redis被⽤作缓存时,有时我们希望了解key的⼤⼩分布,或者想知道哪些key占的空间⽐较⼤。本⽂提供了⼏种⽅法。
⼀. bigKeys
这是redis-cli⾃带的⼀个命令。对整个redis进⾏扫描,寻较⼤的key。例:
redis-cli -dis -p 1959 --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.1sec
# per100SCAN commands (not usually needed).
[00.00%] Biggest hash found so far 's_9329222' with 3fields
[00.00%] Biggest string found so far 'foo' with 40bytes
[00.00%] Biggest hash found so far 's_9329084' with 4fields
[00.23%] Biggest zset found so far 'region_hot_菏泽地' with 625members
[00.23%] Biggest zset found so far 'region_hot_葫芦岛' with 914members
[00.47%] Biggest string found so far 'top_notice_list' with 135193bytes
[00.73%] Biggest zset found so far 'region_hot_⾃贡' with 2092members
[01.90%] Biggest hash found so far 'uno_facet_2018-12-20' with 59fields
[11.87%] Biggest zset found so far 'region_hot_上海' with 2233members
[27.05%] Biggest set found so far 'blacklist_set_key' with 31832members
[73.87%] Biggest string found so far 'PUSH_NEWS' with 3104237bytes
[86.18%] Biggest zset found so far 'region_hot_北京' with 2688members-------- summary -------Sampled4263 keys in the keyspace!Total key lengthin bytes is 174847 (avg len 41.02)
说明:
该命令使⽤scan⽅式对key进⾏统计,所以使⽤时⽆需担⼼对redis造成阻塞。
输出⼤概分为两部分,summary之上的部分,只是显⽰了扫描的过程。summary部分给出了每种数据结构中最⼤的Key。
统计出的最⼤key只有string类型是以字节长度为衡量标准的。list,set,zset等都是以元素个数作为衡量标准,不能说明其占的内存就⼀定多。所以,如果你的Key主要以string类型存在,这种⽅法就⽐较适合。
⼆. debug object key
redis的命令,可以查看某个key序列化后的长度。
例:
连接上redis后执⾏如下命令
OK
Value at:0x7f005c6920a0 refcount:1 encoding:ziplist serializedlength:36 lru:3341677 lru_seconds_idle:2
关于输出的项的说明:
Value at:key的内存地址
refcount:引⽤次数
encoding:编码类型
serializedlength:序列化长度
lru_seconds_idle:空闲时间
⼏个需要注意的问题
serializedlength是key序列化后的长度(redis在将key保存为rdb⽂件时使⽤了该算法),并不是key在内存中的真正长度。这就像⼀个数组在json_encode后的长度与其在内存中的真正长度并不相同。不过,
它侧⾯反应了⼀个key的长度,可以⽤于⽐较两个key的⼤⼩。
serializedlength会对字串做⼀些可能的压缩。如果有些字串的压缩⽐特别⾼,那么在⽐较时会出现问题。⽐如下列:
OK
OK
Value at:0x7f007c035b80 refcount:1 encoding:embstr serializedlength:12 lru:3342615 lru_seconds_idle:13
Value at:0x7f00654df400 refcount:1 encoding:embstr serializedlength:31 lru:3342622 lru_seconds_id
le:7
两个字串的实际长度都是30, 但str1的serializedlength为12, str2的为31。
redis的官⽅⽂档不是特别建议在客户端使⽤该命令,可能因为计算serializedlength的代价相对⾼。所以如果要统计的key⽐较多,就不适合这种⽅法。
三. redis rdb tools
这是⼀个redis rdb file的分析⼯具,可以根据rdb file⽣成内存报告。
3.1 安装
需要python2.4以上版本和pip。
pip install rdbtools
redis五种数据结构3.2 ⽣成内存报告
⾸先我们需要有⼀份rdb⽂件,如果你在配置中开启了rdb,那么redis会⾃动⽣成rdb⽂件。如果没有,可以⼿动执⾏bgsave。如果是线上机器,执⾏时要考虑机器负载等问题。拿到rdb⽂件后,我们就可以
⽣成内存报告了。命令如下:
rdb -c memory file
例:
rdb -c memory /tmp/dump.rdb
database,type,key,size_in_bytes,encoding,num_elements,len_largest_element,expiry
0,hash,data:index_flow_yingshi,10492,hashtable,1,8992,2019-01-14T08:20:10.236000
0,hash,data:index_movie,22068,hashtable,7,2896,2019-01-14T07:29:19.685000
0,string,block:index_module_novel,8296,string,7694,7694,2019-01-13T00:27:46.128000
0,string,block:index_bottom_baike_aikan,8296,string,7632,7632,2019-01-14T02:27:11.850000
0,string,block:index_bottom_tools,5224,string,4549,4549,2019-01-13T01:02:09.171000
0,string,block:index_module_travel,7272,string,6408,6408,2019-01-13T00:43:39.478000
.
..
输出了db,数据类型,key, ⼤⼩, 编码等多列信息。⾄于分析数据,你可以⽤shell,也可以保存成csv⽤excel排序,或者⼲脆存到db⾥,想怎么排怎么排。
如果只要知道最⼤的N个key, 可以使⽤-l选项。例:
[@sjs_73_171 ~]$ rdb -c memory -l 3 /tmp/dump.rdb
database,type,key,size_in_bytes,encoding,num_elements,len_largest_element,expiry
0,hash,city_tong,724236,hashtable,3113,216,2019-01-14T01:10:59.407000
0,hash,iplocsearch,406292,hashtable,383,180190,2019-01-30T05:37:56.082000
0,hash,weather_tong3,583844,hashtable,319,1658,2019-01-07T10:22:33.742000
3.3 查看单个key
如果我们只需要查询单个key所使⽤的内存可以不必依赖rdb file, 使⽤redis-memory-for-key命令即可。
例:
[@sjs_73_171 WEB-INF]$ redis-memory-for-key -dis -p 1959 myhash
Key myhash
Bytes 83
Type hash
Encoding ziplist
Number of Elements 3
Length of Largest Element 2
[@sjs_73_171 WEB-INF]$ redis-memory-for-key -dis -p 1959 str1
Key str1
Bytes 80
Type string
[@sjs_73_171 WEB-INF]$ redis-memory-for-key -dis -p 1959 str2
Key str2
Bytes 80
Type string
3.4 更多
⼯具得出的内存值为近似值,这点可以参看作者的说明。“Why doesn’t reported memory match actual memory used?”
⼯具通过分析rdb file中的key及value,反算出该kv在内存中的⼤⼩。计算时充分考虑了数据类型的影响,key本⾝长度的影响,内存分配等多种因素。虽然得出的⼤⼩不是真实值,但⽤于key⼤⼩的⽐较是完全可以的。
rdb的功能不仅于此,它还可以将kv导成json格式,也可以按正则表达式只导出部分key,更多使⽤⽅法可以查看
rdb --help
也可以查看git上的帮助⽂档。
四. 总结
如果想粗略的看下最⼤key, 可以使⽤bigKeys。
如果查询的key不多,key的压缩⽐⼜没有明显差异,可以使⽤debug object key。
如果不介意安装个⼯具,那么redis rdb tools似乎是最佳选择。
github地址:
参考地址:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。