使用 rdbtools 分析 redis 内存使用情况

2019 年 9 月份对公司生产环境的 Redis 进行了内存分析,经过了一波操作,内存占用由 26.56GB 缩减到 11.04GB,足足减少了 15.52GB,成就感爆棚,一直想找机会记录下 redis-rdb-tools 的使用,这就是本篇博文的由来。

安装 redis-rdb-tools

这里我们选择通过源码安装

  • 从 GitHub 拉取 redis-rdb-tools:git clone https://github.com/sripathikrishnan/redis-rdb-tools
  • 进入 redis-rdb-tools 目录:cd redis-rdb-tools
  • 安装 python 运行脚本:sudo python setup.py install

到这里就安装完成了,可以使用 rdb --help 命令查看工具的用法

Tips : 官方推荐安装 python-lzf 组件(能加快解析速度),安装指令 pip install python-lzf,如果报下面的错误,是没有安装 pip 工具,执行 sudo easy_install pip 安装即可。

将 redis 内存使用数据导出到 csv

使用命令 rdb -c memory ${rdbFilePath} > ${csvFilePath},示例 rdb -c memory /Users/enoch/Downloads/hins10965791_data_20200416112336.rdb > /Users/enoch/Downloads/result-20200416.csv

image-20200416130851579

将 CSV 文档导入到 MySql 进行分析

  • 创建数据表,语句如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE `redis_memory_analysis` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
`database` int(128) DEFAULT NULL COMMENT 'key在redis的db',
`type` varchar(128) DEFAULT NULL COMMENT 'key类型',
`key` varchar(512) DEFAULT NULL COMMENT 'key值',
`size_in_bytes` bigint(20) DEFAULT NULL COMMENT 'key的内存大小',
`encoding` varchar(128) DEFAULT NULL COMMENT 'value的存储编码形式',
`num_elements` bigint(20) DEFAULT NULL COMMENT 'key中的value的个数',
`len_largest_element` varchar(128) DEFAULT NULL COMMENT 'key中的value的长度',
`expiry` datetime DEFAULT NULL COMMENT 'key的到期时间',
PRIMARY KEY (`id`),
KEY `key` (`key`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4;
  • 导入记录

  • 数据分析

    • 查询占用空间最大的 100 个 key:SELECT * FROM redis_memory_analysis ORDER BY size_in_bytes DESC LIMIT 100

    • 查询 hash 结构这种元素数量最多的 50 个 key:SELECT * FROM redis_memory_analysis WHERE type = 'hash' ORDER BY num_elements DESC LIMIT 50

    Tips: 可根据实际需要写 sql 进行分析,非常灵活。


使用 rdbtools 分析 redis 内存使用情况
https://blog.yohlj.cn/posts/a3f237f1/
作者
Enoch
发布于
2020年4月15日
许可协议