redis快照文件dump.rdb解析工具--redis-rdb-tools

解析Redis dump.rdb文件,分析内存并将数据导出到JSON

Rdbtools是Redis的dump.rdb文件的解析器。解析器生成类似于xml sax解析器的事件,并且非常有效的内存明智。

此外,rdbtools还提供实用程序:

在所有数据库和密钥中生成数据的内存报告

将转储文件转换为JSON

使用标准差异工具比较两个转储文件

Rdbtools是用Python编写的,虽然有其他语言的类似项目。请参见常见问题以获取更多信息。

安装rdbtools

前提条件:

redis-py是可选的,只需要运行测试用例。

要从PyPI安装(推荐):

pip install rdbtools

从源安装:

git clone https://github.com/sripathikrishnan/redis-rdb-tools
cd redis-rdb-tools
sudo python setup.py install

命令行用法示例

RDB工具的每一次运行都需要指定一个命令来指示解析的RDB数据应该做什么。有效的命令是:json,diff,justkeys,justkeyvals和protocol。

从两个数据库转储的JSON:

> rdb --command json /var/redis/6379/dump.rdb
[{
"user003":{"fname":"Ron","sname":"Bumquist"},
"lizards":["Bush anole","Jackson‘s chameleon","Komodo dragon","Ground agama","Bearded dragon"],
"user001":{"fname":"Raoul","sname":"Duke"},
"user002":{"fname":"Gonzo","sname":"Dr"},
"user_list":["user003","user002","user001"]},{
"baloon":{"helium":"birthdays","medical":"angioplasty","weather":"meteorology"},
"armadillo":["chacoan naked-tailed","giant","Andean hairy","nine-banded","pink fairy"],
"aroma":{"pungent":"vinegar","putrid":"rotten eggs","floral":"roses"}}]
过滤解析输出

只有与正则表达式匹配的进程密钥,只打印键和值:

> rdb --command justkeyvals --key "user.*" /var/redis/6379/dump.rdb
user003 fname Ron,sname Bumquist,
user001 fname Raoul,sname Duke,
user002 fname Gonzo,sname Dr,
user_list user003,user002,user001

在数据库2中只有以“a”开头的进程散列:

> rdb -c json --db 2 --type hash --key "a.*" /var/redis/6379/dump.rdb
[{},{
"aroma":{"pungent":"vinegar","putrid":"rotten eggs","floral":"roses"}}]

将转储文件转换为JSON

的json命令输出是UTF-8编码的JSON。默认情况下,回调尝试使用UTF-8解析RDB数据,并以\U符号或非UTF-8可解析字节转义非ASCII码可打印字符\x。尝试解码RDB数据可能会导致二进制数据转换,这可以通过使用该--escape raw选项来避免。另一个选择是-e base64用于Base64编码的二进制数据。

解析转储文件并在标准输出上打印JSON:

> rdb -c json /var/redis/6379/dump.rdb
[{
"Citat":["B\u00e4ttre sent \u00e4n aldrig","Bra karl reder sig sj\u00e4lv","Man ska inte k\u00f6pa grisen i s\u00e4cken"],
"bin_data":"\\xFE\u0000\u00e2\\xF2"}]

将转储文件解析为原始字节,并在标准输出上打印JSON:

> rdb -c json /var/redis/6379/dump.rdb --escape raw
[{
"Citat":["B\u00c3\u00a4ttre sent \u00c3\u00a4n aldrig","Bra karl reder sig sj\u00c3\u00a4lv","Man ska inte k\u00c3\u00b6pa grisen i s\u00c3\u00a4cken"],
"bin_data":"\u00fe\u0000\u00c3\u00a2\u00f2"}]

生成内存报告

运行时会 -c memory生成一个CSV报告,其中包含该密钥使用的近似内存。--bytes C并且‘--largest N可用于将输出限制为大于C字节的键或N个最大键。

