2012-10-17 38 views
2

想要「鎖定」外部資源,在這種情況下,它將是存儲在rackspace cloud servers上的「blob」,與Amazon S3類似。 (使用Python)可以使用Redis或Memcached來「鎖定」像S3這樣的blobstore資源嗎?

想的競爭條件,以這樣的處理:

  • 首先進程對資源造成鎖
  • 首先進程開始編輯資源
  • 二進程試圖編輯同一個資源並發現資源被鎖定。當鎖被取下
  • 第一個進程完成編輯資源和移除鎖定
  • 二進程接收釋放的資源的通知,並能夠做出自己的編輯通知
  • 二進程請求

想使用Memcached或Redis創建鎖,但是不同的機制也不錯。

大部分情況非常簡單,我正在努力的部分是如何在鎖被刪除時通知第二個進程,而不是強制它等待並重試。

Redis有publish/subscribe functionality,這是適合在這種情況下使用嗎?

或者還有其他方法可以解決這個問題嗎?

非常感謝!

+1

看看http://www.davidverhasselt.com/2011/08/06/a-distributed-mutex-and-semaphore-using-redis/ – abeyer

+1

通常第二個進程只會循環,直到鎖由第一個過程設置釋放 - 這是絕對不可能的? (以及爲什麼?),否則實現這種算法將是相對簡單的使用redis。 – Mahn

回答

1

至於Redis,如果您確實需要鎖定,您可以使用SETNX來創建這樣一個鎖,更多信息可以在SETNX documentation中找到。

如果你希望對給定鎖定少量爭,你也沒有任何資源飢餓處理鎖定的信息,你也可以使用WATCH/MULTI/EXEC交易。首先,您要對要編輯的密鑰設置WATCH,然後在MULTI中編輯密鑰本身,然後在EXEC之後最終編輯失敗,因爲某人同時編輯了該密鑰(然後您需要重試)或返回OK你很好。這是您在Redis中實施機會鎖定的方式。更多的信息在transaction documentation

相關問題