使用Redis實現任務佇列

2021-07-26 06:36:05 字數 1522 閱讀 2828

使用redis實現任務佇列

說到佇列很自然就能想到redis的列表型別,3.4.2節介紹了使用lpush和rpop命令實現佇列的概念。如果要實現任務佇列,只需要讓生產者將任務使用lpush命令加入到某個鍵中,另一邊讓消費者不斷地使用rpop命令從該鍵中取出任務即可。

在小白的例子中,完成發郵件的任務需要知道收件位址、郵件主題和郵件正文。所以生產者需要將這三個資訊組成物件並序列化成字串,然後將其加入到任務佇列中。而消費者則迴圈從佇列中拉取任務,就像如下偽**:

# 無限迴圈讀取任務佇列中的內容  

loop  

$task

= rpor

queue  

if $task  

# 如果任務佇列中有任務則執行它  

execute($task)  

else  

# 如果沒有則等待1秒以免過於頻繁地請求資料  

wait 1 second 

到此乙個使用redis實現的簡單的任務佇列就寫好了。不過還有一點不完美的地方:當任務佇列中沒有任務時消費者每秒都會呼叫一次rpop命令檢視是否有新任務。如果可以實現一旦有新任務加入任務佇列就通知消費者就好了。其實借助brpop命令就可以實現這樣的需求。

brpop命令和rpop命令相似,唯一的區別是當列表中沒有元素時brpop命令會一直阻塞住連線,直到有新元素加入。如上段**可改寫為:

loop  

# 如果任務佇列中沒有新任務,brpop命令會一直阻塞,不會執行execute()。  

$task

= brpop

queue, 0  

# 返回值是乙個陣列(見下介紹),陣列第二個元素是我們需要的任務。  

execute($task[1]) 

brpop命令接收兩個引數,第乙個是鍵名,第二個是超時時間,單位是秒。當超過了此時間仍然沒有獲得新元素的話就會返回nil。上例中超時時間為"0",表示不限制等待的時間,即如果沒有新元素加入列表就會永遠阻塞下去。

當獲得乙個元素後brpop命令返回兩個值,分別是鍵名和元素值。為了測試brpop命令,我們可以開啟兩個redis-cli例項,在例項a中:

redis a

>

brpop queue 0 

鍵入回車後例項1會處於阻塞狀態,這時在例項b中向queue中加入乙個元素:

redis b

>

lpush queue task  

(integer) 1 

在lpush命令執行後例項a馬上就返回了結果:

1) "queue"  

2) "task" 

同時會發現queue中的元素已經被取走:

redis

>

llen queue  

(integer) 0 

除了brpop命令外,redis還提供了blpop,和brpop的區別在與從佇列取元素時blpop會從佇列左邊取。具體可以參照lpop理解,這裡不再贅述。

用Redis實現分布式鎖 與 實現任務佇列

這一次總結和分享用redis實現分布式鎖 與 實現任務佇列 這兩大強大的功能。先扯點個人觀點,之前我看了一篇博文說的文章大部分都是分享 博文裡強調說分享思路比分享 更重要 貌似大概是這個意思,若有誤請諒解 但我覺得,分享思路固然重要,但有了思路,卻沒有實現的 那會讓人覺得很浮誇的,在工作中的程式猿都...

PHP實現任務計畫

當我們需要定時去執行某些程式任務的時候,如果人工操作,往往就會覺得操作起來不方便,或者就不是自動定時了,所以由程式去定時地執行乙個任務,這是最好的選擇,下面是php實現任務計畫的乙個例子 ignore user abort 即使client斷開 如關掉瀏覽器 php指令碼也可以繼續執行.set ti...

jfinal實現任務排程

it.sauronsoftware.cron4j cron4j 2.2.5 task.txt為配置檔案 public void configplugin plugins me test.class指定定時執行的類 cron 表示式由五部分組成 分 時 天 月 周 分 從 0 到 59 時 從 0 到...