聊一聊Redis的离线分析

背景

Redis 或许是我们大部分场景都会用到的一个利器,虽然是利器,用的姿势不对的话,终究还是会整出幺蛾子的。

比较常见的问题,不外乎内存暴增,慢查询等情况。

那么对于内存问题,可以借助redis自带的bigkey分析,也可以借助一些第三方工具来进行离线分析,如 redis-rdb-tools 和 rdr。

为什么是离线分析呢?

redis 在运行时,根据配置会生成一个 dump.rdb 的备份文件,这个备份文件是一个二进制文件,也是存在 redis 里面的数据的一个快照。

离线分析,分析的就是这个 rdb 文件。

受这两个项目的启发,老黄也用了好几个周末的时间写了个简单的离线分析工具。

下面简单介绍一下如何使用这个小工具。

rdb-tools

项目地址:https://github.com/catcherwong/rdb-tools

工具下载方式:

  1. 从 Github Release 下载最新稳定版本 https://github.com/catcherwong/rdb-tools/releases/

  2. 通过 nuget 下载安装 https://www.nuget.org/packages/rdb-cli/

在 Github Release 下载的是无需运行时的单文件,压缩后是 5MB 左右,解压后是 11MB 左右,需要根据不同的操作系统下载不同的可运行文件,

nuget 的话,自然就是在安装了 .net 6 的前提下, 通过 dotnet tool install 的方式来安装

输入 ./rdb-cli -h 可以看到帮助信息。

38849d5969b619f66cec5e19d1e6982b.png

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

db1f55a49e9a948731d9bc48c23c197e.png

从帮助信息可以看到,需要指定 rdb 文件,和一些特定的选项。

一个比较简单常用的示例如下:

./rdb-cli memory /tmp/test/demo.rdb -ot html

这个会分析 demo.rdb ,同时分析结果以 html 的形式展现。

f386bb5aa5807478749244b7a39ce42c.png

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

html 如下:

665254a2c82789029d4fc037982bcc9b.png

e47808bbcca530ab1308ca410856318c.png

8cc6d59d307705451e6676cc5c00a84e.png

38111b610d5cf3f5278a35adf7764c42.png


第一部分是基础信息,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.0 ,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 左右。

写在最后

可能有人会问,为什么已经有这样的工具了,还要再写一个?

主要是考虑到下面几个吧

  1. 活跃度的问题和对新版 redis 的支持程度

  2. 自定义序列化这一块的扩展性

  3. 不同领域的探索和社区支持

感兴趣的可以一起参与完善。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288430.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

虚拟机VMware安装XP系统错误解决办法

虚拟机给我的编程工作确实带了很多方便,但是虚拟机的一个最大挑战是硬件赶不上,速度太慢了。最近一直在致力于虚拟机上Win7专业版平台上SQL Server 2005Visual Studio 2012系统开发,最初还可以,但是越到后面速度越慢。最后决定重新…

【Python】猜数小游戏(文件操作)

人生苦短,我用Python 关键词 1.多用户 2.字典记录所有成绩 3.每次游戏轮数&总游戏次数&平均每次游戏需要多少轮 字典Dictionary、列表List、元组Tuple差异化理解 from random import randintname input(请输入你的名字:)#输入玩家名字 #读取文件…

100ms的SQL把服务器搞崩溃了

前言一个项目上线了两个月,除了一些反馈的优化和小Bug之外,项目一切顺利;前期是属于推广阶段,可能使用人员没那么多,当然对于项目部署肯定提前想到并发量了,所以早就把集群安排上,而且还在测试环…

需求分析工程师岗位的职责描述(合集)

需求分析工程师岗位的职责描述1 职责: 1,负责需求调研,对需求进行分析,编写解决方案、需求规格说明书等 2,根据需求制作原型,并负责原型展示以及客户沟通等工作 3,负责向技术团队精确地传达业务…

nginx 下配置使用Thinkphp5解决跨目录活动并且设置网站根目录

由于TP5框架的一些特性规则,在nginx下导致跨目录的一些访问不能执行 最开始我尝试配置文件夹目录,导致出现各种奇葩错误,然后搜了以下资料发现原来只要简单的修改几个配置文件即可。 声明系统环境: **系统:Centos6.版本…

如何使用CPU来加速你的Linux命令

我们都知道 grep, bzip2, wc, awk, sed等等,都是单线程的,只能使用一个CPU内核。那么如何才能使用这些内核? 要想让Linux命令使用所有的CPU内核,我们需要用到GNU Parallel命令,它让我们所有的CPU内核在单机内做神奇的map-reduce操…

关于nginx为站点绑定域名以及绑定多个域名

环境: 系统:Centos6.版本 使用lnmp一键安装包安装环境(配置文件地址在其官网有写) 找到nginx的conf文件,我的目录为: /usr/local/nginx/conf 随后找到:server_name _; 如果没有配置就是…

【6】JAVA---地址App小软件(QueryPanel.class)(表现层)

