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 相关文章推荐
多重?l件?合查?(一)
Oct 09 PHP
dedecms系统的广告设置代码 基础版本
Apr 09 PHP
实用PHP会员权限控制实现原理分析
May 29 PHP
PHP调用JAVA的WebService简单实例
Mar 11 PHP
PHP OPP机制和模式简介(抽象类、接口和契约式编程)
Jun 09 PHP
php实现四舍五入的方法小结
Mar 03 PHP
图文介绍PHP添加Redis模块及连接
Jul 28 PHP
Yii2 rbac权限控制操作步骤实例教程
Apr 29 PHP
PHP对XML内容进行修改和删除实例代码
Oct 26 PHP
PHPExcel导出2003和2007的excel文档功能示例
Jan 04 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
Feb 10 PHP
PHP explode()函数用法讲解
Feb 15 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
层叠菜单的动态生成
2006/10/09 PHP
在php和MySql中计算时间差的方法
2011/04/22 PHP
PHP里的中文变量说明
2011/07/23 PHP
基于php设计模式中单例模式的应用分析
2013/05/15 PHP
PHP 解决session死锁的方法
2013/06/20 PHP
php判断输入是否是纯数字,英文,汉字的方法
2015/03/05 PHP
php实现curl模拟ftp上传的方法
2015/07/29 PHP
实现WordPress主题侧边栏切换功能的PHP脚本详解
2015/12/14 PHP
使用JQuery和s3captche实现一个水果名字的验证
2009/08/14 Javascript
extjs 如何给column 加上提示
2014/07/29 Javascript
jQuery聚合函数实例
2015/05/21 Javascript
JavaScript中Math.SQRT2属性的使用详解
2015/06/14 Javascript
基于JavaScript实现 网页切出 网站title变化代码
2016/04/03 Javascript
jquery属性,遍历,HTML操作方法详解
2016/09/17 Javascript
javascript 封装Date日期类实例详解
2017/05/28 Javascript
JavaScript正则表达式的贪婪匹配和非贪婪匹配
2017/09/05 Javascript
基于input动态模糊查询的实现方法
2017/12/12 Javascript
不得不知的ES6小技巧
2018/07/28 Javascript
jQuery 点击获取验证码按钮及倒计时功能
2018/09/20 jQuery
JavaScript ES6中的简写语法总结与使用技巧
2018/12/30 Javascript
TensorFlow.js 微信小程序插件开始支持模型缓存的方法
2020/02/21 Javascript
vue使用video插件vue-video-player的示例
2020/10/03 Javascript
[48:54]VGJ.T vs infamous Supermajor小组赛D组败者组第一轮 BO3 第二场 6.3
2018/06/04 DOTA
Opencv-Python图像透视变换cv2.warpPerspective的示例
2019/04/11 Python
python实现文件的备份流程详解
2019/06/18 Python
Python 实现一个计时器
2020/07/28 Python
HTC VIVE美国官网:VR虚拟现实眼镜
2018/02/13 全球购物
平面设计的岗位职责
2013/11/08 职场文书
大学生学习自我评价
2014/01/13 职场文书
平安工地建设方案
2014/05/06 职场文书
教师党的群众路线学习心得体会
2014/11/04 职场文书
杭白菊导游词
2015/02/10 职场文书
接待员岗位职责
2015/02/13 职场文书
党支部审查意见
2015/06/02 职场文书
女方家长婚礼致辞
2015/07/27 职场文书
Python排序算法之插入排序及其优化方案详解
2021/06/11 Python