专栏首页烟草的香味微信朋友圈技术实现设想

微信朋友圈技术实现设想

前提

微信朋友圈是我们每天都在用的功能, 但是如果让你来实现一个微信朋友圈, 你会如何做呢? 我来简单设想一下。

实现功能

  1. 发朋友圈
  2. 评论动态
  3. 查看朋友圈(只能查看好友的)
  4. 查看评论(只能查看共同好友的)

是不是看着很简单? 也没有几个功能嘛.。so easy.

开始实现

数据库选用了MySQL, 熟悉的关系型数据库

版本一

看了只有两条内容, 朋友圈动态, 朋友圈评论, 直接设计数据库。

简单吧。 好, 按照这个数据模型, 当实现时, 就会发现问题。

1.如何获取好友圈数据

如果简单的拉取好友列表, 然后拉取出其中好友的动态, 不好意思, 你的接口慢到爆炸, 毕竟用户基数就在那。

2.如何获取动态下的共同好友评论

当然, 评论也可以获取动态下的所有评论, 然后过滤掉非好友的评论, 同上, 太慢了。

想想哈

如何解决这个问题? 上面获取数据慢主要是因为要做数据的筛选, 那如果我能够直接拿到最终数据, 不就可以解决这个问题了么?

版本二

为了能够直接获取到朋友圈的数据, 在现有基础上是肯定不行的, 根据获取数据的思路, 直接获取朋友圈数据, 当然要加一张朋友圈的表了。

新增一张朋友圈表:

这样就很方便了, 用户查看朋友圈时, 可以直接定位查看的动态以及可以查看的评论, 在根据动态ID和评论ID将内容补充进去就行了。

但是相应的, 就需要维护用户朋友圈这样的一张表, 在用户发帖删帖加好友删好友发评论删评论的时候, 去做数据的同步操作, 而且要异步的进行, 毕竟同步的话, 接口响应就会变慢。但是我觉得, 这样的代价是值得的, 可以换来拉取数据接口的快速响应。

你以为到这就完了么? 天真。 看下图:

这样的消息在朋友圈都看到过吧。它应该是所有用户都可以看到的, 可以将它理解为官方发的动态。如果按照我们现在的设计, 就要将它插到所有用户的朋友圈中, 也就是说, 如果官方发一条动态, 有一百万用户的话, 就要插一百万条同样的数据, 而且有新注册用户, 还要将历史数据插进去.。这样不只难以维护, 而且有太多无用数据了。

想想哈

这种数据最好只需要插入一条, 所有用户都去读就好。最直观的方法, 在朋友圈表中, 指定一个用户ID(比如0), 是所有用户共同的数据, 这样就解决了。

但是, 之前我们的评论是直接保存到朋友圈中的, 可以这样保存, 是因为每个用户在朋友圈表中的每个动态是唯一的, 但是现在如果插入公共ID, 就不能这么存了, 哪又该如何处理动态的评论呢? 难道回到开始的动态查询吗?

既然有用户的朋友圈动态表, 那就可以有朋友圈评论表, 朋友圈动态中保存的是用户可以查看的动态, 那么朋友圈评论表保存的就是用户可以查看的评论。

版本三

修改用户朋友圈表结构如下:

这样改动之后, 维护的数据和版本二基本一样, 而且也解决了版本二的问题。

来看看现在的相关操作

查看朋友圈

  1. 朋友圈动态查找可以查看的动态(包含用户ID和公共ID)
  2. 朋友圈评论查看相关评论(包含用户ID和公共ID)
  3. 动态表和评论表根据ID将相关数据取出

前两步走索引, 第三步直接根据主键获取, 而且拿出来的没有无用数据

数据维护的操作(一下所有操作官方特判)

发动态

  1. 查找用户所有好友
  2. 将动态添加到所有好友的朋友圈动态表中(包括用户自己)

删动态

  1. 查找用户的所有好友
  2. 将动态从好友的朋友圈动态表中删除
  3. 将动态从好友的朋友圈评论表中删除

发评论

  1. 查找用户的所有好友A
  2. 朋友圈动态中找出A可以查看此动态的好友B
  3. 若评论是回复某用户, 则从B中过滤不是回复用户好友的用户, 得到C
  4. 将数据添加到C朋友圈评论表中

删评论

  1. 查找用户的所有好友A
  2. 朋友圈评论中找出A中可以查看此评论的用户B
  3. 删除B朋友圈评论数据

添加好友

  1. 找到好友的所有动态, 添加到用户的朋友圈动态
  2. 找到好友在用户朋友圈动态中所有动态下的相关评论(包括评论和被评论), 并从中过滤掉用户不可查看的评论, 同步好友圈评论

删除好友

  1. 找到好友在用户朋友圈动态中所有动态下的相关评论, 删除用户好友圈评论数据
  2. 找到好友的所有动态, 从用户的朋友圈动态中删除

以上, 基本就是我目前的设想


总结

可以看到, 最终的版本, 基本所有的逻辑都在异步数据的同步上, 业务逻辑基本很少, 这样可以保证拉取数据的接口快速响应, 但因为是异步操作, 难免会造成数据的延迟。 比如说: 当处理数据过大时, 用户发了动态, 但是还没有做异步的处理, 他的好友时看不到他刚刚发表的动态的。

以及可能存在的其他暂时没有发现的问题。先这样, 没有更好的想法了。

以上!!!

本文分享自微信公众号 - 烟草的香味(hujing-bc),作者:胡靖哥哥

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 6大设计原则之单一职责原则

    我想,任谁也能看的出这个接口设计的有问题,用户的属性和用户的行为没有分开,应该把用户的信息抽取成一个业务对象,把用户的行为抽取成一个业务对象,按照这个思路对类图...

    烟草的香味
  • 罗马数字

    今天再看罗马数字,才突然发现其完全是一种不同寻常的计数方法。我们平常用的是进制计数法(二进制、十进制等),而罗马数字完全不同。简单列几个罗马数字:

    烟草的香味
  • Java8 Lambda表达式

    在Python中是有的。但是Python中万物皆对象,直接将函数赋值给一个变量即可,那么在Java中该如何使用lambda表达式呢?

    烟草的香味
  • vue基础

    vue文件组件也支持CSS预处理语言,比如scss或者less。如需使用scss,定义lang属性即可:

    城市中的游牧民族
  • PonyCar的体验感受

    用户1130025
  • Windows的APC机制

    前两篇漫谈中讲到,除ntdll.dll外,在启动一个新进程运行时,PE格式DLL映像的装入和动态连接是由ntdll.dll中的函数LdrInitializeTh...

    战神伽罗
  • 敏捷开发流程之Scrum:3个角色、5个会议、12原则

    本文主要从Scrum的定义和目的、敏捷宣言、Scrum中的人员角色、Scrum开发流程、敏捷的12原则等几方面帮助大家理解Scrum敏捷开发的全过程。

    宜信技术学院
  • 谷歌ALBERT模型V2+中文版来了:之前刷新NLP各大基准,现在GitHub热榜第二

    而最近,谷歌开源了中文版本和Version 2,项目还登上了GitHub热榜第二。

    量子位
  • SharpForge - Open source SourceForge / CodePlex implementation

    SharpForge - Open source SourceForge / CodePlex implementation SharpForge suppo...

    张善友
  • 走近webpack(4)--css相关拓展

      我们前面已经学了很多webpack基本的处理情况,一句话总结就是,一个优秀的webpack项目,主要的核心用法就是整合loader和plugin去处理你想要...

    zaking

扫码关注云+社区

领取腾讯云代金券