3.5. 带有集群缓存的异步通信
3.5.1. 异步通信 复制链接链接已复制到粘贴板!
所有集群缓存模式都可以配置为在 < replicated-cache/>、< 使用与 distributed-cache> 或 < invalidation-cache/& gt; 元素中mode="ASYNC" 属性的异步通信。
使用异步通信时,原始器节点不会从其他节点接收有关操作状态的任何确认,因此无法检查它是否在其他节点上成功。
我们不推荐异步通信,因为它们可能会导致数据不一致,因此结果很难考虑。然而,有时速度比一致性更重要,而对于这些情况,可以使用 选项。
3.5.2. Asynchronous API 复制链接链接已复制到粘贴板!
Asynchronous API 允许您使用同步通信,但不阻止用户线程。
有一个注意事项:异步操作不会保留程序顺序。如果线程调用 cache.putAsync (k, v1); cache.putAsync (k, v2),则最终值 k 可以是 v1 或 v2。与使用异步通信相比,最终的值不能是一个节点上的 v1,另一个节点上的 v2。
3.5.3. 返回异步通信中的值 复制链接链接已复制到粘贴板!
由于 Cache 接口扩展 java.util.Map,因此 放置(密钥、值) 和 remove (key) 等写入方法默认返回前面的值。
在某些情况下,返回值可能不正确:
-
使用带有、Flag.IGNORE_RETURN_VALUEFlag.SKIP_REMOTE_LOOKUP或Flag.SKIP_CACHE_LOAD. -
当缓存配置有
unreliable-return-values="true"时。 - 使用异步通信时。
- 当有多个并发写入同一密钥时,缓存拓扑会改变。拓扑更改将使数据网格重试写操作,重试操作的返回值不是可靠的。
事务缓存在 3 和 4 时返回正确的之前值。但是,事务缓存在分布式模式中也有一个 getcha:,则 read-committed 隔离级别也以可重复读取的形式实施。这意味着 "double-checked locking" 示例无法正常工作:
实施此操作的正确方法是使用 cache.getAdvancedCache ().withFlags (Flag.FORCE_WRITE_LOCK).get (k)。
在具有最佳锁定的缓存中,写入也可以返回过时的值。写入偏移检查可能会避免过时的值。