news 2026/6/22 20:41:19

大 Key / 热 Key 线上治理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
大 Key / 热 Key 线上治理

大 Key / 热 Key 线上治理:定位、拆分、降级全套优化手段

Redis 崩了,八成跟这两个" Key "有关。

大 Key 让你的 Redis 堵得像早高峰的三环,热 Key 让单节点 QPS 直接打满——它们不是同一个问题,但都能让整个集群陪葬。这篇文章把从定位到治理的全链路方案讲透,每一步都能直接落地。


一、先搞清楚:大 Key 和热 Key 根本不是一回事

维度大 Key热 Key
本质单次操作数据量过大单个 Key 访问频率过高
症状阻塞、网络拥塞、主从延迟单节点 CPU/QPS 飙升、缓存击穿
危险时刻读写、删除、迁移时高峰期流量集中时
核心思路——把大的拆小——把集中的分散

治理大 Key 是设计问题,治理热 Key 是架构问题。搞混了,方案全废。


二、大 Key:精准定位,三步锁定

第一步:全局扫描,快速圈定嫌疑对象

bash

redis-cli -h 127.0.0.1 -p 6379 --bigkeys

输出示例:

Biggest string found so far 'product:detail:1001' with 120000 bytes Biggest hash found so far 'user:info:10000' with 10000 fields

这条命令按类型输出每个类型里最大的 Key,适合快速摸底。但注意:它只告诉你"最大的",不告诉你"所有大的"。真正的大 Key 可能藏在第 10 名。

生产建议:在从节点执行,避免影响主节点性能。

第二步:精确测量,确认威胁等级

对疑似大 Key 做二次确认:

bash

TYPE product:detail:1001 # 确认数据类型 STRLEN product:detail:1001 # 字符串体积(字节) HLEN user:info:10000 # Hash 字段数 LLEN order:list:1001 # List 元素数 MEMORY USAGE product:detail:1001 # 真实内存占用(含管理开销)

统一判定标准(华为云/腾讯云实践共识)

类型大 Key 阈值严重大 Key
字符串> 1MB> 100MB
Hash/List/Set/ZSet> 1 万元素> 10 万元素
单分区大小> 100MB

第三步:SCAN + DEBUG 组合,批量排查

--bigkeys只能看 Top 1,要找出所有大 Key,必须编程扫描:

python

import redis r = redis.Redis(host='127.0.0.1', port=6379, decode_responses=True) cursor = 0 big_keys = [] while True: cursor, keys = r.scan(cursor=cursor, count=100) for key in keys: size = r.debug_object(key).get('serializedlength', 0) if size > 10240: # 10KB 阈值,按需调整 big_keys.append((key, size)) if cursor == 0: break print(f"发现 {len(big_keys)} 个大 Key") for k, s in big_keys: print(f"{k}: {s} bytes")

进阶:离线分析 RDB 文件

生产环境大规模集群推荐离线分析,不影响线上:

bash

rdb-tools -c memory dump.rdb > memory.csv # 在 CSV 中筛选 serializedlength > 10240 的行

关联业务证据,确认优先级

定位完技术指标后,必须关联业务:

bash

SLOWLOG GET 128

看慢查询里是否有大 Key 的身影。如果HGETALL user:info:10000频繁出现在慢查询中,它就是你的头号敌人。

建立排查台账:

Key 名称类型大小访问频率关联接口处理优先级
user:info:10000Hash10000 fields500/min用户详情P0

三、大 Key 治理:拆是核心,删要安全

手段一:拆分——最有效,没有之一

原则:避免一次操作全量数据。

原始大 Key拆分方案拆分后 Key
user:1000(10万字段的 Hash)按业务字段拆user:1000:baseuser:1000:profileuser:1000:stat
order:list:0(百万级 List)按时间分页order:list:0:202501order:list:0:202502
超大 JSON 字符串Hash 化product:detail:1001:nameproduct:detail:1001:price

Java 客户端分片示例:

java

