2010-04-01 101 views
1

語境原子寫入的Ehcache

我裏面存儲ehcache的一個java.util.List。

Key(String) --> List<UserDetail> 

有序列表包含我最活躍的用戶前10名。

問題

併發第三方客戶端可能會請求此列表。 我有一個關於排名的要求,儘可能最新。因此,如果排名由於用戶的活動而改變,那麼緩存中的有序列表不能保留很長時間。一旦我重新計算了一個新的列表,我想立即替換緩存中的一個。

考慮一個繁忙的場景,即多個併發客戶端請求排名;我怎樣才能以這樣的方式替換緩存項目:客戶端可以繼續提取可能過時的快照。他們不應該得到一個空值。

只有1個服務器線程寫入緩存。

回答

4

我沒有看到問題所在。一旦你取代了一個緩存項目,客戶端就會取出這個新的緩存項目。直到那一刻,他們將拉動舊的緩存項目。

應該永遠不會有時間返回一個空的緩存項目,除非您實際上從緩存中刪除該項目,然後將其替換。

如果EHCache這樣工作,我會認爲它是非常基本的破壞,因爲它是爲了線程安全!

+1

您說得對net.sf.ehcache.Cache的javadoc表示它是線程安全的。不幸的是,我在調用put之前刪除了緩存項。我應該只調用Cache.put(..)。 – 2010-04-01 10:49:43

3

您可以簡單地將新列表存儲在緩存中。接下來的獲取將返回它。

您必須確保沒有人編輯從緩存中返回的列表。例如,在服務器線程中,您必須複製該列表:

List workingCopy = new ArrayList ((List)cache.get(key)); 
... modify list ... 
cache.put (key, workingCopy);