一、什么是 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的信息。
4. 使用 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
5. 使用第三方工具
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 访问。
到此这篇关于redis缓存使用的bigkey问题解决的文章就介绍到这了,更多相关redis bigkey问题内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论