仅当值value.status为'XXX'时更新区域中的值

时间:2018-09-06 11:50:13

标签: gemfire spring-data-gemfire

我们正在尝试在工作中使用Gemfire。我们有一个存储每个进入的请求的区域,它遍历生命周期(例如,状态为A-> B-> C-> D)

但是我们也有一个要求,只有当当前状态为B时,才需要将状态更新为C(因为状态D正在通过其他进程更新为Async)。我们过去仅通过使用IF关键字在cassandra中实现它。在Gemfire中寻找相似的东西。显然,我们不能执行读取,检查状态和更新操作,因为它不是原子操作。

其他选择是通过分配分散的锁来执行此操作,然后如上所述执行检查更新。但是此选项会带来性能开销。

我们还考虑附加一个CacheWriter并检查beforeUpdate(..)中的状态。但后来知道我们作为beforeUpdate的参数得到的是值的副本,而不是实际值。

有人知道我们可以尝试以原子方式实现它吗?

1 个答案:

答案 0 :(得分:0)

您正在寻找的是Region.replace(key, oldValue, newValue)。这是一个原子操作。

更新:我还应该澄清一下,当前无法检查映射对象值的某些属性(例如someObject.state = XYZ)以确定是否执行更新/替换。为此,您将需要正确实施的Object.equals()方法。