一、什么是 BigKey?
BigKey 指在 Redis 中存储的 单个 Key 对应的 Value 过大,通常表现为:
- String 类型:Value 长度 > 10KB。
- Hash/List/Set/ZSet:元素数量 > 5,000 或总大小 > 10MB。
二、BigKey 的危害
问题 | 影响 |
---|---|
内存不均 | 导致集群节点内存倾斜,可能触发 OOM。 |
阻塞请求 | 单线程模型下,操作 BigKey 耗时高,阻塞其他命令(如 DEL 大 Key 卡顿)。 |
网络拥塞 | 大 Value 传输占用带宽,影响其他请求延迟。 |
持久化故障 | AOF/RDB 保存大 Key 时耗时剧增,甚至失败。 |
三、如何发现 BigKey?
1. 使用 Redis 内置命令 redis-cli --bigkeys
# 扫描 BigKey(Redis 4.0+)
redis-cli --bigkeys
# 输出示例(汇总每种数据类型的最大 Key)
[00.00%] Biggest string found so far 'user' with 10240 bytes
[00.00%] Biggest hash found so far 'product' with 5000 fields
缺点:只能返回每种类型的最大 Key,无法全面扫描。
2. 使用 Redis 内置命令 MEMORY USAGE
# 查看指定 Key 的内存占用(Redis 4.0+)
MEMORY USAGE user
缺点:只能返回指定Key的信息。
3. 使用 Redis 内置命令 DEBUG OBJECT
# 查看指定 Key 信息
DEBUG OBJECT user
缺点:只能返回指定Key的信息。
3. 使用 Redis 内置命令 SCAN
+ MEMORY USAGE
或 DEBUG OBJECT
使用sacn
命令扫描redis 中的key,结合 memory usage
或 debug object
判断key 值大小
SCAN 0 MATCH order:* COUNT 100
HSCAN user:1000 0 # 遍历 Hash 的字段
SSCAN followers 0 # 遍历 Set 的成员
ZSCAN rankings 0 # 遍历 ZSet 的成员和分数
可循环定时执行scan命令遍历出bigKey
3. 使用第三方工具
- rdb-tools:分析 RDB 文件,统计大 Key。
pip install rdbtools rdb --command memory dump.rdb --bytes 10240 --type string
- RedisInsight:图形化工具直观查看内存分布。
四、BigKey 的解决方案
1. 拆分大 Key
- String 类型:拆分为多个子 Key。
# 原始 Key SET user:1000:profile "超大JSON数据..." # 拆分为 SET user:1000:profile:part1 "JSON片段1" SET user:1000:profile:part2 "JSON片段2"
- Hash/List/Set/ZSet:按字段或范围分片。
# 原始 Hash HSET product:999:details name "手机" price 5000 ... (5000个字段) # 拆分为 HSET product:999:details:1 name "手机" price 5000 HSET product:999:details:2 field1001 "value1001" ...
2. 使用合适的数据结构
- 替代方案:
场景 错误用法 优化方案 存储用户标签 SET
存储 JSON 列表改用 SET
或ZSET
频繁更新的计数器 String
+INCR
改用 HASH
分片存储
3. 客户端缓存
- 对热点 BigKey 使用本地缓存(如 Caffeine),减少 Redis 访问。