原子写入ehcache

时间:2010-04-01 10:26:52

标签: java multithreading caching concurrency ehcache

上下文

我在ehcache中存储java.util.List。

Key(String) --> List<UserDetail>

有序列表包含我最活跃用户的前10名。

问题

并发第三方客户端可能正在请求此列表。 我要求尽可能保持最新的排名。因此,如果由于用户的活动而改变排名,则高速缓存中的有序列表不能长时间保持陈旧。一旦我重新计算了一个新的List,我想立即替换缓存中的那个。

考虑一个繁忙的场景,即多个并发客户端请求排名;如何以一种方式替换缓存项:客户端可以继续拉出可能过时的快照。它们永远不会得到空值。

只有1个服务器线程写入缓存。

2 个答案:

答案 0 :(得分:4)

我看不出问题所在。一旦替换了缓存项,客户端就会拉出新的缓存项。到那时为止,他们将拉出旧的缓存项目。

除非您实际从缓存中删除该项目然后替换它,否则它们永远不应该返回空缓存项目。

如果EHCache的工作方式如此,我会认为它基本上已被打破,因为它本身就是线程安全的!

答案 1 :(得分:3)

您只需将新列表存储在缓存中即可。接下来的get调用将返回它。

所有你必须确保没有人编辑从缓存返回的列表。例如,在服务器线程中,您必须复制列表:

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