热点 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 设置过长会在价格、库存类场景返回过期数据,敏感值不要走本地缓存。