phpredis消息队列(PHP+redis实现微博的推模型案例分析)
phpredis消息队列
PHP+redis实现微博的推模型案例分析本文实例讲述了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程序设计有所帮助。
原文链接:https://blog.csdn.net/baochao95/article/details/73178263
- php数据库怎么获得表单(php如何把表单内容提交到数据库)
- php目录使用教程学习(PHP FileSystem 文件系统常用api整理总结)
- php加密平台(PHP7实现和CryptoJS的AES加密方式互通示例AES-128-ECB加密)
- 如何用wampserver打开自己写的php(WampServer下安装多个版本的PHP、mysql、apache图文教程)
- php 面向对象与面向过程(php面向对象重点知识分享)
- php提供哪些函数来避免sql的注入(PHP与SQL语句写一句话木马总结)
- php和xml有什么关系(PHP创建XML的方法示例基于DOMDocument类及SimpleXMLElement类)
- php简单定时执行任务(php实现 master-worker 守护多进程模式的实例代码)
- 怎么用php制作图片(PHP压缩图片功能的介绍)
- php性能优化的思路和步骤(FastCGI轻松搞定IIS7.5+PHP5.6.0环境)
- dedecms手机独立域名(DedeCMS Wap.php 绑定域名的解决办法)
- php处理app上传的图片(php用wangeditor3实现图片上传功能)
- php新建文件夹代码(php新建文件的方法实例)
- php开发详细步骤(php源码的安装方法和实例)
- iis6双php版本的设置(云主机IIS7.5支持PHP5.3以上版本和MYSQL)
- php关注公众号发送消息(php实现QQ小程序发送模板消息功能)
- 富士胶片 中国 我们对上海的信心没有任何改变(富士胶片中国)
- 赢麻了 富士公布2021年度财报 营利同比增长240(富士公布2021年度财报)
- 医事文化谈屑 | 古人的名 字 号(医事文化谈屑古人的名)
- ()
- 网友很惭愧,自己写了很多年的字,到头来还不如一名小学生写的好(自己写了很多年的字)
- 中华第一楷 张瑞龄 86岁高龄,苦练楷书71年,一幅字卖593万(中华第一楷张瑞龄)
热门推荐
- 运维堡垒机怎么搭建(堡塔云控平台添加服务器受控端图文教程)
- 织梦dedecms专题页制作详细教程(织梦Dedecms系统SEO优化之网站URL目录优化)
- python开启线程池(对python:threading.Thread类的使用方法详解)
- mysqldecimal类型转换(mysql中decimal数据类型小数位填充问题详解)
- 各种云服务器区别(日本云服务器有什么特性?好不好?)
- 使用 iosOverlay 弹出提示信息
- django 如何实现高并发(Django如何防止定时任务并发浅析)
- nginxdjango部署(详解Django+uwsgi+Nginx上线最佳实战)
- vue-router起步教程交流(vue3使用vue-router的完整步骤记录)
- html5能取数据库吗(HTML5 客户端数据库简易使用:IndexedDB)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9