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简单封装了一些常用JS操作
Feb 25 PHP
php+mysql事务rollback&commit示例
Feb 08 PHP
国外比较好的几个的Php开源建站平台小结
Apr 22 PHP
献给php初学者(入门学习经验谈)
Oct 12 PHP
发款php蜘蛛统计插件只要有mysql就可用
Oct 12 PHP
Php图像处理类代码分享
Jan 19 PHP
分享一个PHP数据流应用的简单例子
Jun 01 PHP
Apache服务器无法使用的解决方法
May 08 PHP
PHP程序员常见的40个陋习,你中了几个?
Nov 20 PHP
PHP实现动态柱状图改进版
Mar 30 PHP
php中动态变量用法实例
Jun 10 PHP
详解PHP执行定时任务的实现思路
Dec 21 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 fputcsv命令 写csv文件遇到的小问题(多维数组连接符)
2011/05/24 PHP
基于HBase Thrift接口的一些使用问题及相关注意事项的详解
2013/06/03 PHP
基于PHP中的常用函数回顾
2013/07/11 PHP
PHP判断来访是搜索引擎蜘蛛还是普通用户的代码小结
2015/09/14 PHP
PHP数组函数array_multisort()用法实例分析
2016/04/02 PHP
JavaScript 闭包在封装函数时的简单分析
2009/11/28 Javascript
jQuery Ajax 实例全解析
2011/04/20 Javascript
基于jquery的从一个页面跳转到另一个页面的指定位置的实现代码(带平滑移动的效果)
2011/05/24 Javascript
简单的两种Extjs formpanel加载数据的方式
2013/11/09 Javascript
javascript将url中的参数加密解密代码
2014/11/17 Javascript
jquery滚动特效集锦
2015/06/03 Javascript
详解javascript跨浏览器事件处理程序
2016/03/27 Javascript
js中获取jsp表单中radio类型的值简单实例
2016/08/15 Javascript
Angularjs 制作购物车功能实例代码
2016/09/14 Javascript
JS基于onclick事件实现单个按钮的编辑与保存功能示例
2017/02/13 Javascript
使用sessionStorage解决vuex在页面刷新后数据被清除的问题
2018/04/13 Javascript
小程序实现列表删除功能
2018/10/30 Javascript
js实现无缝滚动双图切换效果
2019/07/09 Javascript
解决Vue keep-alive 调用 $destory() 页面不再被缓存的情况
2020/10/30 Javascript
Python引用传值概念与用法实例小结
2017/10/07 Python
CentOS 6.5中安装Python 3.6.2的方法步骤
2017/12/03 Python
[原创]pip和pygal的安装实例教程
2017/12/07 Python
在Python文件中指定Python解释器的方法
2019/02/18 Python
django页面跳转问题及注意事项
2019/07/18 Python
详解如何减少python内存的消耗
2019/08/09 Python
Python实现微信机器人的方法
2019/09/06 Python
Python常用base64 md5 aes des crc32加密解密方法汇总
2020/11/06 Python
莫斯科的韩国化妆品店:Sifo
2019/12/04 全球购物
上海奥佳笔试题面试题
2016/11/16 面试题
应届生法律顾问求职信
2013/11/19 职场文书
小学数学教学反思
2014/02/02 职场文书
优秀大学生职业生涯规划书
2014/02/27 职场文书
小学生学习保证书
2015/02/26 职场文书
2016拓展训练心得体会范文
2016/01/12 职场文书
初中化学教学反思
2016/02/22 职场文书
2019年年中工作总结讲话稿模板
2019/03/25 职场文书