原文链接: http://blog.csdn.net/nuli888/article/details/52138292
示例一
这里只是简单实现下Redis消息队列,主要了解下这个思路
要把消息队列最好,还需考虑可靠消费、可靠发布、持久化、路由匹配、队列监控、负载均衡。。。
大都用专业的消息队列系统如rabbitmq,我们公司用的就是这个
producer.PHP生产者者代码
- <?php
- $redis = new Redis();
- $redis->connect('192.168.1.198',7000);
- while(true){
- try{
- $value = 'value_'.date('Y-m-d H:i:s');
- $redis->lpush('key1',$value);//生成消息
- sleep(rand()%3);
- echo $value."\n";
- }catch(Exception $e){
- echo $e->getMessage()."\n";
- }
- }
- ?>
consumer.php消费者代码
- <?php
- $redis = new Redis();
- $redis->connect('192.168.1.198',7000);
- while(true){
- try{
- $value=$redis->lpop('key1')."\n";
- file_put_contents('val.txt',$value,FILE_APPEND);//将获取到的消息存入val.txt
- }catch(Exception $e){
- echo $e->getMessage()."\n";
- }
- sleep(rand()%3);
- }
- ?>
[root@localhost redis]# php producer.php
value_2016-08-06 20:22:57
value_2016-08-06 20:22:58
value_2016-08-06 20:22:59
value_2016-08-06 20:23:01
value_2016-08-06 20:23:03
...
[root@localhost redis]# php consumer.php
示例二
发帖、发微博、点赞、评论等这些操作很频繁的动作如果并发量小,直接入库是最简单的但是并发量一大,数据库肯定扛不住,这时可采取延迟发布:先将发布动作保存在队列里,后台进程循环获取再入库
模拟发布微博先进入Redis队列
weibo_redis.PHP
- <?php
- //此处需要安装phpredis扩展
- $redis = new Redis();
- $redis->connect('127.0.0.1', 6379);
- $redis->auth("php001");
- //连接redis
- $web_info= array(
- 'uid' => $_REQUEST[uid], //发布者id
- 'username' => $_REQUEST[username],//发布者用户名
- 'content' =>$_REQUEST[content],//微博内容
- );
- //将数组转成json来存储
- $list = json_encode($web_info);
- //lpush向KEY对应的头部添加一个字符串元素
- $redis->lpush('weibo_lists',$list);
- $redis->close();
- var_dump($list);
- ?>
模拟后台进程从redis队列获取微博
Pdodb.class.php
- <?php
- class Pdodb{
- public function post($uid='',$username='',$content=''){
- try{
- $dsn = "mysql:localhost;dbname=localhost;dbname=big";
- $db = new PDO($dsn,'big','123456');
- $db->exec("SET NAMES UTF8");
- $sql ="insert into ih_weibo(uid,username,content)values('$uid','$username','$content')";
- //echo $sql;
- $db->exec($sql);
- }catch(PDOException $e){
- echo $e->getMessage();
- }
- }
- }
weibo_mysql.php
- <?php
- require_once 'Pdodb.class.php';
- set_time_limit(0); // 取消脚本运行时间的超时上限
- $pdo = new Pdodb();
- $redis = new Redis();
- $redis->connect('127.0.0.1', 6379);
- while (true) {
- //返回的列表的大小。如果列表不存在或为空,该命令返回0。如果该键不是列表,该命令返回false
- if($redis -> lsize('weibo_lists')){
- //从LIST头部删除并返回删除数据
- $info = $redis->rpop('weibo_lists');
- $info = json_decode($info);
- $pdo->post($info->uid,$info->username,$info->content);
- }
- sleep(10);//延时10秒
- }
- $redis->close();