2017-08-03 61 views
-1

我正在使用Redis在我的java項目中,我需要獲取某個鍵的值,然後進行一些修改,然後再次設置該鍵的值。 我的要求是,如果一個線程獲得了一個鍵的值,那麼另一個線程應該等到第一個線程爲該鍵設置值。 我本來可以使用同步的,但我們在我們的項目中使用多服務器,所以同步將不適用於這種情況。 任何人都可以建議我一些其他的解決方案,這種情況。java中的Redis鎖定鍵

+2

在你輸入這個問題的時候,你會在Redis自己的[gui de分佈式鎖定](https://redis.io/topics/distlock)。請在這裏發佈問題之前做一些調查。 – rmlan

回答

2

我認爲Redisson項目是完美的解決方案。

免責聲明:我Redisson項目的成員

Redisson理解需要有一個更抽象的方式與Redis的工作,所以我們創造了許多對自己的Redis的基礎上工作的對象和服務並公開標準的java接口。所有這些對象和服務都是分佈式和線程安全的。

解決您的問題,我們有很多locks and synchronisers供您選擇:鎖(ReentrantLock的),FairLock,MULTILOCK,RedLock(如描述在official document,是的,我們已經閱讀了一切),ReadWriteLock中,信號量,PermitExpirableSemaphore ,CountDownLatch。

的使用不能是更加簡單:

節點1:

Config config = ;//create your own configuration object based on connections types 
RedissonClient redisson = Redisson.create(config); 

//The Lock is just a java.util.concurrent.locks.Lock 
Lock lock = redisson.getLock("myLock"); 
lock.lock(); 

//or if you want to have a lease time on the lock 
((RLock) lock).lock(10, TimeUnit.SECONDS); 

//do other business here. 
lock.unlock(); 

節點2:

//The same as node1 

如果你想知道多一點,請前往我們的網站: https://redisson.org

+0

我在我的項目中使用了Redisson,它在一段時間內工作正常,但隨後它開始給我錯誤,如下所示。我不知道是什麼導致了這個錯誤。 [鏈接](https://codeshare.io/2EMNjN) –

+0

其中一個可能的原因是您嘗試創建大量Redisson實例。通常,每個應用程序只需要一個Redisson實例。 –

+0

我可以爲一個** RedissonClient **實例創建多個** RLock **實例。 –