redis快照文件dump.rdb解析工具--redis-rdb-tools
解析Redis dump.rdb文件,分析內存并將數據導出到JSON
Rdbtools是Redis的dump.rdb文件的解析器。解析器生成類似于xml sax解析器的事件,并且非常有效的內存明智。
此外,rdbtools還提供實用程序:
在所有數據庫和密鑰中生成數據的內存報告
將轉儲文件轉換為JSON
使用標準差異工具比較兩個轉儲文件
Rdbtools是用Python編寫的,雖然有其他語言的類似項目。請參見常見問題以獲取更多信息。
安裝rdbtools
前提條件:
redis-py是可選的,只需要運行測試用例。
要從PyPI安裝(推薦):
pip?install?rdbtools從源安裝:
git?clone?https://github.com/sripathikrishnan/redis-rdb-tools cd?redis-rdb-tools sudo?python?setup.py?install命令行用法示例
RDB工具的每一次運行都需要指定一個命令來指示解析的RDB數據應該做什么。有效的命令是:json,diff,justkeys,justkeyvals和protocol。
從兩個數據庫轉儲的JSON:
>?rdb?--command?json?/var/redis/6379/dump.rdb [{ "user003":{"fname":"Ron","sname":"Bumquist"}, "lizards":["Bush?anole","Jackson's?chameleon","Komodo?dragon","Ground?agama","Bearded?dragon"], "user001":{"fname":"Raoul","sname":"Duke"}, "user002":{"fname":"Gonzo","sname":"Dr"}, "user_list":["user003","user002","user001"]},{ "baloon":{"helium":"birthdays","medical":"angioplasty","weather":"meteorology"}, "armadillo":["chacoan?naked-tailed","giant","Andean?hairy","nine-banded","pink?fairy"], "aroma":{"pungent":"vinegar","putrid":"rotten?eggs","floral":"roses"}}] 過濾解析輸出只有與正則表達式匹配的進程密鑰,只打印鍵和值:
>?rdb?--command?justkeyvals?--key?"user.*"?/var/redis/6379/dump.rdb user003?fname?Ron,sname?Bumquist, user001?fname?Raoul,sname?Duke, user002?fname?Gonzo,sname?Dr, user_list?user003,user002,user001在數據庫2中只有以“a”開頭的進程散列:
>?rdb?-c?json?--db?2?--type?hash?--key?"a.*"?/var/redis/6379/dump.rdb [{},{ "aroma":{"pungent":"vinegar","putrid":"rotten?eggs","floral":"roses"}}]將轉儲文件轉換為JSON
的json命令輸出是UTF-8編碼的JSON。默認情況下,回調嘗試使用UTF-8解析RDB數據,并以\U符號或非UTF-8可解析字節轉義非ASCII碼可打印字符\x。嘗試解碼RDB數據可能會導致二進制數據轉換,這可以通過使用該--escape raw選項來避免。另一個選擇是-e base64用于Base64編碼的二進制數據。
解析轉儲文件并在標準輸出上打印JSON:
>?rdb?-c?json?/var/redis/6379/dump.rdb [{ "Citat":["B\u00e4ttre?sent?\u00e4n?aldrig","Bra?karl?reder?sig?sj\u00e4lv","Man?ska?inte?k\u00f6pa?grisen?i?s\u00e4cken"], "bin_data":"\\xFE\u0000\u00e2\\xF2"}]將轉儲文件解析為原始字節,并在標準輸出上打印JSON:
>?rdb?-c?json?/var/redis/6379/dump.rdb?--escape?raw [{ "Citat":["B\u00c3\u00a4ttre?sent?\u00c3\u00a4n?aldrig","Bra?karl?reder?sig?sj\u00c3\u00a4lv","Man?ska?inte?k\u00c3\u00b6pa?grisen?i?s\u00c3\u00a4cken"], "bin_data":"\u00fe\u0000\u00c3\u00a2\u00f2"}]生成內存報告
運行時會 -c memory生成一個CSV報告,其中包含該密鑰使用的近似內存。--bytes C并且'--largest N可用于將輸出限制為大于C字節的鍵或N個最大鍵。
>?rdb?-c?memory?/var/redis/6379/dump.rdb?--bytes?128?-f?memory.csv >?cat?memory.csv database,type,key,size_in_bytes,encoding,num_elements,len_largest_element 0,list,lizards,241,quicklist,5,19 0,list,user_list,190,quicklist,3,7 2,hash,baloon,138,ziplist,3,11 2,list,armadillo,231,quicklist,5,20 2,hash,aroma,129,ziplist,3,11生成的CSV具有以下列 - 數據庫號,數據類型,密鑰,字節中使用的內存和RDB編碼類型。內存使用包括密鑰,值和任何其他開銷。
請注意,內存使用情況是近似值。一般來說,使用的實際內存將略高于報告的內存。
您可以篩選密鑰或數據庫號或數據類型的報告。
內存報告應該可以幫助您檢測由應用程序邏輯引起的內存泄漏。它還將幫助您優化Redis內存使用。
查找單鍵使用的內存
有時您只想找到特定密鑰使用的內存,并且在轉儲文件上運行整個內存報告是耗時的。
在這種情況下,您可以使用以下redis-memory-for-key命令:
>?redis-memory-for-key?person:1 >?redis-memory-for-key?-s?localhost?-p?6379?-a?mypassword?person:1 Key?person:1 Bytes111 Typehash Encodingziplist Number?of?Elements2 Length?of?Largest?Element8注意 :
這被添加到redis-rdb-tools版本0.1.3
這個命令依賴于redis-py包
比較RDB文件
首先,使用--command diff選項,并將輸出管道輸送到標準排序實用程序
>?rdb?--command?diff?/var/redis/6379/dump1.rdb?|?sort?>?dump1.txt >?rdb?--command?diff?/var/redis/6379/dump2.rdb?|?sort?>?dump2.txt然后,運行你最喜歡的diff程序
>?kdiff3?dump1.txt?dump2.txt要限制文件的大小,您可以使用該--key選項過濾鍵
發出Redis協議
您可以使用該命令將RDB文件轉換為redis協議流protocol。
>?rdb?--c?protocol?/var/redis/6379/dump.rdb *4 $4 HSET $9 users:123 $9 firstname $8 Sripathi您可以將輸出管道傳輸到netcat并重新導入數據的一個子集。例如,如果要將數據分割成兩個redis實例,可以使用--key標志來選擇一個數據子集,然后將輸出管道傳輸到正在運行的redis實例以加載該數據。閱讀Redis Mass Insert了解更多信息。
當打印協議輸出時,該--escape選項可用于printable或utf8避免不可打印/控制字符。
使用解析器
from?rdbtools?import?RdbParser,?RdbCallback from?rdbtools.encodehelpers?import?bytes_to_unicode class?MyCallback(RdbCallback):'''?Simple?example?to?show?how?callback?works.See?RdbCallback?for?all?available?callback?methods.See?JsonCallback?for?a?concrete?example'''def?__init__(self):super(MyCallback,?self).__init__(string_escape=None)def?encode_key(self,?key):return?bytes_to_unicode(key,?self._escape,?skip_printable=True)def?encode_value(self,?val):return?bytes_to_unicode(val,?self._escape)def?set(self,?key,?value,?expiry,?info):print('%s?=?%s'?%?(self.encode_key(key),?self.encode_value(value)))def?hset(self,?key,?field,?value):print('%s.%s?=?%s'?%?(self.encode_key(key),?self.encode_key(field),?self.encode_value(value)))def?sadd(self,?key,?member):print('%s?has?{%s}'?%?(self.encode_key(key),?self.encode_value(member)))def?rpush(self,?key,?value):print('%s?has?[%s]'?%?(self.encode_key(key),?self.encode_value(value)))def?zadd(self,?key,?score,?member):print('%s?has?{%s?:?%s}'?%?(str(key),?str(member),?str(score))) callback?=?MyCallback() parser?=?RdbParser(callback) parser.parse('/var/redis/6379/dump.rdb')轉載于:https://blog.51cto.com/11736068/1958279
總結
以上是生活随笔為你收集整理的redis快照文件dump.rdb解析工具--redis-rdb-tools的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring(19)——Profile(
- 下一篇: BZOJ 1001: [BeiJing2