引言:什么是 BigKey?

在 Redis 的使用场景中,BigKey(大键)是指那些数据量异常庞大的键值,通常表现为:

  • String 类型:值大小超过 10KB
  • Hash/Set 等:元素数量超过 5000
  • List/ZSet 等:元素数量超过 10000

这些 "巨无霸" Key 就像隐藏在系统中的定时炸弹,随时可能引发性能问题。本文将深入剖析 BigKey 的方方面面。

一、BigKey 的产生原因

1. 设计阶段考虑不周

// 反例:将用户所有订单数据存入一个 Key public void saveUserOrders(long userId, List<Order> orders) { redisTemplate.opsForValue().set("user:orders:" + userId, orders); // 随着订单增长,这个 Key 会越来越大 }

2. 业务快速增长

  • 用户画像数据膨胀(Hash 字段从 50 个增长到 5000+)
  • 消息队列堆积(List 元素从 1000 激增到 10 万)

3. 缺乏监控机制

  • 没有对写入数据的校验
  • 缺少定期扫描的运维流程

4. 错误使用数据结构

错误用法正确替代方案
用 String 存 JSON 数组拆分为多个 Hash
用 List 存日志数据使用 Stream
用 Set 存用户关系分片存储

二、BigKey 的危害

1. 性能杀手

# 测试删除不同大小 Key 的耗时 $ redis-benchmark -n 100 -c 10 DEL bigkey - 1MB Key: 平均耗时 15ms - 10MB Key: 平均耗时 150ms

2. 集群问题

3. 网络风暴

计算公式: 网络流量 = Key 大小 × QPS × 副本数 示例: 1MB Key × 1000 QPS × 3 副本 = 3GB/分钟

4. 阻塞风险

Redis 单线程模型下,操作 BigKey 会导致:

  • 命令排队
  • 慢查询激增
  • 超时故障

三、BigKey 检测方案

1. 官方工具

# 快速扫描(生产环境慎用) redis-cli --bigkeys # 输出示例 [00.00%] Biggest string found so far 'user:1000:data' with 10240 bytes

2. 自定义扫描脚本

Python

import redis def scan_bigkeys(host, port, threshold=10240): r = redis.Redis(host=host, port=port) cursor = '0' while cursor != 0: cursor, keys = r.scan(cursor=cursor, count=1000) for key in keys: size = r.memory_usage(key) if size > threshold: print(f"BigKey found: {key} ({size} bytes)") # 可加入自动告警逻辑 scan_bigkeys('127.0.0.1', 6379)

3. 可视化工具

推荐工具对比:

工具特点适用场景
RedisInsight官方出品,可视化分析日常运维
TinyRDM轻量级客户端开发调试
rdbtools离线分析 RDB深度排查

4. 监控告警

Prometheus + Grafana 监控配置示例:

# prometheus.yml scrape_configs: - job_name: 'redis_bigkey' metrics_path: '/metrics' static_configs: - targets: ['redis-exporter:9121'] # 告警规则 ALERT RedisBigKeyDetected IF redis_memory_usage_bytes{key=~".*"} > 10485760 # 10MB FOR 5m LABELS { severity = "critical" } ANNOTATIONS { summary = "BigKey detected: {{ $labels.key }}", description = "Key {{ $labels.key }} size is {{ $value }} bytes" }

四、BigKey 解决方案

1. 拆分方案

Hash 拆分示例:

// 原始大 Key user:1000:profile = { "name": "...", "address": "...", // ...5000个字段 } // 拆分方案 user:1000:profile:basic = { "name": "...", "age": 20 } user:1000:profile:contact = { "address": "...", "phone": "..." } user:1000:profile:preferences = { ... }

分片算法:

def get_shard_key(base_key, field, shards=10): return f"{base_key}:shard{hash(field) % shards}"

2. 过期策略

# 设置过期时间(临时方案) EXPIRE bigkey 3600 # 渐进式删除 redis-cli --eval del_bigkey.lua bigkey

del_bigkey.lua 脚本

Lua

local key = KEYS[1] local pattern = ARGV[1] or '*' local batch_size = tonumber(ARGV[2]) or 1000 local cursor = '0' repeat local reply = redis.call('SCAN', cursor, 'MATCH', pattern, 'COUNT', batch_size) cursor = reply[1] for _,k in ipairs(reply[2]) do redis.call('DEL', k) end until cursor == '0'

