聊一聊Redis的离线分析
背景
Redis 或许是我们大部分场景都会用到的一个利器,虽然是利器,用的姿势不对的话,终究还是会整出幺蛾子的。
比较常见的问题,不外乎内存暴增,慢查询等情况。
那么对于内存问题,可以借助redis自带的bigkey分析,也可以借助一些第三方工具来进行离线分析,如 redis-rdb-tools 和 rdr。
为什么是离线分析呢?
redis 在运行时,根据配置会生成一个 dump.rdb 的备份文件,这个备份文件是一个二进制文件,也是存在 redis 里面的数据的一个快照。
离线分析,分析的就是这个 rdb 文件。
受这两个项目的启发,老黄也用了好几个周末的时间写了个简单的离线分析工具。
下面简单介绍一下如何使用这个小工具。
rdb-tools
项目地址: https://github.com/catcherwong/rdb-tools
工具下载方式:
- 从 Github Release 下载最新稳定版本 https://github.com/catcherwong/rdb-tools/releases/
- 通过 nuget 下载安装 https://www.nuget.org/packages/rdb-cli/
在 Github Release 下载的是无需运行时的单文件,压缩后是 5MB 左右,解压后是 11MB 左右,需要根据不同的操作系统下载不同的可运行文件,
nuget 的话,自然就是在安装了 .net 6 的前提下, 通过 dotnet tool install 的方式来安装
输入 ./rdb-cli -h 可以看到帮助信息。

其中最主要的还是 memory 命令。

从帮助信息可以看到,需要指定 rdb 文件,和一些特定的选项。
一个比较简单常用的示例如下:
./rdb-cli memory /tmp/test/demo.rdb -ot html
这个会分析 demo.rdb ,同时分析结果以 html 的形式展现。

可以看到分析一个 2GB 的文件,大概需要 32秒左右。
html 如下:




