2016-01-05 41 views
1

我想要做類似於這篇文章中描述的東西 http://vunvulearadu.blogspot.co.uk/2015/03/activeactive-mechanism-over-azure.html當我的一個實例從主服務器獲取服務總線消息時,它會將一個項目添加到redis緩存中。然後,如果另一個實例正在處理副本上的消息副本,它可以首先檢查該消息是否已被處理,如果是,則忽略它。是否有可能阻止兩個進程寫入相同的緩存項目?

這個問題,在我看來,如果兩個實例試圖同時處理消息(一個來自主要,一個來自次要),那麼它們都可能從緩存中讀取並且什麼也沒找到,然後寫入緩存與此同時。所以我的問題是,如果他們同時寫入緩存會發生什麼。理想情況下,我希望一個失敗,以便它可以假定另一個實例正在處理該消息。那可能嗎?

回答

4

使用REDIS的SETNX(或MSETNX或HSETNX,取決於您要存儲的數據的結構)功能。 它將寫入該值當且僅當它尚未設置。 由於REDIS是單線程的,它將保證您只有第一個實例纔會成功 - 只要您使用相同的密鑰來存儲數據。

+0

輝煌。謝謝。 – Ian1971

+0

我應該看看Redlock嗎? – Ian1971

+0

如果我對你的問題的理解是正確的,那麼你不需要。 Redlock提供了一種以可靠方式獲取鎖的方法,其中包含多個Redis實例。它提供高可用性。它不是爲了將數據存儲在緩存中而設計的。 –

相關問題