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包。
-
# /usr/local/python/bin/pip install redis
-
# /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選項,並通過管道來進行排序。
-
# /usr/local/python/bin/rdb --command diff /data/redis_data/6379/dump.rdb | sort > dump1.txt
-
# /usr/local/python/bin/rdb --command diff /data/redis_data/6379/dump.rdb | sort > dump2.txt
-
diff dump1.txt dump2.txt