结语

BigKey 问题就像 Redis 使用过程中的"高血压",初期可能没有明显症状,但随时可能引发"脑溢血"式的严重故障。通过本文介绍的全套解决方案,您可以从容应对:

  1. 快速发现:多种检测方案结合
  2. 精准治理:根据业务特点选择拆分策略
  3. 长治久安:建立预防性架构和规范

记住:没有最好的方案,只有最适合业务场景的方案。建议先从最关键的业务开始治理,逐步完善整个 Redis 的使用规范。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/914528.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/914528.shtml
英文地址,请注明出处:http://en.pswp.cn/news/914528.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt 实现新手引导

Qt实现新手引导 对于一个新安装的软件或者一个新的功能&#xff0c;提供一个新手引导步骤&#xff0c;能够让用户快速熟悉。这是最终效果&#xff0c;每一个按钮都会有一个简单引导&#xff0c;通过点击上一步、下一步来切换不同的指导。当前引导的功能&#xff0c;会有一个高光…

Maven+Spring

一、Maven 相关- 本地仓库设置&#xff1a;- 在 IDE&#xff08;如 IntelliJ IDEA&#xff09;中可以设置 Maven 的本地仓库路径&#xff0c;本地仓库用于存储从远程仓库下载的依赖库&#xff0c;方便项目重复使用。- 仓库关系&#xff1a;- 项目&#xff1a;开发中的项目&…

Android Handler 消息机制

常用场景&#xff1a; 子线程发送Message 主线程处理Message 子线程发送消息 public final boolean sendEmptyMessageDelayed(int what, long delayMillis) {Message msg Message.obtain();msg.what what;return sendMessageDelayed(msg, delayMillis);}public final boole…

day9 串口通信

1串口通信串口通信是嵌入式系统和电子设备中最常用的 异步串行通信 方式&#xff0c;核心是通过 TX&#xff08;发送&#xff09; 和 R&#xff08;接收&#xff09; 两根线实现全双工数据传输。2通信协议分类2.1同步/异步通信同步和异步是串行通信中两种根本不同的数据传输方式…

面向对象的设计模式

一、设计模式简介1、什么是设计模式针对反复出现的问题所总结归纳出的通用解决方设计模式是指在软件开发过程中案。这些方案是众多软件开发人员经过大量实践总结出来的&#xff0c;具有高效性、可维护性和可扩展性等优点。使用设计模式可以帮助开发者更高效地构建软件系统&…

每日钉钉API探索:chooseDepartments专注于部门维度的选择接口

在企业级应用开发过程中&#xff0c;针对组织架构中的部门进行操作是非常常见的需求。今天我们要介绍的是钉钉的chooseDepartments API&#xff0c;它允许用户以部门为单位进行选择&#xff0c;并返回所选部门的相关信息。&#x1f4cc; 功能概述chooseDepartments API主要用于…

生产环境CI/CD流水线构建与优化实践指南

生产环境CI/CD流水线构建与优化实践指南 目录 业务场景描述技术选型过程实现方案详解 流水线结构设计并行构建与缓存策略部署策略&#xff1a;滚动、蓝绿、金丝雀回滚与告警自动化 踩过的坑与解决方案总结与最佳实践 业务场景描述 某大型电商平台&#xff0c;为了保证代码持续交…

腾讯云和火山云优劣势对比

从问题本身看&#xff0c;用户没有限定具体场景&#xff0c;说明可能需要一个全面的横向对比。不过云计算服务涉及面太广&#xff0c;我最好先搭建一个框架性的分析结构&#xff0c;再填充具体细节。 首先想到从几个核心维度切入&#xff1a;基础能力&#xff08;计算存储网络&…

Augment AI 0.502.0版本深度解析:Task、Guidelines、Memory三大核心功能实战指南

Augment AI 0.502.0版本深度解析&#xff1a;Task、Guidelines、Memory三大核心功能实战指南 augment最新版辅助功能全解析续杯免费额度再用满教程|memory|userguidlines|tasksaugment最新插件功能教程前言 在AI辅助编程领域&#xff0c;Augment AI作为一款强大的VS Code插件&…

docker搭建、小皮面板搭建、bp使用、msf

docker搭建Vulhub靶场 docker安装 apt-get install docker.io docker-compose#设置docker代理&#xff1a;创建文件夹以及对应的文件 mkdir /etc/systemd/system/docker.service.d#在该文件中配置自己的代理ip以及代理端口 vim /etc/systemd/system/docker.service.d/http-p…

