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 相关文章推荐
基于mysql的bbs设计(四)
Oct 09 PHP
windows下升级PHP到5.3.3的过程及注意事项
Oct 12 PHP
PHP中通过加号合并数组的一个简单方法分享
Jan 27 PHP
PHP抽象类 介绍
Jun 13 PHP
手把手教你打印出PDF(关于fpdf的简单应用)
Jun 25 PHP
深入理解PHP内核(二)之SAPI探究
Nov 10 PHP
php阿拉伯数字转中文人民币大写
Dec 21 PHP
简单实现PHP留言板功能
Dec 21 PHP
phpstorm 配置xdebug的示例代码
Mar 31 PHP
Thinkphp整合阿里云OSS图片上传实例代码
Apr 28 PHP
php面试实现反射注入的详细方法
Sep 30 PHP
在 PHP 和 Laravel 中使用 Traits的方法
Nov 13 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/04 日漫
使用ThinkPHP自带的Http类下载远程图片到本地的实现代码
2011/08/02 PHP
PHP写的资源下载防盗链类分享
2014/05/12 PHP
PHP中使用TCPDF生成PDF文档实例
2014/07/01 PHP
对于ThinkPHP框架早期版本的一个SQL注入漏洞详细分析
2014/07/04 PHP
Codeigniter中集成smarty和adodb的方法
2016/03/04 PHP
php使用PDO执行SQL语句的方法分析
2017/02/16 PHP
php lcg_value与mt_rand生成0~1随机小数的效果对比分析
2017/04/05 PHP
十个优秀的Ajax/Javascript实例网站收集
2010/03/31 Javascript
P3P Header解决Cookie跨域的问题
2013/03/12 Javascript
ExtJS下 Ext.Direct加载和提交过程排错小结
2013/04/02 Javascript
js文本框走动跑马灯效果代码分享
2015/08/25 Javascript
图解js图片轮播效果
2015/12/20 Javascript
浅谈JavaScript事件绑定的常用方法及其优缺点分析
2016/11/01 Javascript
DropDownList实现可输入可选择(两种版本可选)
2016/12/07 Javascript
移动端Ionic App 资讯上下循环滚动的实现代码(跑马灯效果)
2017/08/29 Javascript
javascript中关于类型判断的一些疑惑小结
2018/10/14 Javascript
JS判断两个数组或对象是否相同的方法示例
2019/02/28 Javascript
js实现贪吃蛇小游戏(加墙)
2020/07/31 Javascript
js实现石头剪刀布游戏
2020/10/11 Javascript
从零学python系列之教你如何根据图片生成字符画
2014/05/23 Python
python私有属性和方法实例分析
2015/01/15 Python
Python对list列表结构中的值进行去重的方法总结
2016/05/07 Python
Python3生成手写体数字方法
2018/01/30 Python
详解Pandas之容易让人混淆的行选择和列选择
2019/07/10 Python
kali中python版本的切换方法
2019/07/11 Python
python根据时间获取周数代码实例
2019/09/30 Python
tensorflow中tf.slice和tf.gather切片函数的使用
2020/01/19 Python
image-set实现Retina屏幕下图片显示详细介绍
2012/12/24 HTML / CSS
BabyBjörn婴儿背带法国官网:BabyBjorn法国
2018/06/16 全球购物
拉夫劳伦爱尔兰官方网站:Ralph Lauren爱尔兰
2020/04/10 全球购物
浅谈react路由传参的几种方式
2021/03/23 Javascript
弄虚作假心得体会
2014/09/10 职场文书
大学组织委员竞选稿
2015/11/21 职场文书
Python 详解通过Scrapy框架实现爬取CSDN全站热榜标题热词流程
2021/11/11 Python
MyBatis在注解上使用动态SQL方式(@select使用if)
2022/07/07 Java/Android