> rdb -c memory /var/redis/6379/dump.rdb --bytes 128 -f memory.csv
> cat memory.csv
database,type,key,size_in_bytes,encoding,num_elements,len_largest_element
0,list,lizards,241,quicklist,5,19
0,list,user_list,190,quicklist,3,7
2,hash,baloon,138,ziplist,3,11
2,list,armadillo,231,quicklist,5,20
2,hash,aroma,129,ziplist,3,11

生成的CSV具有以下列 - 数据库号,数据类型,密钥,字节中使用的内存和RDB编码类型。内存使用包括密钥,值和任何其他开销。

请注意,内存使用情况是近似值。一般来说,使用的实际内存将略高于报告的内存。

您可以筛选密钥或数据库号或数据类型的报告。

内存报告应该可以帮助您检测由应用程序逻辑引起的内存泄漏。它还将帮助您优化Redis内存使用。

查找单键使用的内存

有时您只想找到特定密钥使用的内存,并且在转储文件上运行整个内存报告是耗时的。

在这种情况下,您可以使用以下redis-memory-for-key命令:

> redis-memory-for-key person:1
> redis-memory-for-key -s localhost -p 6379 -a mypassword person:1
Key person:1
Bytes111
Typehash
Encodingziplist
Number of Elements2
Length of Largest Element8

注意 :

这被添加到redis-rdb-tools版本0.1.3

这个命令依赖于redis-py包

比较RDB文件

首先,使用--command diff选项,并将输出管道输送到标准排序实用程序

> rdb --command diff /var/redis/6379/dump1.rdb | sort > dump1.txt
> rdb --command diff /var/redis/6379/dump2.rdb | sort > dump2.txt

然后,运行你最喜欢的diff程序

> kdiff3 dump1.txt dump2.txt

要限制文件的大小,您可以使用该--key选项过滤键

发出Redis协议

您可以使用该命令将RDB文件转换为redis协议流protocol。

> rdb --c protocol /var/redis/6379/dump.rdb
*4
$4
HSET
$9
users:123
$9
firstname
$8
Sripathi

您可以将输出管道传输到netcat并重新导入数据的一个子集。例如,如果要将数据分割成两个redis实例,可以使用--key标志来选择一个数据子集,然后将输出管道传输到正在运行的redis实例以加载该数据。阅读Redis Mass Insert了解更多信息。

当打印协议输出时,该--escape选项可用于printable或utf8避免不可打印/控制字符。

使用解析器

from rdbtools import RdbParser, RdbCallback
from rdbtools.encodehelpers import bytes_to_unicode
class MyCallback(RdbCallback):
    ‘‘‘ Simple example to show how callback works.
        See RdbCallback for all available callback methods.
        See JsonCallback for a concrete example
    ‘‘‘
    def __init__(self):
        super(MyCallback, self).__init__(string_escape=None)
    def encode_key(self, key):
        return bytes_to_unicode(key, self._escape, skip_printable=True)
    def encode_value(self, val):
        return bytes_to_unicode(val, self._escape)
    def set(self, key, value, expiry, info):
        print(‘%s = %s‘ % (self.encode_key(key), self.encode_value(value)))
    def hset(self, key, field, value):
        print(‘%s.%s = %s‘ % (self.encode_key(key), self.encode_key(field), self.encode_value(value)))
    def sadd(self, key, member):
        print(‘%s has {%s}‘ % (self.encode_key(key), self.encode_value(member)))
    def rpush(self, key, value):
        print(‘%s has [%s]‘ % (self.encode_key(key), self.encode_value(value)))
    def zadd(self, key, score, member):
        print(‘%s has {%s : %s}‘ % (str(key), str(member), str(score)))
callback = MyCallback()
parser = RdbParser(callback)
parser.parse(‘/var/redis/6379/dump.rdb‘)
时间: 2024-11-08 02:08:23

redis快照文件dump.rdb解析工具--redis-rdb-tools的相关文章

redis数据库通过dump.rdb文件恢复数据库或者数据库迁移

