代码之家  ›  专栏  ›  技术社区  ›  Jacques René Mesrine

对ehcache的原子写入

  •  1
  • Jacques René Mesrine  · 技术社区  · 15 年前

    语境

    我正在ehcache中存储java.util.list。

    Key(String) --> List<UserDetail>
    

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

    问题

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

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

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

    2 回复  |  直到 15 年前
        1
  •  4
  •   user7094    15 年前

    我看不出有什么问题。一旦替换了缓存项,客户机将提取该新缓存项。直到那一点,他们将拉旧的缓存项目。

    永远不应该有返回空缓存项的时间,除非您实际从缓存中移除该项,然后替换它。

    如果ehcache是这样工作的,我会认为它已经从根本上崩溃了,因为它本来就是线程安全的!

        2
  •  3
  •   Aaron Digulla    15 年前

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

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

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