php使用redis作為訊息佇列

來源:互聯網
上載者:User
安裝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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.