第一部分是基础信息,rdb 的版本信息, redis 的版本信息,总的内存,总的 key 数量。
第二部分是几个柱状图,主要是不同数据类型的内存和数量分布,以及过期时间的内存和数量分布。
第三部分是几个表格,前几的 Key 前缀列表、前几的大 Key 列表、前几的 Stream 列表,Function 列表(Redis 7.0)。
当然,如果想进行一些过滤,可以指定不同的参数选项即可。
只想分析 db 9 和 db 10
./rdb-cli memory /tmp/test/demo.rdb -ot html --db 9 --db 10
只想分析 hash 和 string 类型
./rdb-cli memory /tmp/test/demo.rdb -ot html --type string --type hash
rdb-tools 除了这个直接可用的 cli 工具外,还有一个 parser 的类库,这个类库就是解析的核心类库, cli 也是基于这个做了一个 ReadCallback。
所以完全可以基于这个 parser 的类库,打造一个自定义的离线分析工具。
一些细节
分析 rdb 文件,其实就是分析一个二进制文件。
不同版本的 redis,其 rdb 文件不一定一样,毕竟 rdb 文件也有版本的概念。
目前最新的 redis 7 ,rdb 的版本是 10,
redis 5.x ~ 6.x ,rdb 的版本则是 9 。
在 rdb-tools 里面,是用 BinaryReader 来读取 rdb 文件的。
目前大部分 rdb 文件的解析应该都是按照下面这个文档来的。
https://github.com/sripathikrishnan/redis-rdb-tools/wiki/Redis-RDB-Dump-File-Format
不过它目前还没有包含 listpack 的解析。
最直观的方式是对照 redis 源码里面的 rdb.c 这个文件。
https://github.com/redis/redis/blob/7.0-rc3/src/rdb.c
rdb 对数字这一块的解码操作要特别注意,不一定能用 BitConverter.ToIntXX 来获得正确的值!!
另外有一些地方对大端和小端存储也有区分,这个是很容易踩坑的地方。
内存数据统计的时候用的是生产者消费者模式(BlockingCollection),边解析边统计,避免一次性把 redis 的数据都加载到内存中,造成内存溢出。
目前解析一次,占用的内存基本是在几十M 左右。
总结
可能有人会问,为什么已经有这样的工具了,还要再写一个?
主要是考虑到下面几个吧
- 活跃度的问题和对新版 redis 的支持程度
- 自定义序列化这一块的扩展性
- 不同领域的探索和社区支持
写这么一个工具,也加深了 redis 底层存储和数据结构的一些认知。
感兴趣的可以一起参与完善。
聊一聊Redis的离线分析的更多相关文章
- Redis时延问题分析及应对
Redis时延问题分析及应对 Redis的事件循环在一个线程中处理,作为一个单线程程序,重要的是要保证事件处理的时延短,这样,事件循环中的后续任务才不会阻塞: 当redis的数据量达到一定级别后(比如 ...
- ELK_elk+redis 搭建日志分析平台
这个是最新的elk+redis搭建日志分析平台,今年时间是2015年9月11日. Elk分别为 elasticsearch,logstash, kibana 官网为:https://www.elast ...
- linux下利用elk+redis 搭建日志分析平台教程
linux下利用elk+redis 搭建日志分析平台教程 http://www.alliedjeep.com/18084.htm elk 日志分析+redis数据库可以创建一个不错的日志分析平台了 ...
- Redis事务的分析及改进
Redis事务的分析及改进 Redis的事务特性 数据ACID特性满足了几条? 为了保持简单,redis事务保证了其中的一致性和隔离性: 不满足原子性和持久性: 原子性 redis事务在执行的中途遇到 ...
- redis超时问题分析
redis超时问题分析 06/04. 2014 Redis在分布式应用中占据着越来越重要的地位,短短的几万行代码,实现了一个高性能的数据存储服务.最近dump中心的cm8集群出现过 几次redis超时 ...
- Redis事务原理分析
Redis事务原理分析 基本应用 在Redis的事务里面,采用的是乐观锁,主要是为了提高性能,减少客户端的等待.由几个命令构成:WATCH, UNWATCH, MULTI, EXEC, DISCARD ...
- 一、Redis事务原理分析
一.Redis事务原理分析 在Redis的事务里面,采用的是乐观锁,主要是为了提高性能,减少客户端的等待.由几个命令构成:WATCH, UNWATCH, MULTI, EXEC, DISCARD.通过 ...
- MongoDB、Hbase、Redis等NoSQL分析
NoSQL的四大种类 NoSQL数据库在整个数据库领域的江湖地位已经不言而喻.在大数据时代,虽然RDBMS很优秀,但是面对快速增长的数据规模和日渐复杂的数据模型,RDBMS渐渐力不从心,无法应对很多数 ...
- Redis源码分析:serverCron - redis源码笔记
[redis源码分析]http://blog.csdn.net/column/details/redis-source.html Redis源代码重要目录 dict.c:也是很重要的两个文件,主要 ...
随机推荐
- 企业应用架构研究系列二:MSF&Scrum 项目管理
从业软件项目这么多年,在企业应用开发项目中,项目能否成功,是否能按照项目计划有效的推进,是有很强的一套项目管理理论.最早的时候,接触的项目管理的方法论就是微软的MSF(Microsoft Soluti ...
- J20航模遥控器开源项目系列教程(五)| 制作STM32F0接收机,8路PWM输出,SBUS输出,PPM输出 | 加密狗无线化,畅玩飞行模拟器
我们的开源宗旨:自由 协调 开放 合作 共享 拥抱开源,丰富国内开源生态,开展多人运动,欢迎加入我们哈~ 和一群志同道合的人,做自己所热爱的事! 项目开源地址:https://github.com/J ...
- GET、POST请求
GET和POST的区别主要有以下几个方面: 1.URL可见性: GET:参数URL可见: POST:URL参数不可见: 2.数据传输 GET:通过拼接URL进行传递参数: POST:通过body体传输 ...
- C++ bind 和 ref
#include <functional>#include <iostream> void f(int& n1, int& n2, const int& ...
- Linux用户身份与文件权限学习笔记
用户身份 管理员UID为0:系统的管理员用户 系统用户UID为1~999:服务程序会有独立的系统用户负责运行:防止被黑客入侵进行提权,并有效控制被破坏的范围 普通用户UID从1000开始:是由管理员创 ...
- 如何实现集群中的 session 共享存储?
Session 是运行在一台服务器上的,所有的访问都会到达我们的唯一服务器上,这 样我们可以根据客户端传来的 sessionID,来获取 session,或在对应 Session 不 存在的情况下(s ...
- C++ - free()函数释放内存后的指针行为
一个指针释放后不置空的后果: free(p)之后原本那块内存的数据已经被释放了,内存重新收回.但此时的指针变量依然指向那块内存,在以后的代码中若不小心继续调用指针变量,会出现不可预料的错误. 不置空的 ...
- 如何设置出IDEA中VCS下的Enable Version Control Intergration
File–>settings–>Version Control
- C语言之开发流程(知识点7)
一.C程序的运行步骤: 1.编辑:进入C语言编译系统,建立源程序文件,扩展名为"c"或"cpp",编辑并修改.保存源程序. 2.编译:计算机不能识别和执行高级语 ...
- C++ | 动多态的发生时机
探究动多态的发生时机 有了虚函数和虚函数表为动多态提供支持,从而可以实现C++语言的动多态.那么,问题又来了. 动多态的发生时机是什么? 或者说,动多态发生有哪些条件与限制呢? 下面让我们一起来探究动 ...