PHP+redis实现微博的拉模型案例详解


Posted in PHP onJuly 10, 2019

本文实例讲述了PHP+redis实现微博的拉模型。分享给大家供大家参考,具体如下:

上回写了一篇推模型的内容,这回分享一篇拉模型的内容。

拉模型

拉模型就是展示微博的时候,获取自己的所有关注的人,然后从关注的人中拉取最新微博。

微博项目数据结构设计

user表设计

注册的时候将user数据写入redis中,key如下:

user数据的key
用户名=user:uesrid:$uesrid:username
密码=user:userid:$userid:password

还需要这样写一份,因为需要靠用户名来登录,这样就可以根据用户名来查询用户id。

user:username:userid:$userid

关注的人和粉丝设计

每个用户在产生关注的动作后,在redis中维护两个无序集合set,一个是following,一个是follower,following集合保存的是我关注的人,follower集合保存的是我的粉丝。注意是每个用户都要维护这样的两个集合,用userid来区别。

单条微博表设计

每条微博的信息用hash结构来存储,根据不同的微博id来区分,每条微博有如下信息:发布人id,发布人昵称,发布时间,微博内容。

拉取关注者微博表 设计

每个用户发布微博后,维护20条最新微博,并保存到有序集合sorted set中,用不同的userid来区分。

注意:有序集合的score用微博id,集合保存的也是微博id。

个人微博表

每个用户维护自己的微博,保存到链表中,只保存1000条,redis中只保存1000条微博数据,如果想查询更多,去数据库中查询。

个人已拉取表设计

每个用户在拉取微博后,将微博保存到已经拉取的表中,这个表是一个链表结构,最多保存1000条微博。

发布微博

首先将微博保存成hash结构,然后将微博保存到拉取表,还保存到个人微博表。

//1、保存微博
$conn = connredis();
$postid = $conn->incr('global:postid');
$conn->hmset('post:postid:'.$postid,['userid'=>$user['userid'],'username'=>$user['username'],'time'=>time(),'content'=>$content]);
//2、每个人维护20条最新微博,保存到有序集合中
$conn->zadd('starpost:userid:'.$user['userid'],$postid,$postid);
if($conn->zcard('starpost:userid:'.$user['userid']) > 20){
  $conn->zremrangebyrank('starpost:userid:'.$user['userid'],0,0);
}
//3、维护个人的1000条微博,保存到链表中
$conn->lpush('mypost:userid:'.$user['userid'],$postid);
if($conn->llen('mypost:userid:'.$user['userid']) > 1000){
  $conn->rpoplpush('mypost:userid:'.$user['userid'],'global:post');
}

展示微博

首先获取所有关注的人,获取上次拉取微博的位置,根据上次拉取的微博位置来拉取数据。然后给微博排序,设置新的拉取的位置,写入到已拉取表中,获取微博的详细内容,最后获取粉丝和关注数。进行展示即可。

//1、获取拉取对象
$stars = $conn->smembers('following:'.$user['userid']);//获取所有关注的人
$stars[] = $user['userid'];//需要拉取自己的微博
//2、获取上次拉取的位置
$lastpull = $conn->get('lastpull:userid:'.$user['userid']);
if(!$lastpull){
$lastpull = 0;
}
//3、拉取微博 
$latest = [];
foreach($stars as $star){
$latest = array_merge($latest,$conn->zrangebyscore('starpost:userid:'.$star,$lastpull+1,1<<32-1));
}
//4、给微博排序
sort($latest,SORT_NUMERIC);
//5、设置拉取的位置
if(!empty($latest)){
  $conn->set('lastpull:userid:'.$user['userid'],end($latest));
}
//6、写入到已拉取表中
foreach($latest as $l){
  $conn->lpush('receivepost:'.$user['userid'],$l);
}
$conn->ltrim('receivepost:'.$user['userid'],0,999);//至多显示1000条微博
//7、获取微博的详细内容
$postids = $conn->sort('receivepost:'.$user['userid'],['sort'=>'desc']);
$posts = [];
foreach($postids as $postid){
  $posts[] = $conn->hmget('post:postid:'.$postid,['userid','username','time','content']);
}
//8、获取粉丝和关注数
$fansnum = $conn->scard('follower:'.$user['userid']);
$follownum = $conn->scard('following:'.$user['userid']);

Q&A

如何保证拉取的数据时最新的?

