朋友圈关注模型设计(Redis 实现)¶
一、需求¶
- 关注/取关。
- 朋友圈:按时间倒序看好友发的内容。
- 点赞、评论。
- 粉丝数、关注数。
二、数据结构¶
关注关系¶
共同关注¶
朋友圈 Feed¶
用户发的内容放自己的 ZSet:
收件箱(推模式)¶
发消息时,把内容推给所有粉丝的收件箱:
三、推 vs 拉 vs 推拉结合¶
推模式(写扩散)¶
发消息时遍历粉丝,写入粉丝收件箱。
- 读快:直接读收件箱。
- 写慢:粉丝多了写 N 次。
拉模式(读扩散)¶
读的时候遍历关注人,拉他们的最新内容。
- 写快:只写自己的。
- 读慢:关注多了读 N 次。
推拉结合(推荐)¶
- 普通用户:推模式。
- 大V(粉丝多):拉模式,不推。
- 读时合并:自己的 + 关注的 + 大V的。
四、点赞/评论¶
点赞数¶
五、为什么用 Set¶
- 自动去重。
- SINTER/SDIFF 算共同关注。
- SISMEMBER 判断是否关注。
六、为什么用 ZSet¶
- 按时间排序。
- ZREVRANGE 取最新。
- 分页。
七、总结¶
面试要点
朋友圈核心是"写扩散 vs 读扩散"。大V用拉,普通人用推,混合模式最优。