redis 分析rdb中key


1.問題:

單位一個redis集群內存報警,想找出所有的key的列表?

2.解決辦法:

網上搜索是可以用redis-rdb-tools 這個工具進行分析

 (1)centos6 默認安裝python2.6,需要安裝python2.7環境

       

wget https://centos6.iuscommunity.org/ius-release.rpm
rpm -Uvh ius-release.rpm
yum install python27 python27-devel python27-pip

 (2)下載redis-rdb-tools 源碼包

 

wget https://github.com/sripathikrishnan/redis-rdb-tools/archive/master.zip
unzip master.zip 
cd redis-rdb-tools-master/
python2.7 setup.py install

   安裝python-lzf時遇到問題:

error: command 'gcc' failed with exit status 1

 解決方法:

$ sudo yum -y install gcc gcc-c++ kernel-devel

$ sudo yum -y install python-devel libxslt-devel libffi-devel openssl-devel

$ pip install python-lzf  

 

上面用python2.6會有問題

  (3)然后用rdb分析rdb的dump

  獲取對應redis的rdb文件,使用redis-rdb-tools生成內存快照

#/usr/bin/rdb -c memory dump.rdb >redis_dump.txt
 #sort -t, -k4nr redis_dump.txt

 

(4)把數據導入sqlite(mysql數據庫實際上都能導入),sqlite語法和mysql基本一致

splite3 test.db

sqlite> create table memory(database int,type varchar(128),key varchar(128),size_in_bytes int,encoding varchar(128),num_elements int,len_largest_element varchar(128),time varchar(128));

sqlite>.mode csv memory

 sqlite>.import memory.csv memory

 

(5)查詢

查詢key個數

sqlite>select count(*) from memory;

查詢總的內存占用

sqlite> select sum(size_in_bytes) from memory;

查詢內存占用最高的10個key

sqlite>select * from memory order by size_in_bytes desc limit 10;

擴展:

轉換dump文件到JSON

 3.1 解析dump文件並以JSON格式標准輸出

# /usr/local/python/bin/rdb --command json /data/redis_data/6379/dump.rdb

3.2 只解析符合正則的keys

# /usr/local/python/bin/rdb --command json --key "sences_2.*" /data/redis_data/6379/dump.rdb

3.3 只解析以“a”為開頭的hash且位於數據庫ID為2的

# /usr/local/python/bin/rdb --command json --db 2 --type hash --key "a.*" /data/redis_data/6379/dump.rdb

生成內存報告

生成CSV格式的內存報告。包含的列有:數據庫ID,數據類型,key,內存使用量(byte),編碼。內存使用量包含key、value和其他值。
注意:內存使用量是近似的。在一般情況下,略低於實際值。
可以根據key或數據庫ID或數據類型對報告的內容進行過濾。
內存報告有助於檢測是否是應用程序邏輯導致的內存泄露,也有助於優化reids內存使用情況。

可以使用--help中,有一個命令查詢前多少個key占內存最大,具體是哪個命令忘了

 

# /usr/local/python/bin/rdb -c memory /data/redis_data/6379/dump.rdb > redis_memory_report.csv
內容如下所示:
database,type,key,size_in_bytes,encoding,num_elements,len_largest_element
0,string,"ot_0_3b0703c01015ce05f76ef4b977dc020e820d0692",351,string,184,184
0,hash,"sences_98558",1703,hashtable,10,132
0,hash,"sences_170989",1698,hashtable,10,138
0,hash,"sences_34233",1673,hashtable,10,115

單個key所使用的內存量

有時候,需要查詢某個key所使用的內存。如果全部導出來在查找將是很愚蠢且耗時的。對於這種情景,可以使用redis-memory-for-key命令。
如果出現下面信息,需要安裝redis模塊。redis-memory-for-key依賴redis-py包。

 

  1. # /usr/local/python/bin/pip install redis
  2.  
    # /usr/local/python/bin/easy_install redis      
# /usr/local/python/bin/redis-memory-for-key --help
Usage: redis-memory-for-key [options] redis-key
Examples :
redis-memory-for-key user:13423
redis-memory-for-key -h localhost -p 6379 user:13423
Options:
  -h, --help            show this help message and exit
  -s HOST, --server=HOST
                        Redis Server hostname. Defaults to 127.0.0.1
  -p PORT, --port=PORT  Redis Server port. Defaults to 6379
  -a PASSWORD, --password=PASSWORD
                        Password to use when connecting to the server
  -d DB, --db=DB        Database number, defaults to 0

 

實例如下:

       

# /usr/local/python/bin/redis-memory-for-key -s 10.1.242.124   sence_167989
Key                             "sence_167989"
Bytes                           2712.0
Type                            hash
Encoding                        hashtable
Number of Elements              15
Length of Largest Element       22

  

比RDB文件

使用–command diff選項,並通過管道來進行排序。

    1.  
      # /usr/local/python/bin/rdb --command diff /data/redis_data/6379/dump.rdb | sort > dump1.txt
    2.  
      # /usr/local/python/bin/rdb --command diff /data/redis_data/6379/dump.rdb | sort > dump2.txt
    3.  diff dump1.txt dump2.txt

 

 

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM