redis快照文件dump.rdb解析工具--redis-rdb-tools
解析Redis dump.rdb文件,分析內(nèi)存并將數(shù)據(jù)導(dǎo)出到JSON
Rdbtools是Redis的dump.rdb文件的解析器。解析器生成類似于xml sax解析器的事件,并且非常有效的內(nèi)存明智。
此外,rdbtools還提供實用程序:
在所有數(shù)據(jù)庫和密鑰中生成數(shù)據(jù)的內(nèi)存報告
將轉(zhuǎn)儲文件轉(zhuǎn)換為JSON
使用標(biāo)準(zhǔn)差異工具比較兩個轉(zhuǎn)儲文件
Rdbtools是用Python編寫的,雖然有其他語言的類似項目。請參見常見問題以獲取更多信息。
安裝rdbtools
前提條件:
redis-py是可選的,只需要運(yùn)行測試用例。
要從PyPI安裝(推薦):
pip?install?rdbtools從源安裝:
git?clone?https://github.com/sripathikrishnan/redis-rdb-tools cd?redis-rdb-tools sudo?python?setup.py?install命令行用法示例
RDB工具的每一次運(yùn)行都需要指定一個命令來指示解析的RDB數(shù)據(jù)應(yīng)該做什么。有效的命令是:json,diff,justkeys,justkeyvals和protocol。
從兩個數(shù)據(jù)庫轉(zhuǎn)儲的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"}}] 過濾解析輸出只有與正則表達(dá)式匹配的進(jìn)程密鑰,只打印鍵和值:
>?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在數(shù)據(jù)庫2中只有以“a”開頭的進(jìn)程散列:
>?rdb?-c?json?--db?2?--type?hash?--key?"a.*"?/var/redis/6379/dump.rdb [{},{ "aroma":{"pungent":"vinegar","putrid":"rotten?eggs","floral":"roses"}}]將轉(zhuǎn)儲文件轉(zhuǎn)換為JSON
的json命令輸出是UTF-8編碼的JSON。默認(rèn)情況下,回調(diào)嘗試使用UTF-8解析RDB數(shù)據(jù),并以\U符號或非UTF-8可解析字節(jié)轉(zhuǎn)義非ASCII碼可打印字符\x。嘗試解碼RDB數(shù)據(jù)可能會導(dǎo)致二進(jìn)制數(shù)據(jù)轉(zhuǎn)換,這可以通過使用該--escape raw選項來避免。另一個選擇是-e base64用于Base64編碼的二進(jìn)制數(shù)據(jù)。
解析轉(zhuǎn)儲文件并在標(biāo)準(zhǔn)輸出上打印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"}]將轉(zhuǎn)儲文件解析為原始字節(jié),并在標(biāo)準(zhǔn)輸出上打印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"}]生成內(nèi)存報告
運(yùn)行時會 -c memory生成一個CSV報告,其中包含該密鑰使用的近似內(nèi)存。--bytes C并且'--largest N可用于將輸出限制為大于C字節(jié)的鍵或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具有以下列 - 數(shù)據(jù)庫號,數(shù)據(jù)類型,密鑰,字節(jié)中使用的內(nèi)存和RDB編碼類型。內(nèi)存使用包括密鑰,值和任何其他開銷。
請注意,內(nèi)存使用情況是近似值。一般來說,使用的實際內(nèi)存將略高于報告的內(nèi)存。
您可以篩選密鑰或數(shù)據(jù)庫號或數(shù)據(jù)類型的報告。
內(nèi)存報告應(yīng)該可以幫助您檢測由應(yīng)用程序邏輯引起的內(nèi)存泄漏。它還將幫助您優(yōu)化Redis內(nèi)存使用。
查找單鍵使用的內(nèi)存
有時您只想找到特定密鑰使用的內(nèi)存,并且在轉(zhuǎn)儲文件上運(yùn)行整個內(nèi)存報告是耗時的。
在這種情況下,您可以使用以下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選項,并將輸出管道輸送到標(biāo)準(zhǔn)排序?qū)嵱贸绦?/p>>?rdb?--command?diff?/var/redis/6379/dump1.rdb?|?sort?>?dump1.txt >?rdb?--command?diff?/var/redis/6379/dump2.rdb?|?sort?>?dump2.txt
然后,運(yùn)行你最喜歡的diff程序
>?kdiff3?dump1.txt?dump2.txt要限制文件的大小,您可以使用該--key選項過濾鍵
發(fā)出Redis協(xié)議
您可以使用該命令將RDB文件轉(zhuǎn)換為redis協(xié)議流protocol。
>?rdb?--c?protocol?/var/redis/6379/dump.rdb *4 $4 HSET $9 users:123 $9 firstname $8 Sripathi您可以將輸出管道傳輸?shù)絥etcat并重新導(dǎo)入數(shù)據(jù)的一個子集。例如,如果要將數(shù)據(jù)分割成兩個redis實例,可以使用--key標(biāo)志來選擇一個數(shù)據(jù)子集,然后將輸出管道傳輸?shù)秸谶\(yùn)行的redis實例以加載該數(shù)據(jù)。閱讀Redis Mass Insert了解更多信息。
當(dāng)打印協(xié)議輸出時,該--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')轉(zhuǎn)載于:https://blog.51cto.com/11736068/1958279
總結(jié)
以上是生活随笔為你收集整理的redis快照文件dump.rdb解析工具--redis-rdb-tools的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring(19)——Profile(
- 下一篇: BZOJ 1001: [BeiJing2