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 相关文章推荐
笑谈配置,使用Smarty技术
Jan 04 PHP
IP138 IP地址查询小偷实现代码
Feb 15 PHP
php在项目中寻找代码的坏味道(综艺命名)
Jul 19 PHP
php如何调用webservice应用介绍
Nov 24 PHP
使用array_map简单搞定PHP删除文件、删除目录
Oct 29 PHP
PHP多维数组遍历方法(2种实现方法)
Dec 10 PHP
PHP简单遍历对象示例
Sep 28 PHP
PHP获取input输入框中的值去数据库比较显示出来
Nov 16 PHP
php版阿里大于(阿里大鱼)短信发送实例详解
Nov 30 PHP
phpmailer绑定邮箱的实现方法
Dec 01 PHP
浅谈PHP中new self()和new static()的区别
Aug 11 PHP
Laravel 实现关系模型取出需要的字段
Oct 10 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 eval函数用法总结
2012/10/31 PHP
微信公众号开发客服接口实例代码
2016/10/21 PHP
PHP PDOStatement::setAttribute讲解
2019/02/01 PHP
ThinkPHP6.0如何利用自定义验证规则规范的实现登陆
2020/12/16 PHP
ajax 文件上传应用简单实现
2009/03/03 Javascript
JavaScript Sort 的一个错误用法示例
2015/03/20 Javascript
js使用cookie记录用户名的方法
2015/11/26 Javascript
用自定义图片代替原生checkbox实现全选,删除以及提交的方法
2016/10/18 Javascript
浅谈Javascript中的Label语句
2016/12/14 Javascript
详解AngularJS通过ocLazyLoad实现动态(懒)加载模块和依赖
2017/03/01 Javascript
JS实现图片转换成base64的各种应用场景实例分析
2018/06/22 Javascript
vue.js使用v-pre与v-html输出HTML操作示例
2018/07/07 Javascript
详解vue.js下引入百度地图jsApi的两种方法
2018/07/27 Javascript
JS数组方法slice()用法实例分析
2020/01/18 Javascript
[06:42]DOTA2每周TOP10 精彩击杀集锦vol.1
2014/06/25 DOTA
在Python的Flask框架中验证注册用户的Email的方法
2015/09/02 Python
Python各类图像库的图片读写方式总结(推荐)
2018/02/23 Python
PyTorch上实现卷积神经网络CNN的方法
2018/04/28 Python
python 文件查找及内容匹配方法
2018/10/25 Python
python程序运行进程、使用时间、剩余时间显示功能的实现代码
2019/07/11 Python
Python的赋值、深拷贝与浅拷贝的区别详解
2020/02/12 Python
python实现udp聊天窗口
2020/03/31 Python
使用Python项目生成所有依赖包的清单方式
2020/07/13 Python
Python基于pyjnius库实现访问java类
2020/07/31 Python
Python+OpenCV图像处理—— 色彩空间转换
2020/10/22 Python
Python+logging输出到屏幕将log日志写入文件
2020/11/11 Python
沙特阿拉伯家用电器和电子产品购物网站:Sheta and Saif
2020/04/03 全球购物
施华洛世奇中国官网:SWAROVSKI中国
2020/06/16 全球购物
ddl,dml和dcl的含义
2016/05/08 面试题
九年级数学教学反思
2014/02/02 职场文书
大学共青团员个人自我评价
2014/04/16 职场文书
上课不认真检讨书
2014/09/17 职场文书
六一儿童节致辞稿(3篇)
2019/07/11 职场文书
公司要求试用期员工提交“述职报告”,该怎么写?
2019/07/17 职场文书
股东合作协议书模板2篇
2019/11/05 职场文书
一文读懂navicat for mysql基础知识
2021/05/31 MySQL