Oschina的編輯器依舊這麼的蛋疼 ,哎寫一篇文章改好屢次格式問題。
python
redis文件中的dump.rdb文件是怎麼生成的 git
簡而言之,dump.rdb是由Redis服務器自動生成的。
默認狀況下 每隔一段時間redis服務器程序會自動對數據庫作一次遍歷,把內存快照寫在一個叫作「dump.rdb」的文件 裏,這個持久化機制叫作SNAPSHOT。有了SNAPSHOT後,若是服務器宕機,從新啓動redis服務器程序時redis會自動加載 dump.rdb,將數據庫狀態恢復到上一次作SNAPSHOT時的狀態。 至於多久作一次SNAPSHOT,SNAPSHOT文件的路徑和文件名,你能夠在redis的conf文件裏指定。除了SNAPSHOT, redis還支持AOF持久化。
ps:(本身備註) github
如今愈來愈多人開始使用Redis了,主要是由於它十分高效、性能強勁、擴展性好。 web
Rdbtools是一個解析dump.rdb文件,並生成內存報告的分析工具,對咱們更好地使用Redis很是有幫助,是一個不可多得的利器。1. 開始安裝,使用pip,一個pythoner喜歡用的工具: 正則表達式
# /usr/local/python/bin/easy_install pip
# /usr/local/python/bin/pip install rdbtools
注意pip的版本問題,pip爲pip==1.5.6的時候,須要設置sudo easy_install requests==2.3.0,此時的python版本爲2.7
後來看pip官方說在pip1.6的時候進行了修復,未測試(後續遇到了再說)
若是您想從源碼安裝,能夠這樣作,當前前提是您已有git客戶端: redis
git clone https://github.com/sripathikrishnan/redis-rdb-tools cd redis-rdb-tools sudo python setup.py install
2. 好了,讓咱們來看一下如何轉換dump.rdb文件爲JSON格式,查看幫助: shell
# /usr/local/python/bin/rdb --help Usage: rdb [options] /path/to/dump.rdb Example : rdb --command json -k "user.*" /var/redis/6379/dump.rdb Options: -h, --help show this help message and exit -c FILE, --command=FILE 要執行的命令json 或 diff -f FILE, --file=FILE 輸出文件名 -n DBS, --db=DBS 數據庫ID。能夠提供多個數據庫。若是沒有指定,包含全部數據庫。 -k KEYS, --key=KEYS 導出鍵。能夠是正則表達式。 -t TYPES, --type=TYPES 數據類型。可能的值有:string, hash, set, sortedset, list。 能夠提供多個類型。若是沒有指定,全部數據類型都返回。
看了上面幫助,大概知道怎麼操做了: 數據庫
# 解析並向屏幕打印輸出json數據 rdb --command json /var/redis/6379/dump.rdb # 只輸出匹配某個key的數據 rdb --command json --key "user.*" /var/redis/6379/dump.rdb # 只解析位於數據庫ID爲2且以「a」爲開頭的hash數據 rdb --command json --db 2 --type hash --key "a.*" /var/redis/6379/dump.rdb
3. 生成內存數據報告: json
rdb -c memory /var/redis/6379/dump.rdb > memory.csv生成CSV格式的內存報告。
有時候,須要查詢某個key所使用的內存,若是所有導出來在查找將是很愚蠢且耗時的,對於這種情景,可使用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" Bytes 111 Type hash Encoding ziplist Number of Elements 2 Length of Largest Element 8
若是出現如下錯誤信息,請記得安裝redis模塊,由於redis-memory-for-key依賴redis-py包。
Traceback (most recent call last): File "/usr/local/python/bin/redis-memory-for-key", line 8, in <module> load_entry_point('rdbtools==0.1.5', 'console_scripts', 'redis-memory-for-key')() from redis import StrictRedis ImportError: No module named redis5. 比較兩個dump.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 diff dump1.txt dump2.txt
但若是想顯示得更直觀些,可使用kdiff3,由於Kdiff3是圖形化工具:
kdiff3 dump1.txt dump2.txt
一樣,按照官方介紹,你也可使用解析器來分析,示例代碼以下:
import sys from rdbtools import RdbParser, RdbCallback class MyCallback(RdbCallback) : ''' Simple example to show how callback works. See RdbCallback for all available callback methods. See JsonCallback for a concrete example ''' def set(self, key, value, expiry): print('%s = %s' % (str(key), str(value))) def hset(self, key, field, value): print('%s.%s = %s' % (str(key), str(field), str(value))) def sadd(self, key, member): print('%s has {%s}' % (str(key), str(member))) def rpush(self, key, value) : print('%s has [%s]' % (str(key), str(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')
使用redis-rdb-tools分析:http://space.wudiweb.com/phychion/blog/95
redis-rdb-tools官方:https://github.com/sripathikrishnan/redis-rdb-tools
redis的.rdb是什麼:http://zhidao.baidu.com/link?url=PR5zyWATKdIwF2qPRtev-KheJdF_qxOtV8Dyyl0JTeCKScG4SVkFZEJm9ZhP68clDkLNiD6RdzhJ2r2tk4C_VftzzaPeGRUzM3qxNNA0Moe