点赞与播放计数

返回 高并发

短视频点赞、文章「在看」、播放量:海量 增量写,展示数字可近似(99.1万 vs 991023)。最优解是 内存聚合 + 异步刷库,而非每次点击 UPDATE


场景特征

特征说明
极高频写每用户每内容一次或多次
读频繁列表页展示 count
可近似UI 显示「10万+」
防刷设备、账号、速率限制

解决方案总览

点赞请求
  ▼
Redis INCR / SADD(去重点赞用 Set)
  ▼
定时(1s~10s)或 阈值触发 → 批量 UPDATE DB
  ▼
读:优先 Redis,miss 读 DB

1. 去重点赞

结构命令说明
SetSADD like:post:999 uid 返回 1 才 INCR一人一票
Bitmap亿级用户慎用,适合 uid 稠密省内存
Bloom快速判重,有误判需二次确认前置过滤
SADD like:post:999 10001
# 返回 1 → INCR like:count:post:999

2. 播放计数(可不去重)

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?

相关