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

redis 分析rdb中key的更多相关文章

  1. Redis可视化内存分析工具--RDR:查看Redis中key的占用情况

    RDR(redis datareveal)是一个解析redis rdbfile的工具.与redis-rdb-tools 相比,RDR 是由 golang 实现的,速度要快得多(5GB rdbfile ...

  2. redis中key的过期键删除策略

    Redis过期键删除策略 Redis key过期的方式有三种: 被动删除:当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key 主动删除:由于惰性删除策略无法保证冷数据被及时删 ...

  3. redis 在 php 中的应用(key篇)

    本文为我阅读了 redis参考手册 之后结合 博友的博客 编写,注意 php_redis 和 redis-cli 的区别(主要是返回值类型和参数用法) 目录: KEY(键) DEL           ...

  4. redis中key过期事件

    刚到新公司一个月左右,有个新需求,想做定时任务,比如在用户注册时间的3天后推送用户一条消息. 从刚开始脑子里面闪现的数据库轮询,立马否定掉(浪费资源),再到linux系统的定时任务,但是当用户量过大时 ...

  5. 【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据

    任务描述 本次集中介绍使用Windows和Linux()搭建本地Redis服务器的步骤,从备份的RDB文件中加载数据,以及如何生成AOF文件和通过AOF文件想已经运行的Redis追加数据. 操作步骤 ...

  6. 4、解析配置文件 redis.conf、Redis持久化RDB、Redis的主从复制

    1.Units单位 配置大小单位,开头定义了一些基本的度量单位,只支持bytes,不支持bit 对大小写不敏感 2.INCLUDES包含 和我们的Struts2配置文件类似,可以通过includes包 ...

  7. Redis 在新浪微博中的应用

    Redis 在新浪微博中的应用 Redis简介 1. 支持5种数据结构 支持strings, hashes, lists, sets, sorted setsstring是很好的存储方式,用来做计数存 ...

  8. 【*】Redis实战场景中相关问题

    一.Redis简介 redis主要解决的问题 分布式缓存是分布式系统中的重要组件,主要解决高并发.大数据场景下,热点数据访问的性能问题,提供高性能的数据快速访问. 使用缓存常见场景 项目中部分数据访问 ...

  9. 【转载】Redis在新浪微博中的应用

    转载自文章 http://blog.me115.com/2013/12/19/redis-e5-9c-a8-e6-96-b0-e6-b5-aa-e5-be-ae-e5-8d-9a-e4-b8-ad-e ...

随机推荐

  1. v-slot vue2.6新增指令使用指南

    子组件 <template> <div class="wrapper"> <slot name="demo" :msg=" ...

  2. cas4.2.7 集群服务搭建

    cas服务端集群,网上资料很多,无非就是session共享,ticket共享. 但是session共享是必须的吗?或者能实现集群吗? 实践: 1. ticket共享,直接上代码 package org ...

  3. 提交disable的Select值到后台

    需求:界面上把select控件disable,然后将默认值传到后台 问题1:select disable: js中可以这样写: document.getElementById("provin ...

  4. .net EntityFramework dbContext 如何实例化

    1 .DbContext怎么在Asp.mvc中使如何实例化 public class Repository { //实例化EF容器:有弊端.一个线程里可能会创建多个DbContext //DbCont ...

  5. 2018-8-10-win10-uwp-json

    title author date CreateTime categories win10 uwp json lindexi 2018-08-10 19:16:53 +0800 2018-2-13 1 ...

  6. mysql binlog相关

    1.清除的binlog   删除所有binlog日志,新日志编号从头开始 RESET MASTER;   删除mysql-bin.XXXX之前所有日志 PURGE MASTER LOGS TO 'my ...

  7. Thunar 右键菜单等自定义

    Thunar 右键菜单等自定义 可以使用图形界面或者直接编辑配置文件,二者是等价的. 图形界面: 以给"zip,rar,7z"等文件添加"在此位置使用unar解压缩&qu ...

  8. iptables 防火墙(下)

    iptables 防火墙(下) 1. 常见的隐含匹配条件: 1.1 端口匹配: --sport 源端口.--dport 目的端口 1.2 TCP标记匹配: -tcp-flags 检查范围被设置的标记 ...

  9. zabbix生产环境案例(三)

    生产环境案例(三) 链接:https://pan.baidu.com/s/1q5YwJMTcZLcS5OQ0iOu44A 提取码:8gdi 复制这段内容后打开百度网盘手机App,操作更方便哦 1. Z ...

  10. _declspec(dllexport)和.def(转)

    节选自:windows下编译和使用动态库dll http://blog.eonew.cn/archives/865 Microsoft 在 Visual C++ 的 16 位编译器版本中引入了 __e ...