当前位置: 首页 > article >正文

Redis 缓存使用的BigKey问题

一、什么是 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 USAGEDEBUG OBJECT

使用sacn 命令扫描redis 中的key,结合 memory usagedebug 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 列表改用 SETZSET
    频繁更新的计数器String + INCR改用 HASH 分片存储
3. 客户端缓存
  • 对热点 BigKey 使用本地缓存(如 Caffeine),减少 Redis 访问。
http://www.lryc.cn/news/2384478.html

相关文章:

  • 【Java高阶面经:消息队列篇】22、消息队列核心应用:高并发场景下的解耦、异步与削峰
  • 软媒魔方——一款集合多种系统辅助组件的软件
  • Unity场景的加载与卸载
  • 多路径可靠传输协议(比如 MPTCP)为什么低效
  • 塔能高温冰蓄冷技术:工厂能耗精准节能的创新之路
  • 内存优化笔记1
  • 人脸识别,使用 deepface + api + flask, 改写 + 调试
  • 代码管理平台Gitlab如何通过快解析实现远程访问?
  • 基于SpringBoot+Vue的足球青训俱乐部管理后台系统的设计与开发
  • Redis 是否适合像 MySQL 一样当数据库使用?
  • AI是否会取代人类?浔川问答①
  • JDBC-java操作数据库
  • [原创](现代Delphi 12指南):[macOS 64bit App开发]: 如何获取目录大小?
  • 线程调度与单例模式:wait、notify与懒汉模式解析
  • MySQL中TCP和套接字SSL加密连接行为分析
  • php本地 curl 请求证书问题解决
  • Callable
  • Honeywell 05701-A-0302 单通道控制卡
  • 爱普生晶振赋能UWB汽车数字钥匙,解锁未来出行新方式
  • 电子电路:深入理解电磁耦合的定义与应用
  • 宝塔安装的 MySQL 无法连接的情况及解决方案
  • 今日行情明日机会——20250523
  • 微服务项目->在线oj系统(Java版 - 4)
  • ReAct 与 CoAct:AI 代理的推理与行动之旅
  • 电子电路:什么是滤波器,什么优势高通滤波器?
  • uni-app使用大集
  • [Spring Boot]整合Java Mail实现Outlook发送邮件
  • 零件剖切配置教学 | 玩转EasyTwin 工业产线第三期(上)课程回顾
  • onnx模型转入rknn3399平台上工作记录
  • 进考场!软考考试现场答题的注意事项