【问题标题】:How to make putAll atomic?如何使 putAll 原子化?
【发布时间】:2018-08-06 17:31:54
【问题描述】:

我正在使用 infinispan 7.2.5 版本进行内存缓存。要访问我正在使用 Hotrod 的缓存。所以我让 hotrod 服务器在集群模式下运行,并且多个客户端可以使用 hotrod 客户端访问服务器。

我正在执行 putAll 操作以将数据放入缓存。现在我有一个要求,我们希望将所有内容或任何内容都放入缓存中,所以我的意思是 putAll 应该能够将所有数据放入缓存中,或者如果失败,则不应将任何内容添加到缓存中。我正在查看 infinispan 的文档以检查 putAll 是否是原子的,但根据文档它不是。

所以我的问题是:

  • 如何使 putAllll 原子化以实现需求?

我也在考虑让 transactionMode 缓存,但不确定它是否可以解决我的问题而不影响性能?

这里的任何建议将不胜感激。

【问题讨论】:

  • ""我也在考虑让 transactionMode 缓存,但不确定它是否可以在不影响性能的情况下解决我的问题? 软件开发中的一切都涉及权衡。如果你想要一个原子的putAll(),你必须决定使用事务的性能影响是否比原子性更重要。没有免费的午餐。
  • 谢谢@JimGarrison 明白了你的意思,你能给我示例代码链接或一些文档如何实现它作为参考,因为我对此不太了解。
  • 不,这不是 StackOverflow 的工作方式。您应该进行研究和学习。要求示例代码或外部链接显然是题外话。请访问help center 并阅读How to Ask。研究手册,编写一些代码,然后问一个具体的问题是否有异常行为。
  • 好的,我会尝试这部分...但是除了 transactionMode 缓存之外,我们还有其他方法来实现 atomic put 吗?
  • 不,没有其他方法:事务确保多个操作对其他操作/参与者显示为一个。正如@JimGarrison 所说,你不能得到免费的午餐。

标签: java transactions infinispan hot-rod


【解决方案1】:

Infinispan 不支持 Hot Rod(*) 上的事务,并且 putAll 不是原子的。在非事务嵌入模式下也不是原子的。

最好的解决方法是运行事务,并从 script execution 手动启动事务。

(*) 服务器端支持已经存在,但客户端尚未实现。客户端实现在 9.3 或 9.4 的路线图上(可能会发生变化)。

【讨论】:

  • 适用于infinispan 7.2.5.Final版本吗?
  • 你知道 putAll 是否等待将所有数据插入缓存,因为我得到的尺寸小于我们放入的尺寸......几毫秒后我得到了实际尺寸。
  • 7.2 支持脚本。 PutAll 是一个同步操作,只要缓存是同步的,直到所有条目都存储(在所有所有者上)它才会返回。处理 size() 的方式发生了变化,我不记得它是否会落后于 7.2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-17
相关资源
最近更新 更多