redis实现简单的消息队列(php)
2016-08-15 00:00
901 查看
在SNS中,经常出现1秒钟上万个用户同时发布消息的情况,如果在这种情况下使用mysql很有可能出现"too many connections"的错误,而且使用mysql写大量数据的时候,往往效率并不是特别高。这种情况下就可以使用redis的List类型作为消息队列,把用户发布的消息暂时存储在消息队列中,接下来使用一个cron程序把消息队列中消息插入到mysql,这样就有效的降低mysql的并发量。
下面写两个简单的页面模拟消息的发布,以及消息的存储。
消息的内容都是随机获取的,只是为了简单模拟获取消息的过程。以上代码获取消息内容,并将内容转化为json后存储在redis的List中。
下面是一个从List中获取消息,并存到mysql中,为了方便也粗略写出。
以上代码可以由cron代码执行,从redis的List中判断是否存在待写入mysql的文章,没有则睡眠1秒。
由测压工具模拟访问第一个文件:
在redis-cli中执行 lrange article 0 -1:
可以看到执行过程中是有存储消息的,然而最终却没有了,查看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秒。
由测压工具模拟访问第一个文件:
在redis-cli中执行 lrange article 0 -1:
可以看到执行过程中是有存储消息的,然而最终却没有了,查看mysql,里面已经有数据了,随机查看上图中的几条,看看是否存在:
数据全部存在,消息队列实现。
以上只是消息队列原理,实际应用中肯定还会有诸多限制,我这里只是抛砖引玉,希望大家能有更多更好的实现方式。
相关文章推荐
- Redis实现简单消息队列
- Redis实现简单消息队列
- PHP中利用redis实现消息队列处理高并发请求--简洁代码实现效果
- PHP消息队列实现及应用:流量削峰案列(Redis的List类型实现秒杀)
- Redis实现简单消息队列
- PHP中利用redis实现消息队列处理高并发请求
- php+redis实现消息队列
- 消息队列及PHP中的简单实现与应用
- Redis实现简单消息队列
- PHP使用php-resque库配合Redis实现MQ消息队列的教程
- Redis实现简单消息队列
- 基于redis+mysql+php的简单队列实现
- Redis实现简单的消息队列
- PHP基于Redis消息队列实现发布微博的方法
- Redis实现简单消息队列
- php+redis消息队列抢购实现
- php+redis消息队列实现抢购功能
- Redis实现简单消息队列
- php实现redis消息队列将数据保存到mysql
- 【Redis】php+redis实现消息队列