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 相关文章推荐
php5 apache 2.2 webservice 创建与配置(java)
Jan 27 PHP
php fputcsv命令 写csv文件遇到的小问题(多维数组连接符)
May 24 PHP
解析php中获取系统信息的方法
Jun 25 PHP
非常好用的Zend Framework分页类
Jun 25 PHP
Laravel中扩展Memcached缓存驱动实现使用阿里云OCS缓存
Feb 10 PHP
PHP添加图片水印、压缩、剪切的封装类
Aug 17 PHP
PHP函数引用返回的实例详解
Sep 11 PHP
php中文字符串截取多种方法汇总
Oct 06 PHP
老生常谈PHP面向对象之命令模式(必看篇)
May 24 PHP
laravel http 自定义公共验证和响应的方法
Sep 29 PHP
Laravel模糊查询区分大小写的实例
Sep 29 PHP
PHP使用POP3读取邮箱接收邮件的示例代码
Jul 08 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
火影忍者:三大瞳力之一的白眼,为什么没有写轮眼那么出色?
2020/03/02 日漫
PHP strtotime函数详解
2009/12/18 PHP
ubuntu下编译安装xcache for php5.3 的具体操作步骤
2013/06/18 PHP
PHP利用超级全局变量$_GET来接收表单数据的实例
2016/11/05 PHP
thinkPHP实现签到功能的方法
2017/03/15 PHP
Bootstrap+PHP实现多图上传功能实例详解
2018/04/08 PHP
laravel 框架执行流程与原理简单分析
2020/02/01 PHP
JavaScript 存在陷阱 删除某一区域所有节点
2010/05/10 Javascript
JavaScript学习历程和心得小结
2010/08/16 Javascript
JavaScript常用对象的方法和属性小结
2012/01/24 Javascript
JavaScript时间转换处理函数
2015/04/14 Javascript
javascript中数组的常用算法深入分析
2019/03/12 Javascript
使用JS判断页面是首次被加载还是刷新
2019/05/26 Javascript
[49:20]2014 DOTA2国际邀请赛中国区预选赛5.21 CIS VS TongFu
2014/05/22 DOTA
[01:02:25]2014 DOTA2华西杯精英邀请赛 5 24 iG VS DK
2014/05/26 DOTA
python基于右递归解决八皇后问题的方法
2015/05/25 Python
浅析Python中signal包的使用
2015/11/13 Python
Python面向对象程序设计OOP入门教程【类,实例,继承,重载等】
2019/01/05 Python
pyqt5 lineEdit设置密码隐藏,删除lineEdit已输入的内容等属性方法
2019/06/24 Python
用Python获取摄像头并实时控制人脸的实现示例
2019/07/11 Python
HTML5注册表单的自动聚焦与占位文本示例代码
2013/07/19 HTML / CSS
韩都衣舍天猫官方旗舰店:天猫女装销售总冠军
2017/10/10 全球购物
计算机学生求职信范文
2014/01/30 职场文书
求职信需要的五点内容
2014/02/01 职场文书
班主任工作经验材料
2014/02/02 职场文书
2014年文员工作总结
2014/11/18 职场文书
安全先进班组材料
2014/12/26 职场文书
幼儿园食品安全责任书
2015/05/08 职场文书
党支部审查意见
2015/06/02 职场文书
初中政治教学工作总结
2015/08/13 职场文书
会计专业2019暑假实习报告
2019/06/21 职场文书
dubbo集成zipkin获取Traceid的实现
2021/07/26 Java/Android
「租借女友」第2季樱泽墨角色PV&新视觉图公开
2022/03/21 日漫
公历12个月名称的由来
2022/04/12 杂记
解决MySQL报“too many connections“错误
2022/04/19 MySQL
Java Spring Boot 正确读取配置文件中的属性的值
2022/04/20 Java/Android