热搜与读风暴
→ 返回 高并发
微博热搜、新闻突发、明星官宣:典型 读风暴——少数热点内容被亿级访问,写端相对可控。核心是 多级缓存 + 热点隔离 + 降级静态,而非库存扣减。
场景特征
| 特征 | 说明 |
|---|---|
| 读 QPS 极高 | 单条内容 ID 成热点 |
| 写相对较少 | 发帖、转评有峰但常低于读 |
| 时间线多样 | 热搜榜、详情页、评论列表 |
| 允许短暂旧 | 阅读量、评论数可近似 |
解决方案总览
CDN 缓存静态壳 + 边缘缓存 API(可协商)
▼
网关限流(防爬虫打穿)
▼
L1 本地缓存(热点详情 1~3s)
▼
Redis 集群(详情、热搜榜、计数)
▼
DB 从库 / 只读副本
▼
失效:MQ 广播刷新 L1 + 删 Redis
1. 热搜榜
| 手段 | 说明 |
|---|---|
| ZSet / 有序列表 | hot:search:20240627 score=热度 |
| 本地缓存 Top50 | 全站相同,每实例 1s 刷新 |
| 聚合异步 | 点击、搜索词写入 MQ,消费者合并更新榜(见 时间窗口设计) |
读多写少:写路径进 MQ 合并,读路径只读 Redis。
2. 热点内容详情(热 key)
某 post_id=999 被访问百万次/分钟:
| 层级 | 策略 |
|---|---|
| CDN | 未登录可读部分静态化 |
| 应用 L1 | Caffeine<postId, Dto> max=1000,TTL 2s |
| Redis | post:999 单 key,加随机后缀读扩散 post:999:{0..7} 写时 fan-out |
| 副本 | 读从库,主库只写 |
热点探测:采样 access log 或 Redis hotkeys,自动提升 L1 TTL。
3. 写路径(发帖)与读分离
发帖 → 写主库 → 发 MQ
→ 消费者更新搜索索引(ES)、刷新缓存、粉丝时间线
推拉结合:
| 模式 | 适用 |
|---|---|
| 拉(Timeline) | 大 V 发帖,粉丝拉取 |
| 推(Fan-out) | 普通用户,粉丝少可推;大 V 只写收件箱索引 |
大 V 发帖忌同步推百万粉丝信箱——改 拉模型 + 缓存。
4. 计数类(阅读、点赞)
见 点赞与播放计数:INCR + 异步落库,展示可滞后。
5. 降级
| 级别 | 行为 |
|---|---|
| L1 | 关评论实时、只缓存详情 |
| L2 | 返回简化 JSON、无推荐 |
| L3 | 静态「热点专题页」 |
检查清单
- 热点 post 是否打穿单 Redis?
- 是否误用主库扛读?
- 大 V 发帖是否同步 fan-out?
- 缓存失效是否广播到所有实例?