Yihui’s Blog

朋友圈点赞功能如何实现?

日期:2026-07-11
标签:#面试 #八股 #后端 #系统设计 #点赞 #场景题

一句话答案

以动态和用户建立唯一点赞关系,点赞/取消做幂等状态转换,计数异步聚合;展示时还要按好友可见性过滤并批量查询点赞用户。

面试口语版

关系表使用 postId + userId 唯一键,点赞是插入或把状态改为有效,取消是改为无效,不能盲目加减计数。高并发时可在 Redis Lua 中原子修改集合/状态和计数,再通过可靠事件落数据库;数据库唯一约束兜底。朋友圈详情批量返回当前用户是否点赞、点赞数和部分好友头像,完整列表游标分页。动态删除、拉黑或可见范围变化时,读路径必须重新校验权限,点赞通知异步发送且可聚合。

关键细节

  • 点赞关系是真实数据,计数是可重建派生数据。
  • 同一个请求重复到达不能重复加计数。
  • 大 V 动态可能形成热点 Key,需要本地缓存、分桶或异步聚合。
  • 通知可合并为“多人赞了你”,避免消息轰炸。

面试官追问

  1. 朋友圈与普通内容点赞有什么额外要求?
  2. 点赞后立刻取消,消息乱序怎么办?
  3. 如何展示“共同好友点赞”?

面试官追问参考答案

1. 朋友圈与普通内容点赞有什么额外要求?

核心是社交可见性:动态权限、好友关系、拉黑和删除都会影响点赞是否可见。查询和通知都不能只按 postId 返回全部用户,必须基于当前关系做权限过滤并防止隐私泄露。

2. 点赞后立刻取消,消息乱序怎么办?

事件携带关系版本或更新时间,消费者只接受更高版本,数据库按 (postId,userId) 幂等更新最终状态。计数聚合使用可撤回事件,定时从关系明细校准;通知发送前可短暂聚合或检查最终状态。

3. 如何展示“共同好友点赞”?

先获取动态点赞用户集合,再与当前用户好友集合求交集,并按时间或亲密度取前几个。规模大时使用缓存的好友集合、倒排关系或离线社交图服务,所有结果仍受隐私策略约束。

学习清单

  • 区分关系、计数和通知三条链路。
  • 能说明社交权限与乱序处理。
维护与整理 · Yihui在 GitHub 上编辑

继续阅读

浏览全部文章