博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何实现类似微信朋友圈的feed功能(第一版)
阅读量:7073 次
发布时间:2019-06-28

本文共 1896 字,大约阅读时间需要 6 分钟。

hot3.png

###用户关系 ####用户角度 我的好友 我关注的 我封锁的 ####粉丝角度 我的粉丝(关注我的) 封锁我的

其中我的好友和我关注的可以看做一类

##常用模式 ####推 什么是推模式?推模式就是,用户A关注了用户B,用户B每发送一个动态,后台遍历用户B的粉丝,往他们粉丝的feed里面推送一条动态。 ####拉 与推模式相反,拉模式则是,用户每次刷新feed第一页,都去遍历关注的人,把最新的动态拉取回来。 ####推拉结合 这是一种折中的解决方案,就是在线推,离线拉。

###拉模式 一开始,我们使用的是拉模式pull。 怎么拉呢 1、取用户关系 【我的好友、我关注的 =》并集去重】、我封锁的 =》 差集 2、遍历好友动态,写入timeline,并且记录下pullTime 代码如下:

$follower = new follower($userId);		$blocking = new blocking($userId);		$blocked  = new blocked($userId);		$marker   = new marker($userId);		$timeline = new timelineModel($userId);		$pullTime  = $marker->select('pull');		$followers = $follower->page(0, -1);		$blockings = $blocking->page(0, -1);		$blockeds  = $blocked->page(0, -1);		$followers[$userId] = 0;				foreach($followers as $followerId=>$time) {			if(isset($blockings[$followerId]) or isset($blockeds[$followerId])) {				continue;			}			$followerMarker = new marker($followerId);			$followerPush   = $followerMarker->select('push');			$followerMarker = null;			if($pullTime>=$followerPush) {				continue;			}			$followerPost = new post($followerId);			$postResults  = $followerPost->range($pullTime);			foreach($postResults as $postId=>$time) {				$counter = new counter($postId);				$counter->plus('expo');				$counter = null;				$timeline->insert($postId, $time);			}		}		$marker->reset('pull', time());		return $timeline->range($pullTime);

这样会出现一个什么问题呢? 我们来看一个细节

输入图片说明 在同一秒内,写入的操作和读的操作会引起数据丢失或者数据重叠的情况。

if($pullTime>=$followerPush) {    continue;}

怎么解决这个地方呢 我们将时间进行了微秒操作,就是先获得时间的微秒时间戳,然后加上一个三位数的random,支持,在同一个时间操作同步的情况,应该是极限接近于0。

$microTime = microtime(true);		$microTime = intval(($microTime-intval($microTime)) * self::CARDINAL_NUMBER);		$time = $time * self::CARDINAL_NUMBER + $microTime;		return bcadd($time, rand(1,999) / 1000 ,3);

至此,第一版已经完成了。完全采用pull模式。由用户的pullTime去确定是否需要更新timeline。

###存在问题 第一版完成后有哪些问题呢: 1.用户关系更改,timeline无法及时更迭 2.实时性不强

转载于:https://my.oschina.net/lwl1989/blog/727149

你可能感兴趣的文章
Parallels Desktop 8 虚拟机安装 windows 教程
查看>>
51cto博客第一篇
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
使用DataWorks来调度AnalyticDB任务
查看>>
CSV文件读取,解决汉字乱码
查看>>
Squid代理服务基础篇
查看>>
我的友情链接
查看>>
rhel 6.5 x86_64 配置centos yum源
查看>>
redis 的setnx命令
查看>>
在VMware Workstation上安装Kali Linux
查看>>
联想IPMI固件SMASH-CLP 管理
查看>>
glance镜像元数据
查看>>
个人起始
查看>>
二进制单位
查看>>
二叉树的线索化
查看>>
我的友情链接
查看>>
[每日短篇] 10 - Docker 清理无用的镜像
查看>>
我的友情链接
查看>>
thinkphp 生成 excel 文件
查看>>