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中HTTP方式下的Gzip压缩传输方法举偶
Feb 15 PHP
PHP定时执行计划任务的多种方法小结
Dec 19 PHP
在PHP中设置、使用、删除Cookie的解决方法
May 06 PHP
php取得字符串首字母的方法
Mar 25 PHP
PHP输出日历表代码实例
Mar 27 PHP
PHP 9 大缓存技术总结
Sep 17 PHP
PHP explode()函数的几个应用和implode()函数有什么区别
Nov 05 PHP
PHP自定义多进制的方法
Nov 03 PHP
php输出含有“#”字符串的方法
Jan 18 PHP
php数据库的增删改查 php与javascript之间的交互
Aug 31 PHP
PHP使用ajax的post方式下载excel文件简单示例
Aug 06 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
第九节 绑定 [9]
2006/10/09 PHP
PHP+MySQL 手工注入语句大全 推荐
2009/10/30 PHP
php+mysql实现用户注册登陆的方法
2015/01/03 PHP
解决ThinkPHP下使用上传插件Uploadify浏览器firefox报302错误的方法
2015/12/18 PHP
php生成mysql的数据字典
2016/07/07 PHP
php使用escapeshellarg时中文被过滤的解决方法
2016/07/10 PHP
PHP实现活动人选抽奖功能
2017/04/19 PHP
thinkphp3.2.0 setInc方法 源码全面解析
2018/01/29 PHP
javascript的内存管理详解
2013/08/07 Javascript
Javascript 命名空间模式
2013/11/01 Javascript
js鼠标滑轮滚动事件绑定的简单实例(兼容主流浏览器)
2014/01/14 Javascript
JavaScript学习笔记之JS函数
2015/01/22 Javascript
node模块机制与异步处理详解
2016/03/13 Javascript
关于angularJs指令的Scope(作用域)介绍
2016/10/25 Javascript
JS控制div跳转到指定的位置的几种解决方案总结
2016/11/05 Javascript
localStorage的黑科技-js和css缓存机制
2017/02/06 Javascript
对Vue table 动态表格td可编辑的方法详解
2018/08/28 Javascript
解决vue中虚拟dom,无法实时更新的问题
2018/09/15 Javascript
详解如何探测小程序返回到webview页面
2019/05/14 Javascript
JS简单表单验证功能完整示例
2020/01/26 Javascript
javascript设计模式 ? 抽象工厂模式原理与应用实例分析
2020/04/09 Javascript
JS替换字符串中指定位置的字符(多种方法)
2020/05/28 Javascript
JavaScript代码简化技巧实例解析
2020/09/09 Javascript
vue组件入门知识全梳理
2020/09/21 Javascript
vue3.0 加载json的方法(非ajax)
2020/10/26 Javascript
python使用phoenixdb操作hbase的方法示例
2019/02/28 Python
Python搭建Keras CNN模型破解网站验证码的实现
2020/04/07 Python
聊聊python中的循环遍历
2020/09/07 Python
卡塔尔航空官方网站:Qatar Airways
2017/02/08 全球购物
金融管理应届生求职信
2014/02/20 职场文书
银行员工犯错检讨书
2014/09/16 职场文书
教师文明餐桌光盘行动倡议书
2015/04/28 职场文书
水浒传读书笔记
2015/06/25 职场文书
全国劳模先进事迹材料(2016精选版)
2016/02/25 职场文书
2019年市场部个人述职报告(三篇)
2019/10/23 职场文书
delete in子查询不走索引问题分析
2022/07/07 MySQL