安裝工具
pip install rdbtools python-lzf
或者
git clone https://github.com/sripathikrishnan/redis-rdb-tools
cd redis-rdb-tools
sudo python setup.py install
解析 redis 的 rdb 檔案
命令列工具使用,先看 --help
usage: usage: rdb [options] /path/to/dump.rdb
Example : rdb --command json -k "user.*" /var/redis/6379/dump.rdb
positional arguments:
dump_file RDB Dump file to process
optional arguments:
-h, --help show this help message and exit
-c CMD, --command CMD
Command to execute. Valid commands are json, diff,
justkeys, justkeyvals, memory and protocol
-f FILE, --file FILE Output file
-n DBS, --db DBS Database Number. Multiple databases can be provided.
If not specified, all databases will be included.
-k KEYS, --key KEYS Keys to export. This can be a regular expression
-o NOT_KEYS, --not-key NOT_KEYS
Keys Not to export. This can be a regular expression
-t TYPES, --type TYPES
Data types to include. Possible values are string,
hash, set, sortedset, list. Multiple typees can be
provided. If not specified, all data types will be
returned
-b BYTES, --bytes BYTES
Limit memory output to keys greater to or equal to
this value (in bytes)
-l LARGEST, --largest LARGEST
Limit memory output to only the top N keys (by size)
-e {raw,print,utf8,base64}, --escape {raw,print,utf8,base64}
Escape strings to encoding: raw (default), print,
utf8, or base64.
-x, --no-expire With protocol command, remove expiry from all keys
-a N, --amend-expire N
With protocol command, add N seconds to key expiry
time
引數解析
- -c 執行命令 輸出不同格式的資料
- json; 輸出 json 格式的字串 如:
[{"int":"1"}]
- diff; 匯出可供 diff 、kdiff 、 vimdiff 比較的資料
- justkeys; 只輸出 key
- justkeyvals; 只輸出鍵值對,以空格分隔
- memory; 輸出記憶體分佈狀態
- protocol; 輸出原始的 RESP 協議
- json; 輸出 json 格式的字串 如:
- -f 指定輸出到檔案
- -n 指定輸出的 db
- -k 指定輸出哪些 key; 可以使用正規表示式, 如:
'^users_\d+$'
- -o 排除哪些 key; 可以使用正規表示式
- -t 指定輸出 value 的型別
- -b 指定大於此位元組數的 key 輸出
- -l 輸出最大的多少個 key
- -e 轉義字串到其他格式
- raw 原始字串
- utf8 輸出原始 utf8 格式字串
- base64 對於二進位制資料來說,可以先 base64 儲存到檔案,然後在程式中 decode 出來
- -x 在匯出 RESP 協議內容時,去掉過期時間
- -a 匯出 RESP 協議內容時,給有過期時間的 key 加上幾秒鐘過期時間
下面看一下一些常見用法:
生成記憶體報告
rdb --command memory dump.rdb > memory.csv
生成 CSV 格式的記憶體報告。包含的列有:
資料庫 ID,資料型別,key,記憶體使用量(byte),編碼。記憶體使用量包含 key、value 和其他值,結果:
database,type,key,size_in_bytes,encoding,num_elements,len_largest_element,expiry
0,set,fruit,252,hashtable,2,6,
0,hash,webset,81,ziplist,1,13,
0,string,baiduyun,64,string,5,5,
0,list,languages,161,quicklist,2,6,
0,sortedset,page_rank,80,ziplist,1,9
使用引數過濾想要的資料
# 使用這個命令會將儲存的 int 值顯示為 json 的字串
> rdb -c json --db 2 --type hash --key "a.*" /var/redis/6379/dump.rdb
[{},{
"aroma":{"pungent":"vinegar","putrid":"rotten eggs","floral":"roses"}}]
比較兩個 rdb 檔案
> rdb --command diff /var/redis/6379/dump1.rdb | sort > dump1.txt
> rdb --command diff /var/redis/6379/dump2.rdb | sort > dump2.txt
# 使用 diff 軟體檢視 diff
> kdiff3 dump1.txt dump2.txt
檢視一個 key 的記憶體使用情況
> 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 # hash 中佔用記憶體最大的那個 value 的佔用位元組數
常見問題 FAQ
-
記憶體報告的精確度如何?
答:最多有 10% 的誤差
-
儲存了一個二進位制 binary 資料,但是輸出的時候是亂碼,不可讀,怎麼處理?
答:可以使用 -e 命令先輸出 base64 編碼的字串,然後程式中解碼之後使用
-
這個工具能解析哪個版本的 rdb 檔案?
答:2~6 版本
-
我不想用 python,有其他的解析方案嗎?
答: