安装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开机启动
- 1
- 2
- 3
- 4
- 5
php-redis扩展手册地址:https://github.com/phpredis/phpredis#connect-open
使用list作为redis队列
list在redis中是一个双向队列,我们可以从队列的左边入队,从队列的右边出队。这样就可以实现先来先服务的队列操作。
入队脚本
每当收到服务器请求时,将待处理的信息,从list的左边插入。
$params = json_encode($_REQUEST);
$redis->Lpush($key,$params);
- 1
- 2
出队脚本
编写脚本,通过crontab定时执行脚本,从list的右边取出错误处理。
这种方式的优点是不会出现数据的丢失,只有定时脚本处理完相关信息之后,才从队列中取出;缺点也是显而易见的,响应不够及时,因为是定时访问redis的list队形,所以不能实时的处理队列中的消息。
$params = $redis->Rpop($key);
- 1
定时从队列中取出信息,可以采用php脚本sleep的方式,也可以使用crontab实现。
php实现
while(true){
sleep(1); //每秒执行一次
handle($params = $redis->Rpop($key));
}
- 1
- 2
- 3
- 4
crontab实现
* * * * * sleep 20; /usr/bin/php /var/www/html/handler.php #20s执行一次
*/1 * * * * /usr/bin/php /var/www/html/handler.php #每分钟执行一次
- 1
- 2
使用subscribe/publish方式作为队列
在redis中,我们支持一种发布订阅机制,就像无线电广播一样。A订阅了一个频道之后,如果B在该频道发布了消息之后,A就能收听到。
发布脚本
每当收到服务器请求时,将待处理的信息,发布到对应频道。
$params = json_encode($_REQUEST);
$redis->publish($channel,$params);
- 1
- 2
订阅脚本
编写脚本,在linux后台一直执行,实时监听该频道广播的消息。
这种方式的优点是可以实时的处理数据,并且是redis主动向php脚本推送消息;缺点是有可能会有数据的丢失,因为消息的发布是实时性的,该发布/订阅通道不保存消息,仅仅作为消息传递的渠道,如果消息没有被订阅的脚本捕捉到,则会导致数据的丢失。
handler.php
$redis->subscribe(array($channel), 'handleFun');
function handleFun($redis, $chan, $msg) {
$params = json_decode($msg,true);
....
}
- 1
- 2
- 3
- 4
- 5
上面的数据处理脚本handler.php,一直在后台运行。
我们可以使用下面命令在后台执行
nohup /usr/bin/php /var/www/handler.php >> /tmp/handler.log 2>&1 &
- 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
- 1
- 2
- 3
- 4
- 5
- 6
crontab -e
*/1 * * * * /var/www/monitor.sh
- 1
- 2