public class KeySharding { private static final int SHARD_COUNT = 10; public String getShardedKey(String originalKey, String userId) { int shardIndex = Math.abs(userId.hashCode()) % SHARD_COUNT; return originalKey + ":" + shardIndex; } } // 写入时:product:123 -> product:123:0 ~ product:123:9 // 读取时:随机或 hash 选取一个分片

手段二:安全删除——UNLINK 替代 DEL

这是最容易踩的坑:直接 DEL 大 Key 会阻塞主线程。

bash

# ❌ 危险:主线程阻塞,期间所有请求排队 DEL big:hash:key # ✅ 安全:Redis 4.0+,异步释放,不阻塞主线程 UNLINK big:hash:key

Redis 6.0+ 可开启惰性删除:

bash

lazyfree-lazy-user-del yes lazyfree-lazy-user-flush yes

开启后,即使执行DEL,底层也等效于UNLINK

对集合类型大 Key,必须分批删:

bash

# Hash:先 HSCAN 取字段,再 HDEL 逐个删 HSCAN big:hash 0 COUNT 100 HDEL big:hash field1 field2 field3 ... # List:先 LRANGE 分页取,再 LTRIM 缩减 LRANGE big:list 0 99 LTRIM big:list 100 -1

手段三:数据迁移——不该放 Redis 的搬走

超大 JSON、二进制文件、历史归档数据——Redis 不是为这些设计的。

数据类型迁移目标
超大 JSON/对象MongoDB、Elasticsearch
图片/文件对象存储(S3/OSS)
历史冷数据数据库 + TTL,或直接归档

铁律:所有可过期数据必须设置 TTL。忘设 TTL 是大 Key 膨胀的第一元凶。


四、热 Key 治理:把火分散,把压降级

第一步:找到那把"火"

排查方式原理优缺点
INFO statskeyspace_hits分布简单但不精确
redis-cli monitor+ redis-faina实时抓操作记录准确但高并发下影响性能
客户端埋点(AtomicLongMap)SDK 层统计访问频率准确但侵入性强
代理层收集(Twemproxy/Codis)代理统一统计对业务透明但增加架构复杂度
云厂商控制台(阿里云/腾讯云)平台级热 Key 分析一键出结果,最省事

华为云实践阈值:访问频率 > 100,000 次/分钟 = 热 Key,设置多级预警。

第二步:四大治理手段,按场景选

手段一:Key 分片——读多写少的首选

把一个热 Key 拆成 N 个副本,流量打散:

hot:product:123 → hot:product:123:0 ~ hot:product:123:9

写:只写主 Keyhot:product:123:0
读:随机或 hash 取一个分片

java

// 读取时随机选一个分片 int shard = ThreadLocalRandom.current().nextInt(10); String key = "hot:product:123:" + shard; return redisTemplate.opsForValue().get(key);

京东 hotkeys 方案更进一步:代理层自动识别热 Key,创建临时副本,实现流量自动负载均衡。

手段二:本地缓存——挡在 Redis 前面的最后一道墙

热点数据根本不该到 Redis。用 Caffeine/Guava Cache 挡在应用层:

java

LoadingCache<String, Object> localCache = Caffeine.newBuilder() .maximumSize(1000) .expireAfterWrite(5, TimeUnit.MINUTES) .build(key -> redisTemplate.opsForValue().get(key));

收益:某线上案例,接入本地缓存后 Redis QPS 骤降 99%。

但要注意:

  • 本地缓存过大会导致 GC 压力
  • 必须有同步机制保证与 Redis 一致性(推荐 Redis 发布订阅 + 版本号校验)
手段三:读写分离——读压力的解药

适用于读多写少场景:

写请求 → 主节点 读请求 → 从节点(多个)

云上一键开启即可。但从节点增多会增加故障率,运维复杂度上升,需权衡。

手段四:限流 + 降级——最后的保险

当热 Key 已经把 Redis 打满,必须断臂求生:

策略实现方式示例
接口限流Sentinel / Guava RateLimiter秒杀接口限 1000 QPS
Redis 侧限流Lua 脚本原子判断超过阈值直接返回空
服务降级返回兜底数据商品详情降级为默认推荐列表
热点黑白名单业务层定制临时屏蔽非核心热 Key

