问题描述
今天遇到一个 Redis 内存打挂了的问题,想看看哪个前缀 Key 占用内存比较大?!
原因分析
我们都知道如果直接用 Keys 参数去做统计很危险,而且也只能统计数量,当然也可以排序去前几名的占用内存 Key 对应的大小,但是我们的需求是要模糊匹配前缀(属于同一类业务)所占用的内存大小总计
解决方案
方法一
推荐一个工具,通过 dump.rdb 文件进行分析
https://github.com/sripathikrishnan/redis-rdb-tools
1、安装 redis-rdb-tools 工具
wget https://github.com/sripathikrishnan/redis-rdb-tools/archive/master.zip
unzip master
cd redis-rdb-tools-master/
python setup.py install
2、根据 dump.rdb 文件成生内存报告进行分析
# 生成报告
rdb -c memory ./dump.rdb > redis_memory_report.csv# 根据使用的内存大小进行排序
sort -t, -k4nr redis_memory_report.csv
方法二
- go版本:go-redis-memory-analysis
-
php版本:redis-memory-analysis
附加
补充一下,前面生成的 csv 导入到数据库中之后,就可以利用 sql 语句很方便的对 Redis 的内存数据进行各种分析了(当然也可以用 Excel)
DROP TABLE IF EXISTS `memory`;
CREATE TABLE `memory` (`DATABASE` int(11) DEFAULT NULL,`type` varchar(128) DEFAULT NULL,`KEY` varchar(128) DEFAULT NULL,`size_in_bytes` int(11) DEFAULT NULL,`encoding` varchar(128) DEFAULT NULL,`num_elements` int(11) DEFAULT NULL,`len_largest_element` varchar(128) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SET FOREIGN_KEY_CHECKS=1;
这个是建表语句。通过 Navicat 之类的工具导入数据,然后分析
SELECT SUM(size_in_bytes) FROM memory WHERE `KEY` LIKE '%blog:%'
这个是表中的所有数据