微信朋友圈只能看到好友点赞这个功能是如何实现的
微信的朋友圈,不像 qq 空间,其只能看到好友的点赞和评论信息
微信是如何实现这个功能的,对于微信来说,用户基数很大,流量很大
如果采用,先获取一个 tweet
下面的所有点赞人的 user_id
set A,再根据浏览者的 user_id
去 friendship
获取所有 friends 的 user_id
set B,再把 A 和 B 取交集的话。。。。。。
只能说这种做法看起来就很不行,对 db
的 QPS
考验太大。
有什么更好的办法吗?
千万别说出让客户端过滤这种想法!
回答:
首先根本就不是关系数据库。
其次现在不太清楚,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这种关联表的存在本身就是累赘。。。
id | name | friends |
---|---|---|
1 | user1 | 2,3,4 |
2 | user2 | 1,3,4 |
id | uid | content | thumbs |
---|---|---|---|
1 | 1 | text | 3,4 |
2 | 1 | text | 3,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。。。
以上是 微信朋友圈只能看到好友点赞这个功能是如何实现的 的全部内容, 来源链接: utcz.com/p/938453.html