当前位置: 代码网 > it编程>数据库>Redis > Redis缓存使用的BigKey问题解决

Redis缓存使用的BigKey问题解决

2025年05月26日 Redis 我要评论
一、什么是 bigkey?bigkey指在 redis 中存储的单个 key 对应的 value 过大,通常表现为:string 类型:value 长度 > 10kb。hash/list/set

一、什么是 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问题内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网! 

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com