在拉取的时候,将最近拉取的微博id保存到redis中,然后下次我们只需要去拉取比这次保存的微博id大的微博,就可以保证拉取的数据是之前没有拉取的。

如何拉取所有关注者的数据?

遍历关注者,然后拉取数据

假设拉取A关注者的微博1,4,5 B关注者2,3,但是他们的发布时间交错,怎么展示数据?

将所有关注者的最新微博都取出来,然后根据微博id进行排序。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
基于文本的留言簿
Oct 09 PHP
php whois查询API制作方法
Jun 23 PHP
在yii中新增一个用户验证的方法详解
Jun 20 PHP
php 解压rar文件及zip文件的方法
May 05 PHP
php基于base64解码图片与加密图片还原实例
Nov 03 PHP
win10环境PHP 7 安装配置【教程】
May 09 PHP
PHP实现大数(浮点数)取余的方法
Feb 18 PHP
PHP下 Mongodb 连接远程数据库的实例代码
Aug 30 PHP
Laravel利用gulp如何构建前端资源详解
Jun 03 PHP
laravel批量生成假数据的方法
Oct 09 PHP
laravel 修改记住我功能的cookie保存时间的方法
Oct 14 PHP
Laravel框架Eloquent ORM修改数据操作示例
Dec 03 PHP
php解压缩zip和rar压缩包文件的方法
Jul 10 #PHP
PHP+redis实现微博的推模型案例分析
Jul 10 #PHP
实例分析10个PHP常见安全问题
Jul 09 #PHP
PHP批斗大会之缺失的异常详解
Jul 09 #PHP
PHP结合Redis+MySQL实现冷热数据交换应用案例详解
Jul 09 #PHP
PHP+Redis开发的书签案例实战详解
Jul 09 #PHP
使用composer命令加载vendor中的第三方类库 的方法
Jul 09 #PHP
You might like
php中使用preg_match_all匹配文章中的图片
2013/02/06 PHP
php表单敏感字符过滤类
2014/12/08 PHP
PHP判断网络文件是否存在的方法
2015/03/12 PHP
PHP将进程作为守护进程的方法
2015/03/19 PHP
php语言中使用json的技巧及json的实现代码详解
2015/10/27 PHP
关于php几种字符串连接的效率比较(详解)
2017/02/22 PHP
PHP中常用的魔术方法
2017/04/28 PHP
PHP实现生成推广海报的方法详解
2018/03/14 PHP
实现laravel 插入操作日志到数据库的方法
2019/10/11 PHP
Js+XML 操作
2006/09/20 Javascript
javascript简易缓动插件(源码打包)
2012/02/16 Javascript
从jquery的过滤器.filter()方法想到的
2013/09/29 Javascript
图片动画横条广告带上下滚动的JS代码
2013/10/25 Javascript
jquery清空表单数据示例分享
2014/02/13 Javascript
三种方式获取XMLHttpRequest对象
2014/04/21 Javascript
node.js中的buffer.Buffer.isEncoding方法使用说明
2014/12/14 Javascript
javascript 数组操作详解
2015/01/29 Javascript
jQuery CSS3自定义美化Checkbox实现代码
2016/05/12 Javascript
js定时器实现倒计时效果
2017/11/05 Javascript
Webpack path与publicPath的区别详解
2018/05/03 Javascript
npm 更改默认全局路径以及国内镜像的方法
2018/05/16 Javascript
javascript实现的字符串转换成数组操作示例
2019/06/13 Javascript
vue 虚拟DOM的原理
2020/10/03 Javascript
利用一个简单的例子窥探CPython内核的运行机制
2015/03/30 Python
Python实现获取操作系统版本信息方法
2015/04/08 Python
python 安装virtualenv和virtualenvwrapper的方法
2017/01/13 Python
Python编程pygame模块实现移动的小车示例代码
2018/01/03 Python
伦敦新晋轻奢耳饰潮牌:Tada & Toy
2020/05/25 全球购物
工程造价自荐信
2013/10/09 职场文书
拾金不昧表扬信范文
2014/01/11 职场文书
群众路线批评与自我批评
2014/02/06 职场文书
学生夜不归宿检讨书
2014/09/23 职场文书
2014年科普工作总结
2014/12/06 职场文书
法院个人总结
2015/03/03 职场文书
话题作文之关于呼唤
2019/11/29 职场文书
教你用Python matplotlib库制作简单的动画
2021/06/11 Python