2017-06-01 155 views
1

我正在使用Hazelcast(JCache標準)編寫分佈式應用程序進行緩存。鎖定榛樹羣集中的密鑰

我有一個用例,我應該鎖定羣集中的特定鍵以防止在更新期間調用。

  1. 線程1:得到物品1的配置變化(把鎖)
  2. 線程2:獲得物品1的更新。
  3. thread2:將item1更新並添加一個新的時間戳。
  4. 線程1:把物品1用一箇舊值和時間戳

我知道了Ehcache具有非常相似的,這就是所謂的acquireReadLockOnKey(對象鍵)的東西。

如何使用JCache和/或Hazelcast實現這種鎖定?

回答

2

查看Entry Processor,它以原子和無鎖方式對緩存條目執行更新操作。

+0

正在談論從JCache的EntryProcessor?它是否在分佈式緩存中正常工作? – Forin

+2

在我們的項目中,我們使用Hazelcast IMap的入門處理器,並且我們沒有遇到併發問題。入門處理器是改變分佈式環境中數據的好方法。輸入處理器在密鑰所有者上執行,它允許實現原子性 並避免通過網絡發送數據。 –

+0

這兩個答案都有優點;如果您的爭用率較低,則可以按照上述說明去CAS。否則,您可以使用JCache'EntryProcessor',[其合約](https://github.com/jsr107/jsr107spec/blob/37937a43c66b986dbfc0aa8291c8f10975b26dc0/src/main/java/javax/cache/processor/EntryProcessor.java#L26-L32)保證它將以原子方式在一個鍵上執行。您只需確保您的'EntryProcessor'代碼部署在Hazelcast集羣的所有成員上。 –

3

我會建議使用CAS(比較和設置)類似的操作(如ConcurrentMap :: replace),並利用本身不是真正的鎖的樂觀鎖定模式。

while(true) { 
    // Get the old value 
    T oldValue = map.get(key); 
    // Create the new value based on the "known old state" 
    T newValue = createNewValue(oldValue); 
    // Try to atomically exchange to the new value, if oldValue is still valid 
    if (map.replace(key, oldValue, newValue) break; 
    // If oldValue isn't valid anymore, retry 
} 

在沒有高爭用率的大多數情況下,這是真正鎖定的最佳替代方案。它解決了大部分讀 - 修改 - 寫問題,並且不需要在集羣上部署/使用EntryProcessor類。

相關問題