一、bigKeys
這是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
二、debug object key
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 tools
這是一個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似乎是最佳選擇。