安裝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 #安裝redisyum 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){ //感謝璀璨星空fly的評論 //阻塞隊列方式避免了系統資源的浪費,提高了處理隊列的響應速度,要優於rpop方式 handle($params = $redis->brpop($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/bashalive=`ps aux|grep \/usr\/bin\/php|grep -v grep|wc -l`if [ $alive -eq 0 ]thennohup /usr/bin/php /var/www/handler.php >> /tmp/handler.log 2>&1 &fi
crontab -e*/1 * * * * /var/www/monitor.sh