查找模块: 年龄可进行段查找。 其他的都是模糊匹配。 空格为无用字符,会屏蔽的(除年龄)。 (如果在年龄中输入空格,会出现异常,当时没想到这点,要防护这点很容易的,但…

Edge 超越 Safari 成为全球第二大桌面端浏览器!Firefox 爆降致 Chrome 份额再创新高!...

桌面端StatCounter 近日发布全球桌面端浏览器 2022 年 3 月统计报告:微软 Microsoft Edge 浏览器桌面端市场份额从 9.61% 上升至 9.65%, 苹果 Safari 浏览器桌面端市场份额从 9.77% 下降至 9.56%。 这也意味着微软 Microsoft Edge 浏览器正式超越苹果 Sa…

hackgame汇总

2019独角兽企业重金招聘Python工程师标准>>> http://www.hackerforever.com/survius.php http://www.funnygames.co.nz/play/hacker http://www.hackerskills.com/ http://www.mod-x.co.uk/whatisit.php http://www.hackerevolution.org/page_hackerevolution.h…

关于thinkphp5的报错 mkdir() Permission denied的解决

声明环境: 系统: Centos 6.8 64x nginx 使用lnmp一键安装包安装 已解决tp5跨目录活动问题 mkdir() 的作用是函数创建目录,即读写相关,那么即报错“permission denied” 则我们可以改变目录权限。 环境为nginx,nginx有设置的访问用…

.NET LoongArch64 正式合并进入.NET

国内自主的龙芯,在做龙芯技术生态就把 .NET 作为其中一部分考虑进去,这也将对接下来国内.NET应用场景充满了期待。通过dotnet/runtime 可以知道现在龙芯版本的 .NET 已经合并到.NET 7 官方分支的工作已经完成了。LoongArch64架构合并进入.NET 7.0 已经安…

qtabwidget切换tab事件_某超超临界机组初压/限压切换过程中扰动原因分析

严寒夕 浙江浙能台州第二发电有限责任公司[摘要]某火电厂汽轮机在初压/限压切换过程中出现负荷瞬时上升问题。从初压/限压切换的逻辑及切换过程中主要参数的变化分析,确定原因为压力控制器指令上升瞬间和转速负荷控制器指令下降瞬间有短暂的时间间隔,造…

WiresShark之抓http包如何倒出图片格式的对象

1 问题 在WireShark抓取http数据包之后,里面有图片链接,我们怎么进行导出来,当然这里在浏览器或者Fiddler里面普通图片格式可以显示出来。 2 举例子操作说明 1)比如我们访问www.hao123.com.cn这个网站,我们首先打开wireShark,开启抓包,然后用浏览器访问这个网站,页面效…

linux生成地图,ROS中利用V-rep进行地图构建仿真

V-rep中显示激光扫描点在VREP自带的场景中找到practicalPathPlanningDemo.ttt文件,删除场景中多余的物体只保留静态的地图。然后在Model browser→components→sensors中找到SICK TiM310 Fast激光雷达,拖入场景中:打开脚本参数修改器&#xf…

Python环境搭建与连接SQL Server类MyDBase的实现

一、开发环境搭建 1、下载所需版本的软件包(点击下载),点击安装即可,注意x86与x64的选择。 2、配置环境:复制python安装目录,粘贴到Path中 3、打开cmd,输入python并回车,看到如下信息,则安装成功!

如何隐藏地址栏中的真实地址_Firefox推出Private Relay插件:可隐藏真实邮箱地址...

Mozilla 正在为 Firefox 开发一项名为Private Relay 的新服务,它能够用来一键随机生成电子邮件别名,以隐藏真实邮箱地址,使用户免受广告商和垃圾邮件侵害。Private Relay 将作为 Firefox插件提供。它于上个月开始测试,目前仍处于封…

使用VS开发C++ 控制台程序或其他项目出现 ‘ LINK : fatal error LNK1104: 无法打开文件“LIBCD.lib” ’ 常规解决办法

原因:大多是由低版本例如VC6(本人是)开发项目,然后在高版本上再开发该项目导致LIBCD.lib出现更改由此出现错误提示。 本人VS版本2017; 一般解决办法: 第一步:右键项目属性 第二步:在忽略特定库位置加上要忽…

不同步节点在线使用Remix开发以太坊Dapp及solidity学习入门 ( 一 ):智能合约HelloWorld

有问题可以点击–>加群互相学习 本人本来想自己写公链,结果发现任重道远; 遂,开始写Dapp,顺便写的时候搞个教程吧。。。 通过系列教程学习将会: 1.基本使用solidity 语言开发智能合约 2.知道怎么发自己的以太坊的to…

Blazor University (16)渲染树 — 使用 @key 优化

原文链接:https://blazor-university.com/components/render-trees/optimising-using-key/使用 key 优化源代码[1]提示: 对于在运行时循环生成的组件,始终使用 key。前面的示例运行良好,因为 Blazor 能够轻松地将虚拟 DOM 元素与浏…