微信朋友圈技术实现设想

前提

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

实现功能

  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. 找到好友的所有动态, 从用户的朋友圈动态中删除

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


总结

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

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

以上!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508443.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis的多路复用是什么鬼

有没有人和我一样, 自打知道了redis, 就一直听说什么redis单线程, 使用了多路复用等等. 天真的我以为多路复用是redis实现的技术. 今天才发现, 我被自己骗了, 多路复用是系统来实现的. 对不起自己的专业了. 为了引出多路复用, 我来大胆设想一下技术的发展路程. 前提 一个应用…

WebSocket小叙

概述 刚看到WeSocket的时候,我以为是HTTP相关,但是在前两天搭了一个简单的Client之后, 我发现这不就是TCP长连接么? 建立连接->通信->断开连接. 直到今天, 我在调试的时候, 发现发出了HTTP请求, 我想, 事情可能不是我想的那样. 先来简单描述一下…

基于redis的分布式锁

概述 在之前, 我也使用redis做过分布式锁, 当时的做法是这样的: setnx: 向 redis中创建一个过期时间为1s的key, 若创建失败, 则锁获取失败expire: 获取锁成功后, 给锁增加过期时间del: 处理后释放锁 当时觉得貌似没什么问题. 是我太天真了, 今天突然想到, 恩, 有问题. 问题…

PHP实现RPC(简版)

概述 RPC这个东西是什么? 第一次听说他, 还要在它的前边加个G, 当时我以为GRPC是一项技术, 后来才知道, 并不是这样. GRPC只是RPC的谷歌实现. 谷歌搜了一下, RPC就是一种: 远程函数调用, 看到这里, 我已经等不及了, 不往下看了, 先自己实现一个. 如果只给你这样一个概念, 如…

如何生成全局唯一标识

引出 大家都用过QQ或者微信吧, 当我们注册的时候, 会被自动分配一个QQ号, 这个号码是全局唯一且固定的, 那么, 如果是你来写的话, 如何为新注册的用户分配一个号码呢? 亦或是一个电商网站, 要为每个订单生成一个订单号? 再或是一个即时聊天, 要为每个消息生成一个消息ID??…

GC算法的评价标准

GC是什么 GC就是垃圾回收, 哎, 现在Java如日中天, JVM都又算了解吧. 其中的垃圾回收还经常在面试中问道(虽然我忘完了). 当然, 垃圾回收不只是JVM, Python、等等高级语言都用到了. 简单说, GC完成的任务就两件事: 找到内存中已经无用的垃圾将垃圾回收, 以便于之后可以再次利用…

GC算法-标记清除算法

概述 标记清除算法, 描述起来很简单, 从名字上就能看出, 分为两个阶段: 标记阶段: 遍历所有对象, 将活动对象都打上标记清除阶段: 遍历堆, 将没有标记的对象释放掉. 介绍完毕, 本文结束. 开玩笑, 确实看上去很简单啦. 那就具体思考一下实现吧. 实现 介绍写的很清楚了, 实现…

GC算法-引用计数法

概述 引用计数法又是什么鬼呢? 顾名思义, 对对象的引用进行计数. 通过记录每个对象被引用的次数, 来确定这个对象是否可以被回收. 实现 首先, 对对象的引用数量进行管理, 什么时候会更新呢? 创建对象: 新建一个对象(对这个新的对象引用数量1)更新指针: 将一个指向A对象的…

GC算法-复制算法

概述 复制算法就是将内存空间二等分, 每次只使用其中一块. 当执行GC时, 讲A部分的所有活动对象集体移到B中, 就可以讲A全部释放. 画个图就是: ​ 在执行GC前, 内存长这样: ​ 当执行GC后, 内存就变成这样了: 还记得标记清除算法的问题是什么吗? 内存碎片化严重. 现在好了, …

GC算法-标记压缩算法

概述 还记得标记清除和复制算法的问题么? 堆使用效率低和碎片化问题. 那么有没有能够利用整个堆, 有没有内存碎片化问题的算法呢? 这就是标记压缩算法了. 简单来说, 标记压缩算法就是将堆中的所有活动对象整体向左移, 将对象间的空隙消除. 在GC执行前的内存: GC执行后的内…

