工欲善其事必先利其器,日常工作中,好的工具能够高效的协助我们工作;今天介绍一款用来解析redis rdb文件的工具,非常好用。会之,受用无穷!

一、rdbtools工具介绍

源码地址:https://github.com/sripathikrishnan/redis-rdb-tools/

redis-rdb-tools 是一个 python 的解析 rdb 文件的工具,在分析内存的时候,我们主要用它生成内存快照。

主要有以下三个功能:

  • 生成内存快照

  • 转储成 json 格式

  • 使用标准的 diff 工具比较两个 dump 文件

二、redis-rdb-tools 安装

redis-rdb-tools 有两种安装方式,任选其一即可。

1、使用 PYPI 安装

[root@VM_54_118_centos redis]# pip install rdbtools

2、从源码安装

[root@VM_54_118_centos redis]# git clone https://github.com/sripathikrishnan/redis-rdb-tools.git
[root@VM_54_118_centos redis]# cd redis-rdb-tools/
[root@VM_54_118_centos redis-rdb-tools]# python setup.py install

下面开始使用该工具,执行一个简单的命令

[root@VM_54_118_centos redis-rdb-tools]# rdb --command json /wjqdata/redis/rdb/dump.rdb > /wjqdata/redis/rdb/dump.json
WARNING: python-lzf package NOT detected. Parsing dump file will be very slow unless you install it. To install, run the following command:
pip install python-lzf

从报错信息看,是由于缺少python-lzf包,根据提示直接使用pip install python-lzf命令进行安装

解决方法:

# 在安装python-lzf之前,要安装python-devel依赖包,否则安装会失败
[root@VM_54_118_centos yum.repos.d]# yum install python-devel [root@VM_54_118_centos yum.repos.d]# pip install python-lzf
DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7.
Looking in indexes: http://pypi.douban.com/simple
Collecting python-lzf
Downloading http://pypi.doubanio.com/packages/e3/33/b8f67bbe695ccc39f868ae55378993a7bde1357a0567803a80467c8ce1a4/python-lzf-0.2.4.tar.gz
Installing collected packages: python-lzf
Running setup.py install for python-lzf ... done
Successfully installed python-lzf-0.2.4

好了,安装的工作都已经完成了,下面就是使用语法了:
Usage: rdb [options] dump.rdb
Example : rdb –command json -k “user.*” /var/redis/6379/dump.rdb
Options:
-h, –help #显示此帮助消息并退出;
-c FILE, –command=FILE #指定rdb文件;
-f FILE, –file=FILE #指定导出文件;
-n DBS, –db=DBS #解析指定数据库,如果不指定默认包含所有;
-k KEYS, –key=KEYS #指定需要导出的KEY,可以使用正则表达式;
-o NOT_KEYS, –not-key=NOT_KEYS #指定不需要导出的KEY,可以使用正则表达式;
-t TYPES, –type=TYPES #指定解析的数据类型,可能的值有:string,hash,set,sortedset,list;可以提供多个类型,如果没有指定,所有数据类型都返回;
-b BYTES, –bytes=BYTES #限制输出KEY大大小;
-l LARGEST, –largest=LARGEST #根据大小限制的top key;
-e ESCAPE, –escape=ESCAPE #指定输出编码,默认RAW;

转换rdb文件成json格式

[root@VM_54_118_centos redis-rdb-tools]# rdb --command json /wjqdata/redis/rdb/dump.rdb > /wjqdata/redis/rdb/dump.json

查看转化后的json文件

四、生成内存报告

生成CSV格式的内存报告。包含的列有:数据库ID,数据类型,key,内存使用量(byte),编码。内存使用量包含key、value和其他值。
注意:内存使用量是近似的。在一般情况下,略低于实际值。可以根据key或数据库ID或数据类型对报告的内容进行过滤。
内存报告有助于检测是否是应用程序逻辑导致的内存泄露,也有助于优化reids内存使用情况。

[root@VM_54_118_centos rdb]# rdb -c memory /wjqdata/redis/rdb/dump.rdb --bytes 128 -f /wjqdata/redis/rdb/dump_memory.csv

输出字段说明:

database :key在redis的db

type :key类型

key :key值

size_in_bytes :key的内存大小(byte)

encoding :value的存储编码形式

num_elements :key中的value的个数

len_largest_element :key中的value的长度

expiry :key过期时间

按键值大小排序

[root@VM_54_118_centos rdb]# awk -F',' '{print $4,$2,$3,$1}' dump_memory.csv | sort  > dump_memory_csv.sort

分析内存快照
直接将CSV的数据导入到MySQL,这样就可以利用sql语句很方便的对Redis的内存数据进行各种分析了,导入方法自行百度。
数据导入以后,接下来想怎么分析就怎么分析了,举几个简单的例子:

1、查询key的个数

select count(*) from dump_memory;

2、查询总的内存占用

select sum(size_in_bytes) from dump_memory;

3、查询内存占用最高的10个key

select * from dump_memory order by size_in_bytes desc limit 10;

4、查询value个数1000个以上的list

select * from dump_memory where type=’list’ and num_elements > 1000;

通过使用 redis-rdb-tools + mysql的方式,可以方便的对 redis 实例的内存情况进行静态的分析。整个过程也比较简单,获取到 rdb 之后即可。能够帮助排除业务中潜在的风险点,找到业务性能瓶颈。

五、单个key所使用的内存量

有时候,需要查询某个key所使用的内存。如果全部导出来在查找将是很愚蠢且耗时的。对于这种情景,可以使用redis-memory-for-key命令。
redis-memory-for-key需要依赖redis-py包。

