redis里怎么知道key的value大小?或者按照value的大小排序?

现在偶尔会发现redis里有些key的值有几十MB,这是不正常的数据,有没有办法按value大小排序列出大于10MB所有key?

阅读 33.2k
3 个回答

帮你找了一个工具,经测试可用:https://github.com/sripathikrishnan/redis-rdb-tools#generate-memory-report

安装和使用方法文档上写了,如果安装完成找不到rdb命令的话,直接在安装目录下执行也可以:

rdbtools/cli/rdb.py -c memory /path/to/your/dump.rdb > result.csv
database type key size_in_bytes encoding num_elements len_largest_element
0 string "cccc" 98 string 4 4
0 string "bbb" 96 string 3 3
0 hash "user" 102 ziplist 1 6
0 string "aa" 94 string 2 2

结果列中的sizeinbytes就是你要的大小,导出后自己排下序就可以了。另外,注意修改你自己dump.rdb的文件路径。对于数据量太大的情况我没测试过,分析估计会比较慢。

补充一下,根据楼上的回答,前面生成的csv导入到数据库中之后,就可以利用sql语句很方便的对Redis的内存数据进行各种分析了。

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 `KEY` from memory WHERE size_in_bytes>12 【这里就是你的value的大小单位是 byte 10m就是 10*1024*1000】

查询结果
clipboard.png

下面是我的所有数据

clipboard.png

对于string类型的value,直接使用strlen key
hash里的string类型的value也可以使用 strlen key
推荐使用lua脚本,偶尔的查询会很方便,如果是长期进行数据分析,推荐楼上的方法

clipboard.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题