安装工具

pip install rdbtools python-lzf

或者

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

解析 redis 的 rdb 文件

命令行工具使用,先看 --help

usage: usage: rdb [options] /path/to/dump.rdb

Example : rdb --command json -k "user.*" /var/redis/6379/dump.rdb

positional arguments:
dump_file RDB Dump file to process optional arguments:
-h, --help show this help message and exit
-c CMD, --command CMD
Command to execute. Valid commands are json, diff,
justkeys, justkeyvals, memory and protocol
-f FILE, --file FILE Output file
-n DBS, --db DBS Database Number. Multiple databases can be provided.
If not specified, all databases will be included.
-k KEYS, --key KEYS Keys to export. This can be a regular expression
-o NOT_KEYS, --not-key NOT_KEYS
Keys Not to export. This can be a regular expression
-t TYPES, --type TYPES
Data types to include. Possible values are string,
hash, set, sortedset, list. Multiple typees can be
provided. If not specified, all data types will be
returned
-b BYTES, --bytes BYTES
Limit memory output to keys greater to or equal to
this value (in bytes)
-l LARGEST, --largest LARGEST
Limit memory output to only the top N keys (by size)
-e {raw,print,utf8,base64}, --escape {raw,print,utf8,base64}
Escape strings to encoding: raw (default), print,
utf8, or base64.
-x, --no-expire With protocol command, remove expiry from all keys
-a N, --amend-expire N
With protocol command, add N seconds to key expiry
time

参数解析

  1. -c 执行命令 输出不同格式的数据

    1. json; 输出 json 格式的字符串 如: [{"int":"1"}]
    2. diff; 导出可供 diff 、kdiff 、 vimdiff 比较的数据
    3. justkeys; 只输出 key
    4. justkeyvals; 只输出键值对,以空格分隔
    5. memory; 输出内存分布状态
    6. protocol; 输出原始的 RESP 协议
  2. -f 指定输出到文件
  3. -n 指定输出的 db
  4. -k 指定输出哪些 key; 可以使用正则表达式, 如: '^users_\d+$'
  5. -o 排除哪些 key; 可以使用正则表达式
  6. -t 指定输出 value 的类型
  7. -b 指定大于此字节数的 key 输出
  8. -l 输出最大的多少个 key
  9. -e 转义字符串到其他格式
    1. raw 原始字符串
    2. print
    3. utf8 输出原始 utf8 格式字符串
    4. base64 对于二进制数据来说,可以先 base64 存储到文件,然后在程序中 decode 出来
  10. -x 在导出 RESP 协议内容时,去掉过期时间
  11. -a 导出 RESP 协议内容时,给有过期时间的 key 加上几秒钟过期时间

下面看一下一些常见用法:

生成内存报告

rdb --command memory dump.rdb > memory.csv

生成 CSV 格式的内存报告。包含的列有:

数据库 ID,数据类型,key,内存使用量(byte),编码。内存使用量包含 key、value 和其他值,结果:

database,type,key,size_in_bytes,encoding,num_elements,len_largest_element,expiry
0,set,fruit,252,hashtable,2,6,
0,hash,webset,81,ziplist,1,13,
0,string,baiduyun,64,string,5,5,
0,list,languages,161,quicklist,2,6,
0,sortedset,page_rank,80,ziplist,1,9

使用参数过滤想要的数据

# 使用这个命令会将存储的 int 值显示为 json 的字符串
> rdb -c json --db 2 --type hash --key "a.*" /var/redis/6379/dump.rdb [{},{
"aroma":{"pungent":"vinegar","putrid":"rotten eggs","floral":"roses"}}]

比较两个 rdb 文件

> rdb --command diff /var/redis/6379/dump1.rdb | sort > dump1.txt
> rdb --command diff /var/redis/6379/dump2.rdb | sort > dump2.txt # 使用 diff 软件查看 diff
> kdiff3 dump1.txt dump2.txt

查看一个 key 的内存使用情况

> redis-memory-for-key person:1

> redis-memory-for-key -s localhost -p 6379 -a mypassword person:1

Key 			person:1
Bytes 111
Type hash
Encoding ziplist
Number of Elements 2
Length of Largest Element 8 # hash 中占用内存最大的那个 value 的占用字节数