环境:centos7.2软件:redis-3.2.10(yum安装) 情景一:公司之前的redis没有开启aof模式,一直是rdb模式,但是数据又非常重要,数据一点也不能丢失,所以需要开启aof,但是redis默认是从appendonly.aof加载数据,systemctl start redis的时候,数据库是空的,因为我们并没有appendonly.aof文件,而且关闭redis的时候,会把dump.rdb清空 情景二:redis数据库迁移,我们可以只用dump.rdb文件,因为dump.r

redis学习(二)redis.conf文件配置

取自: https://www.cnblogs.com/pqchao/p/6558688.html 为了更好的使用redis,我们需要详细的了解redis配置文件及相关参数作用. bind 127.0.0.1 bind 192.168.1.100 绑定redis服务器网卡IP,默认为127.0.0.1,即本地回环地址.这样的话,访问redis服务只能通过本机的客户端连接,而无法通过远程连接.如果bind选项为空的话,那会接受所有来自于可用网络接口的连接.如上配置,绑定一个127.0.0.1的本机

Redis源码分析(一)--Redis结构解析

从今天起,本人将会展开对Redis源码的学习,Redis的代码规模比较小,非常适合学习,是一份非常不错的学习资料,数了一下大概100个文件左右的样子,用的是C语言写的.希望最终能把他啃完吧,C语言好久不用,快忘光了.分析源码的第一步,先别急着想着从哪开始看起,先浏览一下源码结构,可以模块式的渐入,不过比较坑爹的是,Redis的源码全部放在在里面的src目录里,一下90多个文件统统在里面了,所以我选择了拆分,按功能拆分,有些文件你看名字就知道那是干什么的.我拆分好后的而结果如下: 11个包,这样每

redis快照与AOF

我们知道,redis的数据是保存在内存里,而内存一断电就没了,所以为了数据持久化,我们得想办法把内存中的数据持久化到硬盘或者另一台机子上. 先说本地持久化到硬盘,这就有两种方式,一是快照(snapshotting),二是只追加文件(append-only file AOF) 快照 快照的核心原理就是把redis在某个时间内存内的所有数据都写入硬盘,那么什么时候写入呢?快照的配置都有哪些呢?出现下面的情况redis会快照内存里的数据1 用户发送bgsave命令(此时redis会fork一个子进程,

Redis快照原理详解

本文对Redis快照的实现过程进行介绍,了解Redis快照实现过程对Redis管理很有帮助. Redis默认会将快照文件存储在Redis当前进程的工作目录中的dump.rdb文件中,可以通过配置dir和dbfilename两个参数分别指定快照文件的存储路径和文件名.快照的过程如下. (1)Redis使用fork函数复制一份当前进程(父进程)的副本(子进程):(2)父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中的临时文件:(3)当子进程写入完所有数据后会用该临时文件替换

redis的redis.conf文件详解

是2.6.12版本的 1 redis.conf配置文件 2 3 # Redis configuration file example 4 5 # Note on units: when memory size is needed, it is possible to specifiy 6 # it in the usual form of 1k 5GB 4M and so forth: 7 # 8 # 1k => 1000 bytes 9 # 1kb => 1024 bytes 10 # 1m

redis.conf文件配置

最重要三个配置 1. bind 127.0.0.1 需要注释掉这一行,使别的主机可以访问 2. daemonize no 需要改为yes,使其后台运行 3. requirepass foobared 为redis配置密码 主要配置说明 配置项 说明 daemonize no Redis 默认不是以守护进程的方式运行,可以通过该配置项修改,使用 yes 启用守护进程(Windows 不支持守护线程的配置为 no ) pidfile /var/run/redis.pid 当 Redis 以守护进程方

redis aof文件过大问题

http://www.itnose.net/detail/6682725.html 最近新安装了一台redis,版本为redis-3.2.5 数据盘用的是固态硬盘. 之前用的是普通硬盘,redis日志天天报 Asynchronous AOF fsync is taking too long (disk is busy?). Writing the AOF buffer without waiting for fsync to complete, this may slow down Redis.

Redis解决强制关闭Redis快照导致不能持久化错误

今天在使用composer添加Redis缓存的时候,运行Redis发生错误: 127.0.0.1:6379> set dachou dadachou (error) MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis