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 函数使用方法与函数定义方法
May 09 PHP
php iconv() : Detected an illegal character in input string
Dec 05 PHP
Look And Say 序列php实现代码
May 22 PHP
解析PHP计算页面执行时间的实现代码
Jun 18 PHP
微信公众号开发之微信公共平台消息回复类实例
Nov 14 PHP
PHP获取一段文本显示点阵宽度和高度的方法
Mar 12 PHP
php自定义hash函数实例
May 05 PHP
PHP数组的定义、初始化和数组元素的显示实现代码
Nov 05 PHP
浅谈socket同步和异步、阻塞和非阻塞、I/O模型
Dec 15 PHP
php实现单笔转账到支付宝功能
Oct 09 PHP
PHP后期静态绑定实例浅析
Dec 21 PHP
tp5.1 框架数据库高级查询技巧实例总结
May 25 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
PHP生成Flash动画的实现代码
2010/03/12 PHP
PHP Switch 语句之学习笔记
2013/09/21 PHP
YII2框架中ActiveDataProvider与GridView的配合使用操作示例
2020/03/18 PHP
javascript 当前日期加(天、周、月、年)
2009/08/09 Javascript
javascript 语法基础 想学习js的朋友可以看看
2009/12/16 Javascript
js DataSet数据源处理代码
2010/03/29 Javascript
网页加载时页面显示进度条加载完成之后显示网页内容
2012/12/23 Javascript
JQuery入门—编写一个简单的JQuery应用案例
2013/01/03 Javascript
JQuery调webservice实现邮箱验证(检测是否可用)
2013/05/21 Javascript
jquery插件orbit.js实现图片折叠轮换特效
2015/04/14 Javascript
JavaScript实现单击下拉框选择直接跳转页面的方法
2015/07/02 Javascript
JS实现图片平面旋转的方法
2016/03/01 Javascript
jQuery实现按钮点击遮罩加载及处理完后恢复的效果
2016/06/07 Javascript
前端 Vue.js 和 MVVM 详细介绍
2016/12/29 Javascript
Node.js如何使用Diffie-Hellman密钥交换算法详解
2017/09/05 Javascript
JS 使用 window对象的print方法实现分页打印功能
2018/05/16 Javascript
详解Vue源码中一些util函数
2019/04/24 Javascript
JavaScript实现单英文金山打字通
2020/07/24 Javascript
Vue中axios拦截器如何单独配置token
2019/12/27 Javascript
Python中scatter函数参数及用法详解
2017/11/08 Python
Python按钮的响应事件详解
2019/03/04 Python
详解python 模拟豆瓣登录(豆瓣6.0)
2019/04/18 Python
python安装requests库的实例代码
2019/06/25 Python
django中使用Celery 布式任务队列过程详解
2019/07/29 Python
Python3如何对urllib和urllib2进行重构
2019/11/25 Python
Python编程快速上手——强口令检测算法案例分析
2020/02/29 Python
Bravofly德国:预订廉价航班和酒店
2019/09/22 全球购物
SheIn沙特阿拉伯:女装在线
2020/03/23 全球购物
迪卡侬波兰体育用品商店:Decathlon波兰
2020/03/31 全球购物
导购员的岗位职责
2014/02/08 职场文书
资源工程专业毕业生求职信
2014/02/27 职场文书
读书月活动方案
2014/05/22 职场文书
我的梦想演讲稿1000字
2014/08/21 职场文书
小学教师师德整改措施
2014/09/29 职场文书
2015年中秋寄语
2015/07/31 职场文书
python基于tkinter制作下班倒计时工具
2021/04/28 Python