跳转至

朋友圈关注模型设计(Redis 实现)

一、需求

  • 关注/取关。
  • 朋友圈:按时间倒序看好友发的内容。
  • 点赞、评论。
  • 粉丝数、关注数。

二、数据结构

关注关系

follow:{userId}     Set/followed:我关注的人
fans:{userId}       Set:我的粉丝
SADD follow:1001 2001 2002
SADD fans:2001 1001

共同关注

SINTER follow:1001 follow:1002

朋友圈 Feed

用户发的内容放自己的 ZSet:

post:{userId}  ZSet,member=postId,score=timestamp

收件箱(推模式)

发消息时,把内容推给所有粉丝的收件箱:

inbox:{fanId}  ZSet,存关注人发的 postId

三、推 vs 拉 vs 推拉结合

推模式(写扩散)

发消息时遍历粉丝,写入粉丝收件箱。

  • 读快:直接读收件箱。
  • 写慢:粉丝多了写 N 次。

拉模式(读扩散)

读的时候遍历关注人,拉他们的最新内容。

  • 写快:只写自己的。
  • 读慢:关注多了读 N 次。

推拉结合(推荐)

  • 普通用户:推模式。
  • 大V(粉丝多):拉模式,不推。
  • 读时合并:自己的 + 关注的 + 大V的。

四、点赞/评论

like:post:{postId}    Set:点赞用户
comment:post:{postId} List:评论

点赞数

SCARD like:post:123

五、为什么用 Set

  • 自动去重。
  • SINTER/SDIFF 算共同关注。
  • SISMEMBER 判断是否关注。

六、为什么用 ZSet

  • 按时间排序。
  • ZREVRANGE 取最新。
  • 分页。

七、总结

关注关系:Set
Feed:ZSet(按时间)
点赞:Set
评论:List

面试要点

朋友圈核心是"写扩散 vs 读扩散"。大V用拉,普通人用推,混合模式最优。