【问题标题】:Infinispan invalidation cache invalidates on new keyInfinispan 失效缓存在新密钥上失效
【发布时间】:2022-01-19 04:02:46
【问题描述】:

我们有两个主动/主动节点 Wildfly 19 集群配置,带有 infinispan (v 9.4.18) 失效缓存。

<invalidation-cache name="opencell-tenant-cache">
    <transaction locking="OPTIMISTIC" mode="NONE"/>
</invalidation-cache>

根据 infinispan 文档,当节点 1 上的缓存值更改时,会从节点 1 向节点 2 发送 InvalidateCommand,从而使节点 2 缓存中的键条目无效/删除。

我注意到 InvalidateCommand 甚至在一个新的键上发送。

在我们的应用程序中,如果在缓存中找不到键,则会从数据库中加载一个值并放入缓存中。由于两台服务器都处于活动状态,我得到以下永无止境的场景:

对节点 1 的请求 > 在节点 1 缓存上找不到密钥 > 值从数据库加载并放入节点 1 缓存 > 密钥在节点 2 上失效
对节点 2 的请求 > 在节点 2 缓存上找不到密钥 > 从数据库加载值并放入节点 2 缓存 > 节点 1 上的密钥无效
对节点 1 的请求 > 在节点 1 缓存中找不到密钥 > 从数据库加载值并放入节点 1 缓存 > 节点 2 上的密钥无效
等等。

在这种情况下,我会不断地使缓存失效,即使数据从未更改过。 我希望在新密钥放置时不会发送无效命令。

否则失效缓存有什么实际用途,如果在接收到失效命令后放入相同的key会再次触发失效。

谢谢

【问题讨论】:

    标签: infinispan cache-invalidation


    【解决方案1】:

    I would expect that no invalidation command is send on new key put. 什么是新看跌期权?

    Request to Node 2 &gt; Key not found on Node2 cache

    如果您配置ClusterLoader,节点 2 可以从节点 2 获取密钥。见Invalidation Cache Mode Documentation

    如果失效不适合您的数据访问,请查看其他缓存模式(如复制/分布式)。

    【讨论】:

    • 似乎在将新密钥放入失效缓存时需要使用 Cache.putForExternalRead() ,因此不会触发其他节点上的失效。我希望 infinispan 本身会执行这样的逻辑:
       If (cache.containsKey(A){ cache.put(A,B); // 发送无效 } else { cache.putForExternalRead(A,B); //不发送失效 } 
      但是 JPA 使用失效缓存作为实体 L2 缓存。即使我没有更改数据库中的任何数据(所有读取操作),每次我更改服务器时,我都会看到服务器之间的失效请求。跨度>
    • > 我希望 infinispan 本身会执行这样的逻辑:
       If > (cache.containsKey(A){ cache.put(A,B); // 发送无效 } else { > cache.putForExternalRead(A,B); // 不发送失效 } 
      这比仅仅在每个 put 上失效更昂贵,因为 containsKey(...) 需要被广播,并且,如果是事务性的,原子的。
    猜你喜欢
    • 2021-02-18
    • 2018-12-28
    • 2015-04-29
    • 2011-08-29
    • 2015-07-21
    • 2017-09-08
    • 2014-08-03
    • 2017-12-20
    • 1970-01-01
    相关资源
    最近更新 更多