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维护文件系统
Oct 09 PHP
如何将数据从文本导入到mysql
Oct 09 PHP
php实现的仿阿里巴巴实现同类产品翻页
Dec 11 PHP
PHP Socket 编程
Apr 09 PHP
PHP fopen 读取带中文URL地址的一点见解
Sep 25 PHP
PHP中获取时间的下一周下个月的方法
Mar 18 PHP
PHP中copy on write写时复制机制介绍
May 13 PHP
php创建和删除目录函数介绍和递归删除目录函数分享
Nov 18 PHP
PHP中把有符号整型转换为无符号整型方法
May 27 PHP
php抽象类用法实例分析
Jul 07 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
Jul 26 PHP
php封装db类连接sqlite3数据库的方法实例
Dec 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
PHP脚本中include文件出错解决方法
2008/11/20 PHP
JavaScript的parseInt 进制问题
2009/05/07 Javascript
Javascript 函数parseInt()转换时出现bug问题
2014/05/20 Javascript
JavaScript设计模式之建造者模式介绍
2014/12/28 Javascript
JavaScript汉诺塔问题解决方法
2015/04/21 Javascript
js实现鼠标经过表格行变色的方法
2015/05/12 Javascript
vuejs2.0实现一个简单的分页示例
2017/02/22 Javascript
完美解决手机浏览器顶部下拉出现网页源或刷新的问题
2017/11/30 Javascript
vue项目中使用ueditor的实例讲解
2018/03/05 Javascript
node下使用UglifyJS压缩合并JS文件的方法
2018/03/07 Javascript
js中int和string数据类型互相转化实例
2019/01/16 Javascript
浅谈Webpack多页应用HMR卡住问题
2019/04/24 Javascript
jQuery内容选择器与表单选择器实例分析
2019/06/28 jQuery
jQuery实现轮播图效果
2019/11/26 jQuery
Nuxt页面级缓存的实现
2020/03/09 Javascript
详细讲解Python中的文件I/O操作
2015/05/24 Python
Python常用库推荐
2016/12/04 Python
Python实现读取并保存文件的类
2017/05/11 Python
pandas object格式转float64格式的方法
2018/04/10 Python
Python使用pymysql模块操作mysql增删改查实例分析
2019/12/19 Python
Python Des加密解密如何实现软件注册码机器码
2020/01/08 Python
python3 Scrapy爬虫框架ip代理配置的方法
2020/01/17 Python
python对一个数向上取整的实例方法
2020/06/18 Python
python+excel接口自动化获取token并作为请求参数进行传参操作
2020/11/10 Python
HTML5 DeviceOrientation实现手机网站摇一摇功能代码实例
2015/04/24 HTML / CSS
财务出纳员岗位职责
2013/11/26 职场文书
葬礼司仪主持词
2014/03/31 职场文书
《宋庆龄故居的樟树》教学反思
2014/04/07 职场文书
公司请假条范文
2014/04/11 职场文书
求职意向书
2014/07/29 职场文书
销售顾问工作计划书
2014/08/15 职场文书
焦裕禄精神心得体会
2014/09/02 职场文书
庆祝三八妇女节标语
2014/10/09 职场文书
2014幼儿园教育教学工作总结
2014/12/17 职场文书
整脏治乱工作简报
2015/07/21 职场文书
社交电商模式的兴起:这些新的商机千万别错过
2019/07/26 职场文书