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. 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//dump.rdb > redis_memory_report.csv
内容如下所示:
database,type,key,size_in_bytes,encoding,num_elements,len_largest_element
,string,"ot_0_3b0703c01015ce05f76ef4b977dc020e820d0692",,string,,
,hash,"sences_98558",,hashtable,,
,hash,"sences_170989",,hashtable,,
,hash,"sences_34233",,hashtable,,
单个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:
redis-memory-for-key -h localhost -p user:
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
-a PASSWORD, --password=PASSWORD
Password to use when connecting to the server
-d DB, --db=DB Database number, defaults to
实例如下:
# /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
最新文章
- EF 未应用自动迁移,因为自动迁移会导致数据丢失的解决办法
- Redirecting Console.WriteLine() to Textbox
- umask设置导致的weblogic中的应用上传的文件没有权限打开
- Login oracle for external authenticate
- HttpServletResponse对象(一)
- JDK 常用命令
- 【Vue】动态加载Html片段
- Working with Excel Files in Python
- 用laravel dingo/api创建产品api
- What is AMQP? and the architecture
- Node js : Best way to define entity class
- NLP实现文本分词+在线词云实现工具
- Unity2017烘焙参数设置
- CSS中padding、margin、bordor属性详解
- AVL平衡二叉搜索树原理及各项操作编程实现
- 25.Reverse Nodes in k-Group (List)
- java 简单工厂 工厂模式
- C语言跟内存分配方式-alloc malloc calloc
- JDK 中的监控与故障处理工具-02 (jps)
- centos linux 因别名问题引起的麻烦及解决技巧