[root@VM_54_118_centos ~]# redis-memory-for-key -s 10.66.179.211 -p 6379 -a crs-pte25xxx:XXXXX name
Key name
Bytes 64
Type string

六、比较RDB文件

使用–command diff选项,并通过管道来进行排序。

[root@VM_54_118_centos rdb]# rdb --command diff /wjqdata/redis/rdb/dump1.rdb | sort > dump1.txt
[root@VM_54_118_centos rdb]# rdb --command diff /wjqdata/redis/rdb/dump2.rdb | sort > dump2.txt

使用kdiff3工具来进行比较,kdiff3是图形化的工具,比较直观。kdiff3工具比较两个或三个输入文件或目录。
安装kdiff3(需要epel源)

[root@VM_54_118_centos ~]# yum install kdiff3
[root@VM_54_118_centos rdb]# kdiff3 dump1.txt dump2.txt

使用rdbtools工具来解析redis rdb文件的更多相关文章

  1. Redis RDB文件

    [Redis RDB文件] 1.RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot). RDB 的优点 RDB 是一个非常紧凑(compact)的 ...

  2. redis rdb文件解析

    http://www.ttlsa.com/python/redis-rdb-tools-analysis-of-reids-dump-file-and-memory-usage/ redis-rdb- ...

  3. Redis学习笔记(二)解析dump.rdb文件工具之redis-rdb-tools

    https://github.com/sripathikrishnan/redis-rdb-tools 我这里使用docker搭建 docker搭建文档 https://rdbtools.com/do ...

  4. Redis rdb文件CRC64校验算法 Java实现

    查看RDB文件结构,发现最后的8字节是CRC64校验算得,从文件头开始直到8字节校验码前的FF结束码(含),经过CRC64校验计算发现,貌似最后的8字节是小端模式实现的. 参考redis的crc64实 ...

  5. Redis RDB 分析工具 rdbtools 说明

    背景 Redis是基于内存的KV数据库,内存作为存储介质,关注其内存的使用情况是一个重要指标,解析其内部的存储信息是给出优化方法和维护的最基本要求.解析内存有二种方法:第一个是通过scan遍历所有ke ...

  6. 如何解析 redis 的 rdb 文件

    目录 安装工具 解析 redis 的 rdb 文件 命令行工具使用,先看 --help 生成内存报告 使用参数过滤想要的数据 比较两个 rdb 文件 查看一个 key 的内存使用情况 常见问题 FAQ ...

  7. Redis 数据恢复方法,redis-port 工具将自建 redis 的 rdb文件同步到云数据库

    1. Redis 恢复的机制 如果只配置 AOF ,重启时加载 AOF 文件恢复数据: 如果同时配置了 RDB 和 AOF ,启动是只加载 AOF 文件恢复数据: 如果只配置 RDB,启动是将加载 d ...

  8. Golang 实现 Redis(11): RDB 文件解析

    RDB 文件使用二进制方式存储 Redis 内存中的数据,具有体积小.加载快的优点.本文主要介绍 RDB 文件的结构和编码方式,并借此探讨二进制编解码和文件处理方式,希望对您有所帮助. 本文基于 RD ...

  9. Redis 源码简洁剖析 13 - RDB 文件

    RDB 是什么 RDB 文件格式 Header Body DB Selector AUX Fields Key-Value Footer 编码算法说明 Length 编码 String 编码 Scor ...

随机推荐

  1. Asp.Net Core 输出 Word

    In one of the ASP.NET Core projects we did in the last year, we created an OutputFormatter to provid ...

  2. [Codeforces741D]Arpa's letter-marked tree and Mehrdad's Dokhtar-kosh paths——dsu on tree

    题目链接: Codeforces741D 题目大意:给出一棵树,根为$1$,每条边有一个$a-v$的小写字母,求每个点子树中的一条最长的简单路径使得这条路径上的边上的字母重排后是一个回文串. 显然如果 ...

  3. P1282 多米诺骨牌 dp

    思路:dp[i][j] 的j是上半段的和的值   这里表示的是达到上半段值是j的最小次数 答案在最小的可达到的j #include<bits/stdc++.h> using namespa ...

  4. Machine Schedule POJ - 1325(水归类建边)

    Machine Schedule Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 17457   Accepted: 7328 ...

  5. Git神器使用相关

    感谢 感谢作者的网站,本文所有的知识可以在上述网站了解到,讲的非常详细,感谢.(https://www.liaoxuefeng.com/wiki/0013739516305929606dd183612 ...

  6. POI中不推荐的方法与其替代的方法

    不推荐getCellType(),推荐getCellTypeEnum() if(tcell.getCellTypeEnum() == CellType.NUMERIC){ System.out.pri ...

  7. 洛谷 P4705 玩游戏 解题报告

    P4705 玩游戏 题意:给长为\(n\)的\(\{a_i\}\)和长为\(m\)的\(\{b_i\}\),设 \[ f(x)=\sum_{k\ge 0}\sum_{i=1}^n\sum_{j=1}^ ...

  8. [ZJOI2007]时态同步(dfs+贪心)

    小Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字1,2,3.进行标号.电路板的各个节点由若干不相交的导线相连接,且对于电路板的任何两个节点,都存在且仅 ...

  9. JSOI2014骑士游戏(最短路)

    题目背景 长期的宅男生活中,JYY又挖掘出了一款RPG游戏.在这个游戏中JYY会 扮演一个英勇的骑士,用他手中的长剑去杀死入侵村庄的怪兽. 题目描述 在这个游戏中,JYY一共有两种攻击方式,一种是普通 ...

  10. 51nod 1105(第K大数 二分套二分)

    题目链接:http://www.51nod.com/onlineJudge/submitDetail.html#!judgeId=620811 参考自:https://blog.csdn.net/f_ ...