2013-01-17 70 views
2

我想實現什麼,我會覺得是使用ServiceStack Redis的客戶一種很常見的緩存方案,但我很難找到一個很好的例子。阻止訪問Redis的密鑰(ServiceStack)

在ASP.NET MVC應用程序,我們做一個比較長時間運行(與計量)調用外部Web服務和緩存的一段時間內的結果。在緩存實現中,希望阻止對該密鑰的附加請求,直到Web服務調用完成,以避免額外的(昂貴的)調用。

那麼,什麼是實現一鍵級鎖的最好方法? Redis是否支持開箱即用?將ServiceStack的IRedisClient.AcquireLock是一個非常適合這種,或者是矯枉過正,如果我們不處理分佈式鎖嗎?或者,我最好是自己實施鎖定,如描述here

在此先感謝!

回答

2

Redis是一個非阻塞的異步服務器,在客戶端連接上沒有內置的redis語句來阻塞,直到是空閒的。

注:Redis是一個遠程NoSQL數據存儲庫,因此任何鎖定您實現涉及Redis的是通過設計「分發」。 ServiceStack的AcquireLock使用Redis的的原始SETNX鎖定機制,以確保只有1客戶端連接的鎖,所有其他客戶端/連接保持阻塞,直到鎖已被使用指數重試後關閉乘數輪詢釋放。

爲了實現分佈式鎖不輪詢你需要創建一個使用的SETNX + Redis的的發佈/訂閱的支持相結合,以通知等待客戶端的鎖已經被釋放的解決方案。

+0

Futher信息:https://engineering.gosquared.com/distr 。地理鎖 - 使用 - Redis的 – Athlan

+0

甚至更​​多的信息在:http://redis.io/topics/distlock –

0

爲什麼不出具要鎖定鍵SETNX?如果鑰匙可以設置/鎖定,這將返回1。如果它已經存在,則爲0,因此不能進行鎖定。有關具體信息,請參見http://www.redis.io/commands/setnx

2

我使用下面的模式用於使用Redis的作爲全球網絡互斥:

  1. LPUSH創建一個互斥
  2. BRPOP鎖定(這被阻塞)
  3. LPUSH解鎖