热 Key 与热点数据

部分键承载远高于均值的流量:缓存层会形成单分片热点,数据库会出现行锁竞争;用本地缓存、热点复制与写合并等手段摊平热点。

热 Key 与热点数据是什么

热 Key 指少数键承载远高于平均水平的访问量,例如首页配置、爆款商品、活动库存。它在不同层造成不同问题:缓存层上,热点键所在的分片负载远高于其他分片,扩容对缓解热点无效;存储层上,同键的并发更新造成行锁竞争与排队。治理思路是分层摊平:读侧用进程内本地缓存与热点键多副本分流,写侧用合并写与延迟聚合降低竞争,同时从数据分布上评估分片键是否需要调整。

基本信息

识别口径单键访问量占比、分片负载偏离度、行锁等待与冲突率
缓存侧本地缓存承接读、热点键复制到多个分片随机读取
存储侧合并写、延迟聚合或改写为异步累加
隔离手段热点依赖独立实例或线程池,限制影响面
根因治理评估分片键与数据分布,必要时改键或加盐

典型使用场景

  • 大促爆款商品:详情与库存查询集中,需要提前复制与预热
  • 首页与活动页配置:读取极高频、变更少,用本地缓存最合适
  • 秒杀库存扣减:同键并发更新造成行锁排队,需合并写或拆分库存
  • 排行榜与计数:单键高频自增,可先本地聚合再批量写
  • 热点账号与话题:社交场景中少数对象承载大部分流量
  • 定时任务集中处理:同一批键在短时间内被反复读写

治理要点

治理要点
# 1 识别:按 key 维度统计访问量与分片负载,列出头部键
# 2 读侧分流:进程内本地缓存(设短过期)承接极高频小对象读
# 3 读扩散:热点键复制 N 份(如 key:1 到 key:N),读侧随机选择
# 4 写侧合并:短窗口内聚合同键写请求,再单次提交,降低行锁竞争
# 5 隔离:热点依赖使用独立实例或独立线程池,避免波及普通请求
# 6 根因:评估分片键,必要时改键或加盐,避免结构性热点
# 7 活动准备:按历史访问榜预判热点并提前预热,活动后复盘更新清单

问题层次与对策

层次表现对策
本地缓存热点数据频繁回源本地缓存加短过期,更新时主动失效
缓存分片单分片负载远高于其他分片热点键多副本读扩散随机选择
存储行锁同键并发更新排队与超时写合并、延迟聚合或改用累加式更新
资源竞争热点请求挤占普通请求资源独立实例或独立线程池隔离
数据分布分片键倾斜形成结构性热点改分片键或加盐,重新评估分布
热点的另一类来源是数据分布倾斜:分片键设计不当会造成结构性热点,这种情况下横向扩容无法缓解,只能从分片规则上解决。
本地缓存的热点数据要设短过期并支持主动失效:只靠过期会导致更新后各实例数据长期不一致,用户在不同页面上看到不同结果。

易错点

  • 热点键集中在单个分片:扩容无法缓解,容量评估结论失效
  • 本地缓存热点数据不设过期:更新后长时间不一致
  • 同键并发更新无合并:行锁等待累积,延迟与超时集中出现
  • 热点依赖不隔离:一个热点把普通请求的资源一起占满
  • 活动后不复盘:热点清单与容量基线不更新,下一轮问题重复发生

数据来源与参考

  • Redis 文档:热点键与大键处理
  • 《数据密集型应用系统设计》(Kleppmann)第 6 章
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