如何发现 Redis 中的大 Key?
介绍 Redis 中检测大键的方法及其优缺点。
在 Redis 环境中检测 bigkey(大 key)主要是为了防止内存膨胀、延迟增加等服务端性能瓶颈。Bigkey 通常定义为字符串类型的 value 超过 1MB,或哈希/列表/集合等容器类型元素数量过大(如 zset 成员 > 10,000 个)。以下是主要检测方法:
- 使用
redis-cli --bigkeys
命令:- 这是官方提供的工具,扫描所有 key 并统计各数据类型中的 bigkey。
- 优点:
- 在线运行,不阻塞 Redis 服务。
- 输出格式直观:
Database Type Key Size in bytes Encoding Num elements 0 string bigstring 1048576 raw - Biggest zset found 'bigzset' with 100000 members
- 缺点:只报告每类 Top1 bigkey 的尺寸/元素数量,信息不够全面。
- 用法:
redis-cli -h host -p port --bigkeys
- 使用 SCAN 命令编写脚本扫描数据:
- 分步遍历所有 keys,并结合
STRLEN
(String) 或HLEN
(Hash) 等命令判断 key 的大小。 - 优点:精准控制处理逻辑,可捕获更多 bigkey。
- 缺点:需自定义脚本实现,可能会因反复请求造成 CPU 开销偏高。
- 示例脚本思路:
cursor = '0' while cursor != 0: cursor, keys = redis.scan(cursor, match='*') for key in keys: key_type = redis.type(key) if key_type == 'string': size = redis.strlen(key) if size > 1024000: # String 超过 1MB print(f"Big string key: {key}, size: {size} bytes") # 类似地对其他数据类型处理:HLEN for hash, ZCARD for zset...
- 分步遍历所有 keys,并结合
- 借助 RDB 文件剖析或第三方工具:
- 首先生成 RDB 备份:
redis-cli BGSAVE
,获得dump.rdb
文件后,用开源工具如redis-rdb-tools
分析:rdb dump.rdb --bigkeys
- 优点:全局精确统计所有 keys 大小及内存占用情况,避开线上阻塞风险。
- 缺点:需停止服务或不频繁生成 RDB 的快照。
- 首先生成 RDB 备份:
- 不推荐:
DEBUG OBJECT
:- 检测时调用
DEBUG OBJECT key_name
命令得到序列化长度serializedlength
参数。 - 高风险:属调试命令会完全阻塞 Redis 主线程的执行请求。仅限单次测试单 key 场景,避免在重要系统运行。
- 检测时调用
避免对性能的影响:
- CPU 耗时工具(如 MEMORY USAGE 命令)慎用,尤其在频繁扫描高吞吐系统会陡增负荷。
- 定时采用低代价途径如 SCAN 排查可减少对主线程的占用,也无需如集群式部署的复杂场景。