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将向Java靠拢
Oct 09 PHP
台湾中原大学php教程孙仲岳主讲
Jan 07 PHP
php 运行效率总结(提示程序速度)
Nov 26 PHP
PHP采集相关教程之一 CURL函数库
Feb 15 PHP
PHP模块 Memcached功能多于Memcache
Jun 14 PHP
Sorting Array Values in PHP(数组排序)
Sep 15 PHP
CI框架中集成CKEditor编辑器的教程
Jun 09 PHP
php自定义加密与解密程序实例
Dec 31 PHP
HTML中嵌入PHP的简单方法
Feb 16 PHP
PHP+JS实现的商品秒杀倒计时用法示例
Nov 15 PHP
PHP基于socket实现客户端和服务端通讯功能
Jul 13 PHP
Laravel 使用查询构造器配合原生sql语句查询的例子
Oct 12 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编程实现获取excel文档内容的代码实例
2011/06/28 PHP
PHP的时间戳与具体时间转化的简单实现
2016/06/13 PHP
javascript 原型模式实现OOP的再研究
2009/04/09 Javascript
javascript showModalDialog模态对话框使用说明
2009/12/31 Javascript
Javascript连接多个数组不用concat来解决
2014/03/24 Javascript
JS中getYear()和getFullYear()区别分析
2014/07/04 Javascript
jquery插件validation实现验证身份证号等
2015/06/04 Javascript
jquery简单实现网页层的展开与收缩效果
2015/08/07 Javascript
JavaScript的MVVM库Vue.js入门学习笔记
2016/05/03 Javascript
jquery div模态窗口的简单实例
2016/05/28 Javascript
jQuery实现扑克正反面翻牌效果
2017/03/10 Javascript
vue 和vue-touch 实现移动端左右导航效果(仿京东移动站导航)
2017/04/22 Javascript
jQuery扩展_动力节点Java学院整理
2017/07/05 jQuery
BootStrap的双日历时间控件使用
2017/07/25 Javascript
javascript基于牛顿迭代法实现求浮点数的平方根【递归原理】
2017/09/28 Javascript
纯html+css+javascript实现楼层跳跃式的页面布局(实例代码)
2017/10/25 Javascript
详解Vue路由钩子及应用场景(小结)
2017/11/07 Javascript
vue页面跳转实现页面缓存操作
2020/07/22 Javascript
深入讲解Python中面向对象编程的相关知识
2015/05/25 Python
python3批量删除豆瓣分组下的好友的实现代码
2016/06/07 Python
python实现浪漫的烟花秀
2019/01/30 Python
Python I/O与进程的详细讲解
2019/03/08 Python
pycharm new project变成灰色的解决方法
2019/06/27 Python
QML使用Python的函数过程解析
2019/09/26 Python
PUMA官方商城:世界领先的运动品牌之一
2016/11/16 全球购物
个人收入证明范本
2014/01/12 职场文书
技术总监管理岗位职责
2014/03/09 职场文书
央视元宵晚会主持串词
2014/03/25 职场文书
明信片寄语大全
2014/04/08 职场文书
职工年度考核评语
2014/12/31 职场文书
销售员岗位职责范本
2015/04/11 职场文书
2015年骨干教师工作总结
2015/05/26 职场文书
文艺节目主持词
2015/07/06 职场文书
nginx配置文件使用环境变量的操作方法
2021/06/02 Servers
Spring Boot配合PageHelper优化大表查询数据分页
2022/04/20 Java/Android
python使用shell脚本创建kafka连接器
2022/04/29 Python