上下文
我在ehcache中存储java.util.List。
Key(String) --> List<UserDetail>
有序列表包含我最活跃用户的前10名。
问题
并发第三方客户端可能正在请求此列表。 我要求尽可能保持最新的排名。因此,如果由于用户的活动而改变排名,则高速缓存中的有序列表不能长时间保持陈旧。一旦我重新计算了一个新的List,我想立即替换缓存中的那个。
考虑一个繁忙的场景,即多个并发客户端请求排名;如何以一种方式替换缓存项:客户端可以继续拉出可能过时的快照。它们永远不会得到空值。
只有1个服务器线程写入缓存。
答案 0 :(得分:4)
我看不出问题所在。一旦替换了缓存项,客户端就会拉出新的缓存项。到那时为止,他们将拉出旧的缓存项目。
除非您实际从缓存中删除该项目然后替换它,否则它们永远不应该返回空缓存项目。
如果EHCache的工作方式如此,我会认为它基本上已被打破,因为它本身就是线程安全的!
答案 1 :(得分:3)
您只需将新列表存储在缓存中即可。接下来的get调用将返回它。
所有你必须确保没有人编辑从缓存返回的列表。例如,在服务器线程中,您必须复制列表:
List workingCopy = new ArrayList ((List)cache.get(key));
... modify list ...
cache.put (key, workingCopy);