redis 任務佇列

2022-04-03 05:04:49 字數 1539 閱讀 3195

使用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理解,這裡不再贅述。

以上**:

續:因為要做nodejs的任務佇列,所以查詢到此資料。無意間,竟然發現這個可以很好地解決我之前做的伺服器程式中的另外乙個問題,brpop可以很完美的解決這個問題。加上redis快取之前用於比對seq的功能,redis一箭雙鵰地完美解決。

使用Redis構建任務佇列

任務佇列可以看作是訊息佇列的一種,只是其用於管理非同步任務。任務佇列有基本的在應用程式間傳遞,保持任務的功能。本實訓專案的主要內容是使用redis分別構建先進先出任務佇列,優先順序任務佇列和定時任務佇列。先進先出任務佇列 usr bin env python coding utf 8 import ...

使用Redis實現任務佇列

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

redis 佇列 redis 延時佇列

定時發公告 使用者下單30分鐘後未付款自動關閉訂單 使用者下單後延時簡訊提醒 延時關閉空閒客戶端連線 使用redis提供的有序資料結構zset,把過期時間戳作為score。public void produce string topic,string msg,date date 生產訊息 於 消費 ...