101人参与 • 2025-05-26 • Redis
bigkey 指在 redis 中存储的 单个 key 对应的 value 过大,通常表现为:
| 问题 | 影响 |
|---|---|
| 内存不均 | 导致集群节点内存倾斜,可能触发 oom。 |
| 阻塞请求 | 单线程模型下,操作 bigkey 耗时高,阻塞其他命令(如 del 大 key 卡顿)。 |
| 网络拥塞 | 大 value 传输占用带宽,影响其他请求延迟。 |
| 持久化故障 | aof/rdb 保存大 key 时耗时剧增,甚至失败。 |
# 扫描 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,无法全面扫描。
# 查看指定 key 的内存占用(redis 4.0+) memory usage user
缺点:只能返回指定key的信息。
# 查看指定 key 信息 debug object user
缺点:只能返回指定key的信息。
使用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
rdb-tools:分析 rdb 文件,统计大 key。
pip install rdbtools rdb --command memory dump.rdb --bytes 10240 --type string
redisinsight:图形化工具直观查看内存分布。
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" ...
替代方案:
| 场景 | 错误用法 | 优化方案 |
|---|---|---|
| 存储用户标签 | set 存储 json 列表 | 改用 set 或 zset |
| 频繁更新的计数器 | string + incr | 改用 hash 分片存储 |
到此这篇关于redis缓存使用的bigkey问题解决的文章就介绍到这了,更多相关redis bigkey问题内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论