博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
redis实现简单的消息队列(php)
阅读量:6264 次
发布时间:2019-06-22

本文共 1547 字,大约阅读时间需要 5 分钟。

hot3.png

在SNS中,经常出现1秒钟上万个用户同时发布消息的情况,如果在这种情况下使用mysql很有可能出现"too many connections"的错误,而且使用mysql写大量数据的时候,往往效率并不是特别高。这种情况下就可以使用redis的List类型作为消息队列,把用户发布的消息暂时存储在消息队列中,接下来使用一个cron程序把消息队列中消息插入到mysql,这样就有效的降低mysql的并发量。

下面写两个简单的页面模拟消息的发布,以及消息的存储。

$redis = new Redis;$redis->connect('127.0.0.1');$redis->auth('rainn1234');$article = get_article();$redis->rpush('article',json_encode($article));function get_article(){    $shuffle = "abcdefghigklmnopqrstuvwxyz1234567890";    $title   = substr(str_shuffle($shuffle), 0,6);    $content = substr(str_shuffle($shuffle), 6);    $time    = 1420000000 + rand(1,10000000);    return array('title' => $title, 'content' => $content, 'time' => $time);}$redis->close();

消息的内容都是随机获取的,只是为了简单模拟获取消息的过程。以上代码获取消息内容,并将内容转化为json后存储在redis的List中。

下面是一个从List中获取消息,并存到mysql中,为了方便也粗略写出。

$pdo = new PDO("mysql:host=localhost;dbname=1xin","root","root");$redis = new Redis;$redis->connect('127.0.0.1');$redis->auth('rainn1234');while(true){	if ($info = $redis->lpop('article')){		$article = json_decode($info,true);		$sql = "INSERT INTO `test`(`title`,`content`,`time`)                 VALUES('{$article['title']}','{$article['content']}',{$article['time']})";		$pdo->exec($sql);	} else {		sleep(1);		//队列中没有消息时,睡眠1s,让出cpu给其他进程	}}$pdo->close();$redis->close();

以上代码可以由cron代码执行,从redis的List中判断是否存在待写入mysql的文章,没有则睡眠1秒。

由测压工具模拟访问第一个文件:

165312_bWfU_2667773.png

在redis-cli中执行 lrange article 0 -1:

165410_V8m6_2667773.png

可以看到执行过程中是有存储消息的,然而最终却没有了,查看mysql,里面已经有数据了,随机查看上图中的几条,看看是否存在:

165836_e9Gv_2667773.png

数据全部存在,消息队列实现。

以上只是消息队列原理,实际应用中肯定还会有诸多限制,我这里只是抛砖引玉,希望大家能有更多更好的实现方式。

 

转载于:https://my.oschina.net/OSrainn/blog/732972

你可能感兴趣的文章
Net Standard扩展支持实例分享
查看>>
RHEL,centOS下vncserver,service命令关联的rpm包
查看>>
QTP关键字视图下显示项的相关设置
查看>>
linux cpu内存利用率获取
查看>>
Binder.js的重写过程记录
查看>>
汗,铁道部的12306js脚本竟然用的这么杂乱
查看>>
点播转码相关常见问题及排查方式
查看>>
[arm驱动]linux设备地址映射到用户空间
查看>>
在线转码
查看>>
我的友情链接
查看>>
励志短句在线翻译的方法介绍
查看>>
博客园美化-coffee
查看>>
Hibernate Annotation 学习
查看>>
Hadoop 3.0 纠删码技术分析(Erasure Coding)
查看>>
11、待添加
查看>>
26、百度地图 & 高德地图
查看>>
MYSQL老密码与php版本扩展关系
查看>>
类型检测汇总!typeof 和 instanceof 和isArray
查看>>
HDU4578 线段树(区间更新 + 多种操作)
查看>>
10g集群启动顺序
查看>>