微信朋友圈只能看到好友点赞这个功能是如何实现的

微信的朋友圈,不像 qq 空间,其只能看到好友的点赞和评论信息

微信是如何实现这个功能的,对于微信来说,用户基数很大,流量很大

如果采用,先获取一个 tweet 下面的所有点赞人的 user_id set A,再根据浏览者的 user_idfriendship 获取所有 friends 的 user_id set B,再把 A 和 B 取交集的话。。。。。。

只能说这种做法看起来就很不行,对 dbQPS 考验太大。

有什么更好的办法吗?

千万别说出让客户端过滤这种想法!
阅读 5.7k
4 个回答

首先根本就不是关系数据库。

其次现在不太清楚,2015 年以前“只能看到好友的点赞”和“只能看到好友的朋友圈”的实现方式是一样的。你把“点赞”这种数据也理解成与“发了一条朋友圈”类似就好了。

带有“关注”、“订阅”、“好友”这类性质的 Feed 流基本都是同样的方案,无非是有的产品还需要“千人千面”处理回归和排序,而朋友圈这种只按照时间排序就好了。另外就是不同产品之间侧重点稍微有点儿区别,比如微博类的粉丝可能会是海量的、而微信的好友人数是有上限且量很小的,但这个本身不是重点。

千万别说出让客户端过滤这种想法!

你加一层代码, 把客户端过滤的代码写在服务器那边不就好了?

其余的部分和经典面试题,"设计推特" 差不多吧.
可以看看链接里的方案.
https://vonng.gitbooks.io/ddi...

1、首先微信的好友功能是不会直接走 db 的,而朋友圈只能看到好友点赞评论功能则的是通过 redis 实现的

2、redis 中可以实现两个集合中求交集的功能,这是现在很多社交软件实现的方法
当用户登录时候,将该用户所有好友存在 redis 中的 collect1 中,再跟朋友圈用户的好友集合 collect2 对比求交集,即可实现

3、大概代码如下:

// 用户登录成功
$collect1 = [1,2,3,4];
$collect2 = [2,4,6,7];

$redis->sadd('collect1', $collect1);
$redis->sadd('collect2', $collect2);

// 获取交集
$result = $redis->sinter('collect1', 'collect2');
print($result);

// 结果如下
[2, 4]

用常规的关系型数据库做的话,不需要好友关系/点赞数一行一条。。。
毕竟既然这年头join已经被扔出高性能范式了。。。那friendship这种关联表的存在本身就是累赘。。。

idnamefriends
1user12,3,4
2user21,3,4
iduidcontentthumbs
11text3,4
21text3,4

这样就行了。。。

select id,name,friends from user where uid = 
select id,uid,content,thumbs from tweet where uid in (friends)

这个数据你无论如何都是要进后端的,那么还不如在后端去干。。。
thumbs对friends后端过滤一下就行,写个中间件把friends和thumbs拆成array/set/jsonArray whatever。。。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题