如何发现Redis中的bigkey?
如何发现Redis中的bigkey?我主要用这几个方法:
redis-cli --bigkeys
(最常用,最省事):直接在命令行敲这个命令:
redis-cli -h 你的redis地址 -p 端口 --bigkeys
作用: 它会自动扫描整个数据库。
结果: 告诉你每种数据类型(String, Hash, List, Set, ZSet)里最大的那个key是什么,有多大(比如String多大,List有多少元素)。
优点: 简单、安全(基本不影响线上服务)、官方自带。
缺点: 只能看到每种类型里排第一的“老大”,而且大小标准是它定的。
看内存分析报告(更准,但麻烦点):
让运维帮忙,或者自己导出一个Redis的内存快照文件(RDB)。
用专门的工具(比如
redis-rdb-tools
)分析这个文件。结果: 能生成一个列表,按内存占用从大到小排好序,所有超过你设定大小(比如1MB)的key都列出来。
优点: 非常准确,能看到所有大key的详细信息(名字、类型、占多大内存、有多少元素),完全不影响线上。
缺点: 步骤多,需要权限,分析的是某个时间点的数据。
线上扫描(慎用,可能影响性能):
写个小脚本或用工具。
用
SCAN
命令(千万别用KEYS *
,会卡死Redis!)分批扫描所有key。对扫描到的每个key,用
MEMORY USAGE key名
命令查它具体占多少内存。把超过你设定大小的key记下来。
优点: 可以实时找,灵活性高。
缺点: 慢! 如果数据量巨大,扫描会很耗时,而且
MEMORY USAGE
命令本身也有点开销,最好在业务低峰期做。
第2中方法的具体步骤:
第一步:获取RDB文件(内存快照)
目标: 拿到一个
dump.rdb
文件(这是Redis保存数据的默认文件名)。怎么做?
方法A(推荐 - 在从节点或低峰期做):
登录到你的 Redis服务器。
运行命令:
redis-cli save
。 (这个命令会 阻塞 Redis 直到快照完成!如果数据量大,会卡住几秒到几分钟,千万别在主节点业务高峰期做!)
或者用非阻塞命令(但可能耗时更长):
redis-cli bgsave
(后台执行),然后等日志提示Background saving started
和Background saving terminated
完成。
快照完成后,RDB文件通常保存在Redis配置文件中
dir
指定的目录下(默认可能是/var/lib/redis
或./
)。找到dump.rdb
文件。
方法B(运维常用): 如果Redis配置了定时持久化(
save
配置项),直接找到它最近自动生成的dump.rdb
文件。
重要提醒:
确保你有权限操作服务器和读取这个文件。
SAVE
命令会阻塞服务,生产环境主节点务必谨慎或在从节点执行! 优先用BGSAVE
或找运维帮忙。
第二步:安装分析工具(redis-rdb-tools)
目标: 装一个叫
redis-rdb-tools
的Python工具。怎么做?
确保你的机器(可以是另一台分析机,不一定是Redis服务器)安装了 Python 和 pip。
在命令行/终端运行安装命令:
bash
pip install rdbtools # 这就是工具的名字
(如果提示权限问题,可以试试
pip install --user rdbtools
)
第三步:运行工具,生成BigKey报告
目标: 让工具读你的
dump.rdb
文件,输出一个包含所有Key大小信息的文件(比如CSV)。怎么做?
把第一步拿到的
dump.rdb
文件,复制到你的分析机器上(如果不在同一台机器)。打开命令行/终端,进入存放
dump.rdb
的目录。运行核心命令:
bash
rdb -c memory dump.rdb --bytes 10240 > bigkeys_report.csv
rdb -c memory
: 告诉工具按内存分析。dump.rdb
: 你的快照文件名(如果不是这个名字,换成你的文件名)。--bytes 10240
: 设定阈值(这里设的是10KB,即10240字节)。只报告大于这个值的Key! 你可以根据需求调整(比如设--bytes 1048576
就是1MB)。> bigkeys_report.csv
: 把分析结果输出(重定向)到bigkeys_report.csv
文件。
等待命令执行完成(文件越大耗时越长)。
第四步:查看报告(找BigKey)
目标: 打开生成的CSV文件,找出那些占内存大的“坏家伙”。
怎么做?
用 Excel、Numbers 或者 文本编辑器 打开
bigkeys_report.csv
。这个文件是一个表格,通常包含这些重要列:
database
: Key在哪个Redis数据库(默认是0)。type
: Key的数据类型(string, hash, list, set, zset)。key
: Key的名字!(最重要的信息)size_in_bytes
: 这个Key占了多少字节的内存! (核心指标)encoding
: Redis内部使用的编码(不重要)。num_elements
: 如果是集合类型(hash/list/set/zset),这个Key包含多少个元素。len_largest_element
: 集合类型中,单个最大元素的长度(比如Hash里某个field的value长度)。
重点看
size_in_bytes
这一列! 按从大到小排序(Excel里点一下列标题就能排),排在最前面的就是你的 BigKey!key
列告诉你它的名字,type
列告诉你它是什么类型,num_elements
告诉你它有多少个成员(如果是集合)。