五、全链路闭环:从发现到根治

治理不是一次删除,是建立可持续的闭环:

发现 → 止血 → 改造 → 验证 → 回滚 → 监控
阶段动作检查项
发现定期扫描 + 阈值告警Top 大 Key 清单是否完成
止血本地缓存 + UNLINK 删除接口延迟、慢查询是否回落
改造Key 拆分 + 分片高风险接口是否完成分页改造
验证双写 + 数据一致性校验新旧数据是否一致
回滚保留旧读逻辑开关回滚触发条件是否演练通过
监控阈值告警 + 周巡检告警是否生效、巡检是否执行

六、一张表记住所有方案

问题本质定位方法核心手段兜底方案
大 Key单次操作数据量过大--bigkeys+ SCAN+DEBUG拆分+ UNLINK 删除数据迁移出 Redis
热 Key单个 Key 访问频率过高INFO stats+ 客户端埋点 + 云控制台分片+ 本地缓存 + 读写分离限流 + 降级

Redis 的性能上限,往往取决于 Key 的设计能力。大 Key 靠拆,热 Key 靠分,而所有方案的前提是——你得先找到它们。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/22 20:36:40

如何快速掌握音乐结构分析?MSAF框架完整指南

如何快速掌握音乐结构分析&#xff1f;MSAF框架完整指南 【免费下载链接】msaf Music Structure Analysis Framework 项目地址: https://gitcode.com/gh_mirrors/ms/msaf 还在为音乐结构分析而烦恼吗&#xff1f;&#x1f3b5; 想知道如何快速识别歌曲的段落、副歌和桥段…

作者头像 李华
网站建设 2026/6/22 20:35:08

ATtiny25/45/85硬件设计避坑指南:从勘误表到低功耗实战

1. 从一次诡异的“掉固件”事件说起去年&#xff0c;我接手了一个小型温湿度监测节点的硬件维护。主控用的是一颗经典的ATtiny85&#xff0c;电路板也就指甲盖大小&#xff0c;设计看起来简单得不能再简单&#xff1a;MCU、传感器、一颗纽扣电池&#xff0c;加上几个阻容。第一…

作者头像 李华
网站建设 2026/6/22 20:32:12

Ubuntu下安全部署MariaDB全流程指南

1. 项目概述&#xff1a;为什么在 Ubuntu 上装 MariaDB 不是“点几下鼠标”就能完事的事MariaDB 是 MySQL 的一个高性能、开源分支&#xff0c;如今已是绝大多数 Linux 发行版默认的数据库首选——Ubuntu 从 16.04 起就将mariadb-server替代了mysql-server作为default-mysql-se…

作者头像 李华
网站建设 2026/6/22 20:28:46

终极Git管理神器:Gitnuro跨平台客户端完整安装与配置指南

终极Git管理神器&#xff1a;Gitnuro跨平台客户端完整安装与配置指南 【免费下载链接】Gitnuro A FOSS Git multiplatform client for newbies and pros 项目地址: https://gitcode.com/GitHub_Trending/gi/Gitnuro Gitnuro是一款基于Jetbrains Compose和JGit开发的开源…

作者头像 李华
网站建设 2026/6/22 20:12:18

接口自动化测试多环境配置实战:从硬编码到配置驱动

1. 项目概述&#xff1a;为什么多环境配置是接口自动化的“命门”&#xff1f;干了这么多年测试&#xff0c;我见过太多团队在接口自动化上栽跟头&#xff0c;不是脚本写不好&#xff0c;而是环境切换搞不定。一个在本地跑得飞起的测试用例&#xff0c;一到测试环境就报错&…

作者头像 李华
网站建设 2026/6/22 20:11:47

物体距离测算 单摄像头估算物体的实际距离 目标深度检测

如何使用YOLOv11和自定义AI模型通过单摄像头估算物体的实际距离 在计算机视觉和人工智能的研究中&#xff0c;物体检测和距离估算是两个非常重要的任务。传统的距离估算方法通常依赖于多个摄像头或专用的传感器&#xff0c;但这些方法成本高且实现复杂。随着深度学习技术的进步…

作者头像 李华