php使用redis作为消息队列
2016-10-14 10:26
681 查看
安装redis
redis不在centos官方源里面,需要手动下载EPEL(Extra Packages for Enterprise Linux)进行安装。EPEL相当于是原来源的扩展,具体的介绍可以看下这两篇文章
http://blog.chinaunix.net/uid-2469966-id-3916408.html
http://f.dataguru.cn/thread-47927-1-1.html
注意,我们去http://fedoraproject.org/wiki/EPEL这个网站找安装文件的时候,应该跟你的系统版本一致,比如说我用的centos7,我下载的地址。
https://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-8.noarch.rpm
rpm -ivh epel-release-6-8.noarch.rpm #安装epel扩展 yum -y install redis #安装redis yum install php-redis #安装php扩展 service redis start #启动redis服务器 chkconfig redis on #设置redis开机启动
php-redis扩展手册地址:https://github.com/phpredis/phpredis#connect-open
使用list作为redis队列
list在redis中是一个双向队列,我们可以从队列的左边入队,从队列的右边出队。这样就可以实现先来先服务的队列操作。入队脚本
每当收到服务器请求时,将待处理的信息,从list的左边插入。$params = json_encode($_REQUEST); $redis->Lpush($key,$params);
出队脚本
编写脚本,通过crontab定时执行脚本,从list的右边取出错误处理。这种方式的优点是不会出现数据的丢失,只有定时脚本处理完相关信息之后,才从队列中取出;缺点也是显而易见的,响应不够及时,因为是定时访问redis的list队形,所以不能实时的处理队列中的消息。
$params = $redis->Rpop($key);
定时从队列中取出信息,可以采用php脚本sleep的方式,也可以使用crontab实现。
php实现
while(true){ sleep(1); //每秒执行一次 handle($params = $redis->Rpop($key)); }
crontab实现
* * * * * sleep 20; /usr/bin/php /var/www/html/handler.php #20s执行一次 */1 * * * * /usr/bin/php /var/www/html/handler.php #每分钟执行一次
使用subscribe/publish方式作为队列
在redis中,我们支持一种发布订阅机制,就像无线电广播一样。A订阅了一个频道之后,如果B在该频道发布了消息之后,A就能收听到。发布脚本
每当收到服务器请求时,将待处理的信息,发布到对应频道。$params = json_encode($_REQUEST); $redis->publish($channel,$params);
订阅脚本
编写脚本,在linux后台一直执行,实时监听该频道广播的消息。这种方式的优点是可以实时的处理数据,并且是redis主动向php脚本推送消息;缺点是有可能会有数据的丢失,因为消息的发布是实时性的,该发布/订阅通道不保存消息,仅仅作为消息传递的渠道,如果消息没有被订阅的脚本捕捉到,则会导致数据的丢失。
handler.php
$redis->subscribe(array($channel), 'handleFun'); function handleFun($redis, $chan, $msg) { $params = json_decode($msg,true); .... }
上面的数据处理脚本handler.php,一直在后台运行。
我们可以使用下面命令在后台执行
nohup /usr/bin/php /var/www/handler.php >> /tmp/handler.log 2>&1 &
我们为了防止脚本意外终止(发生错误等情况)不再工作,我们写一个定时任务监控该脚本的执行情况。
monitor.sh
#!/bin/bash alive=`ps aux|grep \/usr\/bin\/php|grep -v grep|wc -l` if [ $alive -eq 0 ] then nohup /usr/bin/php /var/www/handler.php >> /tmp/handler.log 2>&1 & fi
crontab -e */1 * * * * /var/www/monitor.sh
相关文章推荐
- PHP使用php-resque库配合Redis实现MQ消息队列的教程
- 使用redis list作为消息队列
- Kafka,Mq,Redis作为消息队列使用时的差异?
- 使用Redis作为消息队列服务场景应用案例
- NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例
- NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例
- redis作为消息队列的使用
- 使用 Kafka 和 Redis 作为消息队列的差异
- PHP下使用Redis消息队列发布微博
- NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例
- Kafka,Mq,Redis作为消息队列使用时的差异?
- redis作为消息队列的使用
- PHP使用Redis实现消息队列
- PHP使用redis消息队列发布微博的方法示例
- 【转】NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例
- PHP使用php-resque库配合Redis实现MQ消息队列的教程
- NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例
- PHP下使用Redis消息队列发布微博(复制)
- NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例
- [资源]PHP使用消息队列