工欲善其事必先利其器,日常工作中,好的工具能够高效的协助我们工作;今天介绍一款用来解析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. cuda编程-矩阵乘法(1)

    本方法采用简单的单线程计算每组行和列乘加运算 代码如下: #include <stdio.h> #include <stdlib.h> #include <iostrea ...

  2. Running Web API using Docker and Kubernetes

    Context As companies are continuously seeking ways to become more Agile and embracing DevOps culture ...

  3. Django-urls路由系统

    Django的路由系统 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表. ...

  4. RESTful 架构详解

    RESTful 架构详解 分类 编程技术 1. 什么是REST REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次 ...

  5. C#使用读写锁解决多线程并发写入文件时线程同步的问题

    读写锁是以 ReaderWriterLockSlim 对象作为锁管理资源的,不同的 ReaderWriterLockSlim 对象中锁定同一个文件也会被视为不同的锁进行管理,这种差异可能会再次导致文件 ...

  6. java Builder模式创建不可变类

    package com.geostar.gfstack.operationcenter.logger.manager.common; /** * Created by Nihaorz on 2017/ ...

  7. LVS负载均衡群集

    概述 群集的类型:无论是哪种服务器,都至少包括两台节点服务器,而对外表现为一个整体,只提供一个访问入口(域名或IP地址),相当于一台大型计算机.根据群集所针对的目标差异,可以分为以下三个类型: 1.负 ...

  8. Quartus prime16.0 组合逻辑always块中敏感向量表不全

    前言 组合逻辑always块中向量敏感表不全导致的警告. 流程 1.对于如下代码块: always @(nstate /*or master_din or master_dout_reg*/) beg ...

  9. prufer序列

    介绍 其实是\(pr\ddot{u}fer\)序列 什么是prufer序列? 我们认为度数为\(1\)的点是叶子节点 有一颗无根树,每次选出编号最小的叶子节点,加到当前prufer序列的后面,然后删掉 ...

  10. 爬虫_拉勾网(解析ajax)

    拉勾网反爬虫做的比较严,请求头多添加几个参数才能不被网站识别 找到真正的请求网址,返回的是一个json串,解析这个json串即可,而且注意是post传值 通过改变data中pn的值来控制翻页 job_ ...