php使用redis作為訊息佇列

2021-07-23 16:52:13 字數 1972 閱讀 5100

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開機啟動

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)
crontab實現

*/1 * * * * /usr

/bin/php /var/www/html/handler.php #每分鐘執行一次

在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)

上面的資料處理指令碼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

-eq0 ]

then

nohup /usr/bin/php /var/www/handler.php >> /tmp/handler.log 2>&1 &

fi

crontab -e

*/1 * * * * /var

/www/monitor.sh

php使用redis作為訊息佇列

rpm ivh epel release 6 8.noarch.rpm 安裝epel擴充套件 yum y install redis 安裝redis yum install php redis 安裝php擴充套件 service redis start 啟動redis伺服器 chkconfig re...

基於PHP使用rabbitmq實現訊息佇列

1.從github上面獲取amqp基於php的實現擴充套件 2.建立生產者 send.php 1 require dir protected vendor autoload.php 23 usephpamqplib connection amqpstreamconnection 4use phpam...

部落格306 Go使用緩衝chan作為訊息佇列

內容 go中的chan可以作為訊息佇列 chan 1 chan分為帶緩衝和不帶緩衝 2 帶緩衝的chan可以作為訊息佇列,用於削峰減流,增大吞吐 3 不帶緩衝的chan可以作為一種同步goruntine的方法例項 package main import runtime func main ci ma...