点赞与播放计数
→ 返回 高并发
短视频点赞、文章「在看」、播放量:海量 增量写,展示数字可近似(99.1万 vs 991023)。最优解是 内存聚合 + 异步刷库,而非每次点击 UPDATE。
场景特征
| 特征 | 说明 |
|---|---|
| 极高频写 | 每用户每内容一次或多次 |
| 读频繁 | 列表页展示 count |
| 可近似 | UI 显示「10万+」 |
| 防刷 | 设备、账号、速率限制 |
解决方案总览
点赞请求
▼
Redis INCR / SADD(去重点赞用 Set)
▼
定时(1s~10s)或 阈值触发 → 批量 UPDATE DB
▼
读:优先 Redis,miss 读 DB
1. 去重点赞
| 结构 | 命令 | 说明 |
|---|---|---|
| Set | SADD like:post:999 uid 返回 1 才 INCR | 一人一票 |
| Bitmap | 亿级用户慎用,适合 uid 稠密 | 省内存 |
| Bloom | 快速判重,有误判需二次确认 | 前置过滤 |
SADD like:post:999 10001
# 返回 1 → INCR like:count:post:9992. 播放计数(可不去重)
INCR play:video:888
# 或 INCRBY 批量合并消费者每秒 GET 差值写 DB,或 Kafka 汇总流。
3. 合并写 DB
// 伪代码:每 5 秒 flush
Map<String, Long> delta = redis.scanDirtyKeys();
batchUpdate("UPDATE content SET like_count = like_count + ? WHERE id = ?", delta);| 参数 | 权衡 |
|---|---|
| 刷盘间隔 | 越短越准,DB 压力越大 |
| 丢 Redis | 可从 DB 基准 + Redis 增量恢复 |
4. 读路径
展示 count = Redis GET(主)
miss → DB + 回填 Redis
列表页 Pipeline MGET 百个 count,禁止 N 次 SQL。
5. 与热搜、步数榜关系
| 场景 | 计数方案 |
|---|---|
| 点赞 | Set 去重 + INCR |
| 播放 | INCR 即可 |
| 步数 | max 合并,非简单 +1 |
| 排行榜 | ZSet score,非单计数器 |
检查清单
- 每次点赞是否 UPDATE 一行?
- 重复点赞是否重复 +1?
- Redis 宕机数字是否可从 DB 恢复?
- 列表页是否 N+1 查 count?