我正在使用Hazelcast(JCache標準)編寫分佈式應用程序進行緩存。鎖定榛樹羣集中的密鑰
我有一個用例,我應該鎖定羣集中的特定鍵以防止在更新期間調用。
- 線程1:得到物品1的配置變化(把鎖)
- 線程2:獲得物品1的更新。
- thread2:將item1更新並添加一個新的時間戳。
- 線程1:把物品1用一箇舊值和時間戳
我知道了Ehcache具有非常相似的,這就是所謂的acquireReadLockOnKey(對象鍵)的東西。
如何使用JCache和/或Hazelcast實現這種鎖定?
我正在使用Hazelcast(JCache標準)編寫分佈式應用程序進行緩存。鎖定榛樹羣集中的密鑰
我有一個用例,我應該鎖定羣集中的特定鍵以防止在更新期間調用。
我知道了Ehcache具有非常相似的,這就是所謂的acquireReadLockOnKey(對象鍵)的東西。
如何使用JCache和/或Hazelcast實現這種鎖定?
查看Entry Processor,它以原子和無鎖方式對緩存條目執行更新操作。
我會建議使用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類。
正在談論從JCache的EntryProcessor?它是否在分佈式緩存中正常工作? – Forin
在我們的項目中,我們使用Hazelcast IMap的入門處理器,並且我們沒有遇到併發問題。入門處理器是改變分佈式環境中數據的好方法。輸入處理器在密鑰所有者上執行,它允許實現原子性 並避免通過網絡發送數據。 –
這兩個答案都有優點;如果您的爭用率較低,則可以按照上述說明去CAS。否則,您可以使用JCache'EntryProcessor',[其合約](https://github.com/jsr107/jsr107spec/blob/37937a43c66b986dbfc0aa8291c8f10975b26dc0/src/main/java/javax/cache/processor/EntryProcessor.java#L26-L32)保證它將以原子方式在一個鍵上執行。您只需確保您的'EntryProcessor'代碼部署在Hazelcast集羣的所有成員上。 –