分析redis key的大小

一、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似乎是最佳選擇。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章