常见问题 FAQ

  • 内存报告的精确度如何?

    答:最多有 10% 的误差

  • 存储了一个二进制 binary 数据,但是输出的时候是乱码,不可读,怎么处理?

    答:可以使用 -e 命令先输出 base64 编码的字符串,然后程序中解码之后使用

  • 这个工具能解析哪个版本的 rdb 文件?

    答:2~6 版本

  • 我不想用 python,有其他的解析方案吗?

    答:

    1. redis-rdb is written in Ruby
    2. rdbhs is written in Haskell
    3. rdb-parser is written in Node.js
    4. rdb is written in Go
    5. rdb-rs is written in Rust
    6. 参阅 rdb 文件格式 自己写一个解析

参考

https://github.com/sripathikrishnan/redis-rdb-tools

如何解析 redis 的 rdb 文件的更多相关文章

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

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

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

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

  3. redis 分析rdb中key

    1.问题: 单位一个redis集群内存报警,想找出所有的key的列表? 2.解决办法: 网上搜索是可以用redis-rdb-tools 这个工具进行分析 (1)centos6 默认安装python2. ...

  4. 配置方案:Redis持久化RDB和AOF

    Redis持久化方案 Redis是内存数据库,数据都是存储在内存中,为了避免进程退出导致数据的永久丢失,需要定期将Redis中的数据以某种形式(数据或命令)从内存保存到硬盘.当下次Redis重启时,利 ...

  5. 使用rdbtools工具来解析redis rdb文件

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

  6. redis rdb文件解析

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

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

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

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

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

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

    环境:centos7.2软件:redis-3.2.10(yum安装) 情景一:公司之前的redis没有开启aof模式,一直是rdb模式,但是数据又非常重要,数据一点也不能丢失,所以需要开启aof,但是 ...

随机推荐

  1. Redis缓存雪崩和穿透的解决方法

    转载自: https://blog.csdn.net/qq_35433716/article/details/86375506 如何解决缓存雪崩?如何解决缓存穿透?如何保证缓存与数据库双写时一致的问题 ...

  2. 【总结】java集合

    一.collection 1.List接口和Set接口都继承自Collection接口,Collection接口继承Iterable接口(Iterable有一个Iterator方法),即可迭代的:Co ...

  3. 走在深夜的小码农 Third Day

    Css3 Third Day writer:late at night codepeasant css简介 ​ CSS 是层叠样式表 ( Cascading Style Sheets ) 的简称.​ ...

  4. c100k

    sysctl -w fs.file-max=10485760 #系统允许的文件描述符数量10msysctl -w net.ipv4.tcp_rmem=1024 #每个tcp连接的读取缓冲区1k,一个连 ...

  5. ajax 加载数据前的刷新动画

    $(document).ready(function(){     $.ajax({        type:"get",        cache:false,        u ...

  6. 像用excel一样用pandas

    1 说明 预计需要15min阅读此教材: 本教材仅讲述如何查看excel数据,筛选,排序,查找替换数据,不涉及excel中复杂的图形绘制及样式修改. 2 假设 假设,已经存在一个test.xlsx文件 ...

  7. 你的旧版本 App 为何运行在 iPhone 12 上没有异常?

    背景 当我在 10月14日 iPhone 12 系列发布直播,看到 iPhone 12 系列的分辨率后,我注意到这些分辨率是全新的时,我立即在群里吐槽:又需要适配一波了.我只是以为宽高变化会导致字号变 ...

  8. TCP拥塞控制原理

    一.何为拥塞 路由器无法处理高速到达的数据而被迫丢弃数据的现象叫做拥塞. 二.何为拥塞控制 TCP流量控制时为了平衡一个链接中接收方和发送方的速度匹配问题,当发送方发现发送速度大于接收方的接收速度时动 ...

  9. JavaScript变量声明与变量声明提前

    JavaScript变量声明 JavaScript中存储数据的容器称为变量.用关键字和标识符创建新变量的语句,称为变量声明.可以通过关键字var进行变量声明,在ES6中增加了let.const关键字声 ...

  10. c语言 字符指针数组的用法

    #include <stdio.h> #include <stdlib.h> int main(){ //字符数组的使用 char str[] = {'z','b','c',' ...