GC算法-分代垃圾回收

概述 分代垃圾回收并不是一个新的算法, 而是将之前的回收算法结合利用, 分场景使用. 简单来说, 分代垃圾回收的思路, 就是给每个对象都分配一个年龄, 年龄越大的, 活的越久, 被回收的概率就越小. 经验表明, 大部分对象在生成后马上就成了垃圾. 也就是说, 年轻人要多运动, 没…

GC算法-增量式垃圾回收

概述 增量式垃圾回收也并不是一个新的回收算法, 而是结合之前算法的一种新的思路. 之前说的各种垃圾回收, 都需要暂停程序, 执行GC, 这就导致在GC执行期间, 程序得不到执行. 因此出现了增量式垃圾回收, 它并不会等GC执行完, 才将控制权交回程序, 而是一步一步执行, 跑一点, 再…

不知道写的是啥

刚才起夜, 被黑暗的环境吓到了. 当时有一种四面八方无数双眼睛在看着你, 又好像有什么会突然出现, 然后我赶紧打开灯, 这种感觉立刻烟消云散了, 好像根本没有来过一样. 很显然, 消除这种恐惧感的, 是光. 有没有光对我来说有什么区别呢? 视觉, 有光后, 能够看到周围的环境, 又…

IO多路复用小故事

背景故事 小王住在某城市, 生活并长大. 最近, 小城引进了一个企业, 邮局. 这个邮局可了不得, 只要你花上几角钱, 就可以将一封信送到千里之外的朋友手中. 小王也趁机体验了一把, 得劲. 这天, 小王躺在床上想, 既然这个邮局这么好, 咱何不从中分一杯羹呢? 但是现在人家邮局基…

PHP usort 函数底层排序

引出 最近在一个项目中, 需要对一个数组的顺序进行调整, 允许手动将某一个元素提到数组的开头位置. 在这里, 使用了PHP中的usort函数进行了数组的排序, 代码大致如下: usort($arr, function ($a, $b){// 这里添加了 order 字段, 默认为0, 将order大的提到前边return $b[order…

mac docker搭建开发环境

前言 刚买了一个mac本, 决定搭建一个纯docker的开发环境, 说到做到, 开始踩坑. 搭建 在搭建环境的过程中, 经历了很多错误, 例如为了令两个docker环境可以互通(如: nginx和php-fpm), 尝试了 link, network等等等等方式. 最后发现, 如果想实现两个docker环境的互通, 可以通过…

密钥交换算法: 迪菲-赫尔曼算法

概述 迪菲-赫尔曼算法用于通信双方交换密钥. 还记得之前介绍HTTPS协议的时候, 提到需要先通过对方公钥来进行密钥的交换, 然后再通过密钥对通信内容进行加密. 迪菲-赫尔曼算法就是用于交换密钥的. . 此算法与非对称加密算法不同哦. OK, 一起来看看吧. 引入 在正式介绍迪菲-…

纠错码简介

纠错码是个什么东西 引出 网络中的通信基于TCP和UDP两个通信协议, 这大家都知道的, 什么TCP的三次握手等等, 面试经常被问到. 三次握手是为了保证连接的正确建立. 但是, 在通信的时候, 你如何保证你的消息正确送达了呢? 有人说了, 有收到请求的响应包. 但我说的不是这个, 比…

计算机全加器简单实现

概述 用了这么久计算机, 都知道计算机有一个核心部件叫 CPU, 而 CPU中有一个小部件叫做全加器. 它是用来做什么的呢? 看名字就知道了, 做加法运算用的. 那么如何实现一个全加器呢? 你以为这又是一篇计算机内部原理的文章? 不, 放开那个女孩, 和我一起走进中学物理的课堂. …

天天看底层有什么用

疑问 其实之前我一直有个疑问, 每天工作在应用层, 就算知道 TCP 的传包, 包的校验等等, 在工作中其实是用不到的, 每天看这些东西用什么用呢? 其一, 对工作的内容其实是起不到任何作用的, 其二, 浪费的时间如果将其用在工作上是可以产出更多效益的. 那么, 带给我的到底是什么…