这是redis-cli自带的一个命令。对整个redis进行扫描,寻找较大的key。例:
格式:redis-cli -h 服务端主机名或者IP地址 -p 端口 --bigkeys
$ redis-cli -h 192.168.0.112 -p 6379 --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 'tx:manager:compensate:order-service:2019-01-25:eXC0yl5s.json' with 69032 bytes
[00.00%] Biggest hash found so far 'count' with 33 fields
[47.62%] Biggest set found so far 'menu:url' with 8 members
-------- summary -------
Sampled 21 keys in the keyspace!
Total key length in bytes is 743 (avg len 35.38)
Biggest string found 'tx:manager:compensate:order-service:2019-01-25:eXC0yl5s.json' has 69032 bytes
Biggest set found 'menu:url' has 8 members
Biggest hash found 'count' has 33 fields
14 strings with 274555 bytes (66.67% of keys, avg size 19611.07)
0 lists with 0 items (00.00% of keys, avg size 0.00)
1 sets with 8 members (04.76% of keys, avg size 8.00)
6 hashs with 39 fields (28.57% of keys, avg size 6.50)
0 zsets with 0 members (00.00% of keys, avg size 0.00)
说明:
①该命令使用scan方式对key进行统计,所以使用时无需担心对redis造成阻塞。
②输出大概分为两部分,summary之上的部分,只是显示了扫描的过程。summary部分给出了每种数据结构中最大的Key。
③统计出的最大key只有string类型是以字节长度为衡量标准的。list,set,zset等都是以元素个数作为衡量标准,不能说明其占的内存就一定多。所以,如果你的Key主要以string类型存在,这种方法就比较适合。
④更多请参考:https://redis.io/topics/rediscli#scanning-for-big-keys
redis的命令,可以查看某个key序列化后的长度。
示例:
192.168.0.112:6379>hmset myhash k1 v1 k2 v2 k3 v3
OK
192.168.0.112:6379> debug object myhash
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会对字串做一些可能的压缩。如果有些字串的压缩比特别高,那么在比较时会出现问题。如下所示:
192.168.0.112:6379>set str1 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
OK
192.168.0.112:6379>set str2 abcdefghijklmnopqrstuvwxyz1234
OK
192.168.0.112:6379>debug object str1
Value at:0x7f007c035b80 refcount:1 encoding:embstr serializedlength:12 lru:3342615 lru_seconds_idle:13
192.168.0.112:6379>debug object str2
Value at:0x7f00654df400 refcount:1 encoding:embstr serializedlength:31 lru:3342622 lru_seconds_idle:7
两个字串的实际长度都是30, 但str1的serializedlength为12, str2的为31。
这是一个redis rdb file的分析工具,可以根据rdb file生成内存报告。
1、安装rdbtools工具
pip install rdbtools
2、生成内存报告
首先我们需要有一份rdb文件,如果你在配置中开启了rdb,那么redis会自动生成rdb文件。如果没有,可以手动执行bgsave。如果是线上机器,执行时要考虑机器负载等问题。拿到rdb文件后,我们就可以生成内存报告了。命令如下:
rdb -c memory rdb文件
示例:
C:\Users\92403>rdb -c memory dump.rdb
输出了db,数据类型,key, 大小, 编码等多列信息。至于分析数据,你可以用shell,也可以保存成csv用excel排序,或者干脆存到db里,想怎么排怎么排。
如果只要知道最大的N个key, 可以使用 -l 选项。例:
C:\Users\92403>rdb -c memory -l 3 dump.rdb #查询最大的3个key
WARNING: python-lzf package NOT detected. Parsing dump file will be very slow unless you install it. To install, run the following command:
pip install python-lzf
database,type,key,size_in_bytes,encoding,num_elements,len_largest_element,expiry
8,list,luck:draw:record:member:info:1,59361,quicklist,425,165,
8,list,assistance:award:member:1:181256,7836,quicklist,22,364,
8,list,assistance:award:member:1:252741,7873,quicklist,22,379,
3、查看单个key
如果我们只需要查询单个key所使用的内存可以不必依赖rdb file, 使用redis-memory-for-key命令即可。
例:
格式:redis-memory-for-key -s 服务端主机名或者IP地址 -p 端口 key
C:\Users\92403>redis-memory-for-key -s 192.168.0.112 -p 6379 myhash
Key myhash
Bytes 83
Type hash
Encoding ziplist
Number of Elements 3
Length of Largest Element 2
C:\Users\92403>redis-memory-for-key -s 192.168.0.112 -p 6379 str1
Key str1
Bytes 80
Type string
C:\Users\92403>redis-memory-for-key -s 192.168.0.112 -p 6379 str2
Key str2
Bytes 80
Type string
#更多请参考:
C:\Users\92403>rdb --help
1、如果想粗略的看下最大key, 可以使用bigKeys。
2、如果查询的key不多,key的压缩比又没有明显差异,可以使用debug object key。
3、如果不介意安装个工具,那么redis rdb tools似乎是最佳选择。