2.5. 异步复制
所有集群的缓存模式都可配置为使用与 <replicated-cache /> 中的 < replicated-cache/> 的异步通信,或 & lt; invalidation-cache/> 元素。
使用异步通信时,原始器节点不会接收来自操作状态的其他节点,因此无法检查它是否在其他节点上成功。
我们一般不推荐使用异步通信,因为它们可能会导致数据不一致,因此原因就困难。然而,有时速度比一致性更为重要,因此对于这些情况,可以选择。
异步 API
一个异步 API 允许您使用同步通信,但不阻止用户线程。
有一个注意事项:异步操作不会保留程序顺序。如果线程调用 cache.putAsync (k, v1); cache.putAsync (k, v2),则 k 的最终值可以是 v1 或 v2。与使用异步通信相比,其优势在于最终的值不能在一个节点和 v2 上处于 v1 上。
2.5.1. 使用异步复制返回值 复制链接链接已复制到粘贴板!
由于 Cache 接口扩展了 java.util.Map,因此默认情况下,put (key, value) 和 remove (key) 等写入方法返回上一个值。
在某些情况下,返回值可能不正确:
-
将
AdvancedCache.withFlags ()与Flag.IGNORE_RETURN_VALUE,Flag.SKIP_REMOTE_LOOKUP或Flag.SKIP_CACHE_LOAD. -
当缓存配置了 Not
return-values="true"时。 - 使用异步通信时。
- 当对同一密钥进行多个并发写入时,缓存拓扑会改变。拓扑更改将使 Data Grid 重试写入操作,并且重试操作的返回值并不可靠。
事务缓存在 3 和 4 中返回正确的之前值。但是,事务缓存也具有 getcha:在分布式模式下,读写的隔离级别被实施为可重复读取。这意味着"ouble-checked locking"示例无法正常工作:
实现这一点的正确方法是使用 cache.getAdvancedCache ().withFlags (Flag.FORCE_WRITE_LOCK).get (k)。
在使用 optimistic 锁定缓存中,写入也可能会返回过时的值。写入 skew 检查可以避免过时的值。