【思考】微信朋友圈的基本数据结构该怎么设计?

微信朋友圈的基本数据结构该怎么设计,即可以有效的实现权限控制,又可以不影响性能?

微信朋友圈的一条消息的数据包括了文字、图片、发布时间、地理位置。但如果要考虑权限控制和性能,则需要单独讨论其他数据字段。

场景1:微信通讯录里,假设A和B一开始互为好友,但是A删除了B,B并未删除A,那么在A的微信通讯录里就没有了B,但是B的微信通讯录里则继续有A。

通常情况下,常规场景下的数据库设计,A、B之间通过一个关系表T进行联系,在关系表T里,有那么一条记录标示着A和B有关系。但是仅仅这条记录,是无法达到场景1目的的。

思考一下,为了做好权限控制,在关系表T里,应有两条记录标记着A、B之间的关系。Record1说明A的通讯录里有B,Record2说明B的通讯录里有A。而微信的朋友之间可以打标签的(即分组)。在数据上,就是给每个关系增加一个“标签”标记。标签分组的基础数据就是这样了,这也是后面朋友圈权限管理的基础。

如果不考虑性能,按照一般的逻辑,A的朋友圈timeline=获取A所有朋友发布的消息  -  没有授权给A看的消息  -  A屏蔽掉的信息。这种情况下,A每次刷新朋友圈,都需要在朋友圈池子里遍历,在逻辑判断是否授权或者是否屏蔽。效率太低下。

考虑性能的话,借用分布式计算及缓存的理念,大计算量的内容发布都放在闲时的时候去做。方案是,数据库里每个用户都有一个timeline list缓存,清单关键字段是消息ID。待该用户刷新朋友圈时,直接读取该timeline的消息即可。

那么,每个用户发布一条朋友圈消息时,服务器就会给每个有权限接收这条消息的用户timeline list缓存插入一条记录。

可以验证一下,A和B是好友,并且A设置B为分组tag,A发一条朋友圈,只有分组tag可以看到。此时,B是可以看到的。而后,A在分组tag添加好友C,此时,C是看不到A刚刚发的消息的。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值