Java 对ehcache的原子写入

Java 对ehcache的原子写入,java,multithreading,caching,concurrency,ehcache,Java,Multithreading,Caching,Concurrency,Ehcache,上下文 我正在ehcache中存储一个java.util.List Key(String) --> List<UserDetail> 键(字符串)-->列表 有序列表包含我最活跃用户的前10名排名 问题 并发第三方客户端可能正在请求此列表。 我有一个要求是尽可能最新的排名。因此,如果由于用户的活动而更改了排名,则缓存中的有序列表不能长时间处于陈旧状态。一旦我重新计算了一个新列表,我想立即替换缓存中的列表 考虑一个繁忙的场景,其中多个并发客户端请求排名;如何以这样的方式替换缓

上下文

我正在ehcache中存储一个java.util.List

Key(String) --> List<UserDetail>
键(字符串)-->列表
有序列表包含我最活跃用户的前10名排名

问题

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

考虑一个繁忙的场景,其中多个并发客户端请求排名;如何以这样的方式替换缓存项:客户端可以继续提取可能过时的快照。它们永远不应该得到空值


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

我看不出问题出在哪里。一旦您替换了缓存项,客户端将提取该新缓存项。在此之前,他们将提取旧的缓存项

它们永远不会返回空缓存项,除非您实际从缓存中删除该项,然后将其替换


如果EHCHACE像这样工作,我会认为它是非常彻底的,因为它意味着线程安全!p> 我看不出有什么问题。一旦您替换了缓存项,客户端将提取该新缓存项。在此之前,他们将提取旧的缓存项

它们永远不会返回空缓存项,除非您实际从缓存中删除该项,然后将其替换


如果EHCHACE像这样工作,我会认为它是非常彻底的,因为它意味着线程安全!p> 您只需将新列表存储在缓存中即可。下一个get调用将返回它

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

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

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

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

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

没错,javadoc for net.sf.ehcache.Cache说它是线程安全的。不幸的是,我在调用put之前删除了缓存项。我应该只调用Cache.put(..),你是对的,javadoc for net.sf.ehcache.Cache说它是线程安全的。不幸的是,我在调用put之前删除了缓存项。我应该只调用Cache.put(..)。