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中的串行化变量和序列化对象
Sep 05 PHP
php 团购折扣计算公式
Nov 24 PHP
使用php判断浏览器的类型和语言的函数代码
Feb 28 PHP
改写函数实现PHP二维/三维数组转字符串
Sep 13 PHP
PhpDocumentor 2安装以及生成API文档的方法
May 21 PHP
destoon实现调用图文新闻的方法
Aug 21 PHP
php抽象类使用要点与注意事项分析
Feb 09 PHP
php生成gif动画的方法
Nov 05 PHP
PHP+MySQL实现无极限分类栏目的方法
Dec 23 PHP
php版银联支付接口开发简明教程
Oct 14 PHP
PHP精确计算功能示例
Nov 29 PHP
一文掌握PHP Xdebug 本地与远程调试(小结)
Apr 23 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笔试题
2009/08/04 PHP
PHP中将网页导出为Word文档的代码
2012/05/25 PHP
PHP的foreach中使用引用时需要注意的一个问题和解决方法
2014/05/29 PHP
CodeIgniter表单验证方法实例详解
2016/03/03 PHP
一个加密JavaScript的开源工具PACKER2.0.2
2006/11/04 Javascript
[原创]保存的js无法执行的解决办法
2007/02/25 Javascript
基于jquery的滑动样例代码
2010/11/20 Javascript
JS判断数组中是否有重复值得三种实用方法
2013/08/16 Javascript
jquery.validate的使用说明介绍
2013/11/12 Javascript
纯js和css实现渐变色包括静态渐变和动态渐变
2014/05/29 Javascript
使用text方法获取Html元素文本信息示例
2014/09/01 Javascript
jQuery简单验证上传文件大小及类型的方法
2016/06/02 Javascript
Javascript闭包与函数柯里化浅析
2016/06/22 Javascript
详解在Vue中通过自定义指令获取dom元素
2017/03/04 Javascript
Vue组件之全局组件与局部组件的使用详解
2017/10/09 Javascript
浅析Vue自定义组件的v-model
2017/11/26 Javascript
对vue2.0中.vue文件页面跳转之.$router.push的用法详解
2018/08/24 Javascript
解决VUE双向绑定失效的问题
2019/10/29 Javascript
vue监听浏览器原生返回按钮,进行路由转跳操作
2020/09/09 Javascript
举例讲解Python中的迭代器、生成器与列表解析用法
2016/03/20 Python
Python用zip函数同时遍历多个迭代器示例详解
2016/11/14 Python
Diango + uwsgi + nginx项目部署的全过程(可外网访问)
2018/04/22 Python
Django Rest framework之权限的实现示例
2018/12/17 Python
解决pip安装的第三方包在PyCharm无法导入的问题
2020/10/15 Python
阿迪达斯希腊官方网上商店:adidas希腊
2019/04/06 全球购物
波兰购物网站:MALL.PL
2019/05/01 全球购物
人力资源管理专业应届生求职信
2013/09/28 职场文书
演讲稿开场白
2014/01/13 职场文书
法人身份证明书
2015/06/18 职场文书
《赵州桥》教学反思
2016/02/17 职场文书
简历自我评价范文
2019/04/24 职场文书
深入浅析React中diff算法
2021/05/19 Javascript
Python学习之异常中的finally使用详解
2022/03/16 Python
Python安装使用Scrapy框架
2022/04/12 Python
vue3不同环境下实现配置代理
2022/05/25 Vue.js
pytest实现多进程与多线程运行超好用的插件
2022/07/15 Python