AI优化器美国VPS集成:智能算力部署与性能调优指南

在当今数字化浪潮中&#xff0c;AI优化器与高性能VPS的融合正成为企业技术架构的核心竞争力。本文将深入解析美国VPS服务器如何通过AI驱动的智能优化技术实现算力突破&#xff0c;从资源配置算法到实时流量调度&#xff0c;全面揭示这种创新组合在跨境电商、大数据分析等场景中…

【保姆级图文详解】Spring AI 中的工具调用原理解析,工具开发:文件操作、联网搜索、网页抓取、资源下载、PDF生成、工具集中注册

目录前言一、Spring AI 中的工具调用&#xff08;Tool Calling&#xff09;1.1、概念1.2、工作原理1.3、技术选型1.4、原理解析1.4.1、实现接口1.4.2、工具调用二、工具调用&#xff08;Tool Calling&#xff09;开发2.1、文件操作2.1.1、概念描述2.1.2、概念描述2.2、联网搜索…

Redis客户端使用(Client、Java、SpringBoot)

上篇文章&#xff1a; Redis数据类型之zsethttps://blog.csdn.net/sniper_fandc/article/details/149139955?fromshareblogdetail&sharetypeblogdetail&sharerId149139955&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link 目录 1 Redis客户端…

Modbus 开发工具实战:ModScan32 与 Wireshark 抓包分析(一

引言 ** 在工业自动化领域&#xff0c;Modbus 协议犹如一座桥梁&#xff0c;连接着各种电子设备&#xff0c;实现它们之间高效的数据交互。从可编程逻辑控制器&#xff08;PLC&#xff09;到人机界面&#xff08;HMI&#xff09;&#xff0c;再到各类智能传感器&#xff0c;M…

Oracle SQL - 使用行转列PIVOT减少表重复扫描(实例)

[13/JUL/2025, Yusuf Leo, Oracle SQL Performance Tuning Series]我们经常会遇到从同一表中按不同维度取出不同区间的数据&#xff0c;再以相同的属性将这些数据分别汇总到一起的需求。这类需求往往迫使我们对同一个表反复去扫描&#xff0c;当原始数据量太大的时候&#xff0…

HTTP 请求方法详解:GET、POST、PUT、DELETE 等

在 HTTP 协议中&#xff0c;请求方法&#xff08;也称为 HTTP 动词&#xff09;定义了客户端希望对指定资源执行的操作类型。这些方法是 HTTP 报文的核心组成部分&#xff0c;决定了请求的目的和行为。 主要 HTTP 请求方法 1. GET 用途&#xff1a;获取资源 特点&#xff1a…

Android 代码热度统计(概述)

1. 前言 代码热度统计&#xff0c;在测试中一般也叫做代码覆盖率。一般得到代码覆盖率后就能了解整体样本在线上的代码使用情况&#xff0c;为无用代码下线提供依据。 做了一下调研&#xff0c;在Android中一般比较常用的是&#xff1a;JaCoCO覆盖率统计工具&#xff0c;它采…

RAG优化

RAG搭建本地AI知识库&#xff0c;在使用过程中遇到的三大痛点&#xff0c;以及相应的进阶方案。1. RAG知识库的三大痛点-- 内容理解不足&#xff1a;AI难以全面理解导入资料的内容&#xff0c;比如在向量编码时候&#xff0c;生硬的截断等导致分析结果不理想。eg: 知识库分割器…

Ubuntu 24.04 启用 root 图形登录

关键词&#xff1a;Ubuntu 24.04、root 登录、GDM、SSH、nano、配置文件一、前言 Ubuntu 默认禁用 root 账户 的图形与 SSH 登录&#xff0c;这是为了安全。但在某些场景&#xff08;如测试、救援、自动化脚本&#xff09;你可能需要 直接用 root 登录 GNOME 桌面。本文以 Ubun…

Jekyll + Chirpy + GitHub Pages 搭建博客

Chirpy 是适用于技术写作的简约、响应迅速且功能丰富的 Jekyll 主题&#xff0c;文档地址&#xff1a;https://chirpy.cotes.page/ &#xff0c;Github 地址&#xff1a;jekyll-theme-chirpy 。 1.开始 打开 chirpy-starter 仓库&#xff0c;点击按钮 Use this template -->…