PHP+redis实现微博的推模型案例分析


Posted in PHP onJuly 10, 2019

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

最近在看了一下关于redis的内容,然后利用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,发布人昵称,发布时间,微博内容。

推送表设计

用户在发布微博的时候,将微博推送给自己的粉丝,每个粉丝都维护一个推送微博的链表,这个链表只保存50条最新微博。推送表中保存的是微博id.

关注操作

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

核心代码:

$conn = connredis();//连接redis
if($f){//如果没有关注过
 $conn->sadd('following:'.$user['userid'],$userid);
 $conn->sadd('follower:'.$userid,$user['userid']);
}else{
 $conn->srem('following:'.$user['userid'],$userid);
 $conn->srem('follower:'.$userid,$user['userid']);
}

发布微博

遍历自己的粉丝,给每个粉丝都推送一条微博,将推送的微博保存到每个用户的推送表中

核心代码:

//1、保存微博
$conn = connredis();//连接redis
$postid = $conn->incr('global:postid');//生成微博id
//保存微博数据
$conn->hmset('post:postid:'.$postid,['userid'=>$user['userid'],'username'=>$user['username'],'time'=>time(),'content'=>$content]);
//2、推送微博
$fans = $conn->smembers('follower:'.$user['userid']);//获取所有粉丝
$fans[] = $user['userid'];//自己也要推送一份
foreach($fans as $u){
 $conn->lpush('receivepost:'.$u,$postid);
 $conn->ltrim('receivepost:'.$u,0,49);//每个人保存最新微博50条
}

展示微博

首先连接redis,然后获取自己的推送表的信息,遍历推送表,然后获取微博内容,最后获取自己的粉丝和关注数。进行数据展示即可。

//获取推送的微博id
$conn = connredis();
$postids = $conn->sort('receivepost:'.$user['userid'],['sort'=>'desc']);
//获取微博
$posts = [];
foreach($postids as $postid){
$posts[] = $conn->hmget('post:postid:'.$postid,['userid','username','time','content']);
}
//获取粉丝和关注数
$fansnum = $conn->scard('follower:'.$user['userid']);
$follownum = $conn->scard('following:'.$user['userid']);

总结

推模型的微博实例,实现还是比较简单的,但是推模型对性能有影响,假如我是一个大V,微博关注数有2000W,我在发微博的时候需要给2000W个人推送一条微博,但是很多人又是僵尸粉,可想而知对性能有一定的影响。我很可以将推模型改为拉模型,这样就能解决这个问题了。

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

PHP 相关文章推荐
php中对xml读取的相关函数的介绍一
Jun 05 PHP
PHP CURL获取cookies模拟登录的方法
Nov 04 PHP
PHP中is_file不能替代file_exists的理由
Mar 04 PHP
php实例分享之html转为rtf格式
Jun 02 PHP
Codeigniter发送邮件的方法
Mar 19 PHP
php简单smarty入门程序实例
Jun 11 PHP
PHP代码优化技巧小结
Sep 29 PHP
PHP+shell脚本操作Memcached和Apache Status的实例分享
Mar 11 PHP
php curl上传、下载、https登陆实现代码
Jul 23 PHP
SCP远程VPS快速搬家和WDCP升级php5.3安装memcached和eaccelerator教程
Jul 27 PHP
PHP有序表查找之二分查找(折半查找)算法示例
Feb 09 PHP
php使用yield对性能提升的测试实例分析
Sep 19 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
Laravel+Intervention实现上传图片功能示例
Jul 09 #PHP
Laravel框架实现多个视图共享相同数据的方法详解
Jul 09 #PHP
You might like
基于mysql的bbs设计(四)
2006/10/09 PHP
php2html php生成静态页函数
2008/12/08 PHP
解析Ubuntu下crontab命令的用法
2013/06/24 PHP
PHP实现自动识别Restful API的返回内容类型
2015/02/07 PHP
PHP 中 DOMDocument保存xml时中文出现乱码问题的解决方案
2016/09/19 PHP
php实现留言板功能(代码详解)
2017/03/28 PHP
Yii2配置Nginx伪静态的方法
2017/05/05 PHP
IE bug table元素的innerHTML
2010/01/11 Javascript
异步javascript的原理和实现技巧介绍
2012/11/08 Javascript
如何用js控制frame的隐藏或显示的解决办法
2013/03/20 Javascript
JS实现向表格行添加新单元格的方法
2015/03/30 Javascript
jquery中添加属性和删除属性
2015/06/03 Javascript
详解javascript实现瀑布流绝对式布局
2016/01/29 Javascript
jQuery读取XML文件的方法示例
2017/02/03 Javascript
Bootstrap 3 进度条的实现
2017/02/22 Javascript
基于JavaScript实现无限加载瀑布流
2017/07/21 Javascript
微信小程序实现列表下拉刷新上拉加载
2020/07/29 Javascript
JS实现字符串中去除指定子字符串方法分析
2018/05/17 Javascript
[44:50]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第二局
2016/02/26 DOTA
[00:32]DOTA2上海特级锦标赛 COL战队宣传片
2016/03/04 DOTA
python装饰器初探(推荐)
2016/07/21 Python
利用ctypes提高Python的执行速度
2016/09/09 Python
python五子棋游戏的设计与实现
2019/06/18 Python
Keras预训练的ImageNet模型实现分类操作
2020/07/07 Python
PyCharm安装PyQt5及其工具(Qt Designer、PyUIC、PyRcc)的步骤详解
2020/11/02 Python
css3 实现元素弧线运动的示例代码
2020/04/24 HTML / CSS
Vans奥地利官方网站:美国原创极限运动潮牌
2018/09/30 全球购物
意大利网上书店:LaFeltrinelli
2020/06/12 全球购物
联想智利官方网站:Lenovo Chile
2020/06/03 全球购物
JavaScript获取当前url根目录(路径)
2014/02/19 面试题
英语专业学生个人求职信范文
2014/01/06 职场文书
金融学专业大学生职业生涯规划
2014/03/07 职场文书
青年安全生产示范岗事迹材料
2014/05/04 职场文书
校园安全标语
2014/06/07 职场文书
Oracle 触发器trigger使用案例
2022/02/24 Oracle
详解MySQL的内连接和外连接
2023/05/08 MySQL