2015-06-14 72 views
0

我有一個由Redis備份的隊列,並且有多個節點連接到該Redis服務器,並且我需要確保它不會獲得相同的密鑰兩次,所以它永遠不會多次運行同一個任務。從Redis獲取密鑰並同時到期

我使用節點Redis的這個任務:

client.set("some_key", data); 
client.get("some_key", function (err, data) { 
    //.. 
}); 

得到那個關鍵的是沒有其他節點的過程就能得到它太當我如何確保?如果我只在獲得該值後將其設置爲過期,那麼當2個進程將嘗試同時獲得相同的值時,它將不夠用。

回答

3

我不認爲還有比因此,使用節點的Redis來包裝它在多

MULTI 
GET some_key 
DEL some_key 
EXEC 

任何其他方式,像

client.multi() 
.get("some_key", data).del("some_key"). 
.exec(function (err, replies) {}); 
1

您可以使用MULTI/EXEC塊和/或Lua腳本來確保Redis中的操作的原子性。在你的情況下,你可以立即執行GET,然後使用DEL,然後使用上述任一方法確保單次讀取。

1

我會使用一個列表與流行操作而不是一個關鍵。尤其是,您可以向右側添加新項目(通過rpush),並將其從左側彈出(通過LPOP)。

如果您正在存儲大量密鑰(如果當前密鑰中的數據(如哈希))使用唯一標識符作爲哈希鍵,並將該ID添加到列表中,通過這種方式,您可以以簡單的方式獲得get-and-remove功能,而無需事務和多個命令,並且還可以存儲作業數據。

作業成功時,刪除數據密鑰,如果失敗,可以重新排隊。

+0

我並不熟悉LPOP/RPUSH,它聽起來像是我想用的方法。謝謝。 – Dano