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

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.xdnf.cn/news/605845.html

相关文章:

  • SAP在金属行业的数字化转型:无锡哲讯科技的智能解决方案
  • A10服务器使用vllm推理框架成功运行Qwen3大模型
  • 机器学习第二十四讲:scikit-learn → 机器学习界的瑞士军刀
  • Rancher 部署与使用指南
  • 使用Rancher在CentOS 环境上部署和管理多Kubernetes集群
  • 如何把一台电脑作为另外一台电脑的显示器
  • 地理特征类可视化图像
  • Java 依赖管理工具:使用 Sonatype Nexus 管理项目依赖
  • Ubantu安装 Jenkins LTS
  • AI大模型和SpringAI简介
  • 2025年最新基于Vue基础项目Todolist任务编辑器【适合新手入手】【有这一片足够了】【附源码】
  • php本地 curl 请求证书问题解决
  • Map的遍历与判断键是否存在-《Go语言实战指南》
  • ArcGIS Pro 3.4 二次开发 - 编辑
  • 基于RT-Thread的STM32F4开发第七讲——RTC(硬件、软件)
  • ATGM332D-F8N22单北斗多频定位导航模块
  • SQLMesh Typed Macros:让SQL宏更强大、更安全、更易维护
  • 【闲聊篇】java好丰富!
  • RabbitMQ配置环境变量
  • onnx模型转入rknn3399平台上工作记录
  • React从基础入门到高级实战:React 基础入门 - JSX与组件基础
  • 深入解析Java类加载机制:双亲委派模型
  • Halcon计算点到平面的距离没有那么简单
  • Spring Boot微服务架构(一):如何拆分?如何将CRM系统拆解为多个微服务构建?
  • Spring Boot集成Resilience4j实现微服务容错机制
  • 亚马逊云科技推出Anthropic新一代模型
  • 电子电气架构 --- 下一代汽车电子电气架构中的连接性
  • 传输层协议TCP
  • 撤销Conda初始化
  • 基于BoxMOT的目标检测与跟踪全流程详解