1

语境

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

Key(String) --> List<UserDetail>

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

问题

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

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

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

4

2 回答 2

4

我不明白问题是什么。一旦你替换了一个缓存项,客户端就会拉取那个新的缓存项。直到那时,他们才会拉出旧的缓存项。

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

如果 EHCache 像那样工作,我会认为它从根本上被破坏了,因为它是线程安全的!

于 2010-04-01T10:40:46.630 回答
3

您可以简单地将新列表存储在缓存中。下一次调用 get 将返回它。

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

List workingCopy = new ArrayList ((List)cache.get(key));
... modify list ...
cache.put (key, workingCopy);
于 2010-04-01T10:40:56.880 回答