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包。

  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:
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选项,并通过管道来进行排序。

    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

最新文章

  1. EF 未应用自动迁移,因为自动迁移会导致数据丢失的解决办法
  2. Redirecting Console.WriteLine() to Textbox
  3. umask设置导致的weblogic中的应用上传的文件没有权限打开
  4. Login oracle for external authenticate
  5. HttpServletResponse对象(一)
  6. JDK 常用命令
  7. 【Vue】动态加载Html片段
  8. Working with Excel Files in Python
  9. 用laravel dingo/api创建产品api
  10. What is AMQP? and the architecture
  11. Node js : Best way to define entity class
  12. NLP实现文本分词+在线词云实现工具
  13. Unity2017烘焙参数设置
  14. CSS中padding、margin、bordor属性详解
  15. AVL平衡二叉搜索树原理及各项操作编程实现
  16. 25.Reverse Nodes in k-Group (List)
  17. java 简单工厂 工厂模式
  18. C语言跟内存分配方式-alloc malloc calloc
  19. JDK 中的监控与故障处理工具-02 (jps)
  20. centos linux 因别名问题引起的麻烦及解决技巧

热门文章

  1. JSP简单练习-一个简单的计数器
  2. 分布式-技术专区-Redis分布式锁实现-第一步
  3. Python之变量作用域
  4. postgresql 数据库的备份和还原
  5. 第四章 K8s部署安装
  6. Java 多态基础
  7. Eclipse导入的Maven项目没有Build Path
  8. qt中使用sqlite存储数据
  9. 使用SpringBoot AOP 记录操作日志、异常日志
  10. js-原生js触发器使用