初始模型:
用户对某个对象点赞,本质上就是保存一条 user_id + target_id 的点赞关系;最简单可以直接落 MySQL,唯一索引保证不能重复点赞。Redis 可以作为加速层,辅助做去重和计数。
- 去重:同一个用户不能重复点赞 → MySQL 唯一索引,或者 Redis Set / Bitmap 辅助判断
- 点赞数统计:每次都查数据库
count(*)成本高 → Redis 单独维护点赞计数 - 高并发突发:明星内容瞬间大量点赞,数据库写入扛不住 → 先写 Redis / MQ,后台异步批量落库
- 热 Key:单个热门内容的点赞量特别大,所有请求集中到一个 Redis Key → 按
hash(user_id)做 Key 分片,分散压力 - 总量过大:单个 Set 里用户数量太多 → 同样通过分片拆成多个 Set / Bitmap
- 最终一致性:Redis、MQ、数据库之间可能短暂不一致 → 异步落库 + 定期对账补偿
- 额外能力:如果还要展示“谁点过赞”“我是否点赞”“点赞排行榜”等 → 再按具体查询需求设计索引或额外缓存
最后主线就是:
保存点赞关系 → 去重 → Redis 计数 → 高并发时 MQ 削峰 → 热 Key / 大 Key 分片 → 异步落库 → 对账兜底。