使用redis-rdb-tools解析reids dump.rdb文件及分析內存使用量

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

查看方法一:使用string方法能夠查看

查看方法二:以下

如今愈來愈多人開始使用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格式的內存報告。
    包含的列有:數據庫ID,數據類型,key,內存使用量(byte),編碼。
    內存使用量包含key、value和其餘值。
    注意:內存使用量是近似的。在通常狀況下,略低於實際值。
    能夠根據key或數據庫ID或數據類型對報告的內容進行過濾。
    內存報告有助於檢測是不是應用程序邏輯致使的內存泄露,也有助於優化reids內存使用狀況。

    4. 查看某個key的內存使用狀況:

    有時候,須要查詢某個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 redis
    5. 比較兩個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

相關文章
相關標籤/搜索