首页/数据/NoSQL 速查/热点 key 的识别与打散
选型与架构50 条

热点 key 的识别与打散

热点 key 让单节点承担大部分读写,表现为 CPU 或带宽倾斜。先定位(Redis 提供基于 LFU 的 hotkeys 采样),再按读写路径处置:本地缓存挡读、key 加后缀拆多份、读写分离与限流降级。

NoSQL 速查数据更新于 2026-10-13

热点 key 是什么

热点 key 让单个节点承担大部分读写,表现为 CPU 或带宽倾斜。定位与处置要分开做:定位可以用 Redis 基于 LFU 采样的 hotkeys 命令,处置则按读写路径选择——进程内缓存挡住读、给 key 加后缀拆成多份、读写分离与限流降级。打散会改变读取逻辑(需要聚合多个分片的结果),改动前先评估收益再动手。

基本信息

定位手段redis-cli --hotkeys(需 LFU 类淘汰策略)、OBJECT FREQ、INFO commandstats
读热点处置进程内缓存短 TTL、读写分离
写热点处置key 加后缀拆成 N 份、本地聚合后批量提交
代价读取需聚合多份结果,逻辑与延迟都会变化
所属系统Redis 等缓存与计数场景

典型使用场景

  • 秒杀与抢购:同一商品 key 的读写集中在单个节点
  • 计数器:全局计数 key 成为写热点
  • 榜单与排行:热门榜单被高频读取
  • 活动配置:单个配置 key 被大量实例同时读取
  • 打散验证:拆分后确认总吞吐与延迟确实改善

定位与处置

定位与处置
# 定位热点(需要 LFU 类淘汰策略才有采样数据)
redis-cli --hotkeys
redis-cli OBJECT FREQ mykey
redis-cli INFO commandstats | head -20

# 读热点:进程内缓存兜一层(伪代码)
def price_of(sku):
    v = local_cache.get(sku)      # 进程内缓存,TTL 1 到 5 秒
    if v is None:
        v = redis.get("price:" + sku)
        local_cache.set(sku, v, ttl=3)
    return v

处置手段对照

手段适用代价
进程内缓存读热点短 TTL,敏感值不适合
key 加后缀分片写热点读取需聚合多份
读写分离读多写少架构与运维复杂度上升
限流降级突发流量部分请求被拒绝
本地聚合后批量写计数类展示值是近似或延迟的
计数类热点可以先在本地聚合再批量写入,减少对单个 key 的并发写压力;展示时把多个分片的值求和或取近似值。
打散后读取需要聚合多个分片结果,逻辑与延迟都会变化,先评估收益再改代码。
进程内缓存 TTL 设置过长会在价格、库存类场景返回过期数据,敏感值不要走本地缓存。

易错点

  • 打散后读取需要聚合多个分片结果,逻辑与延迟都会变化,先评估收益再改
  • 本地缓存 TTL 设置过长会在价格、库存类场景返回过期数据,敏感值不要走本地缓存
  • 没有 LFU 类淘汰策略时 hotkeys 采样数据不可用,会白等命令返回
  • 只处理读热点不处理写热点,写侧依旧集中在单个节点

数据来源与参考

  • Redis Docs: Redis CLI
  • Redis Docs: Key eviction
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