我们正在尝试在工作中使用Gemfire。我们有一个存储每个进入的请求的区域,它遍历生命周期(例如,状态为A-> B-> C-> D)
但是我们也有一个要求,只有当当前状态为B时,才需要将状态更新为C(因为状态D正在通过其他进程更新为Async)。我们过去仅通过使用IF关键字在cassandra中实现它。在Gemfire中寻找相似的东西。显然,我们不能执行读取,检查状态和更新操作,因为它不是原子操作。
其他选择是通过分配分散的锁来执行此操作,然后如上所述执行检查更新。但是此选项会带来性能开销。
我们还考虑附加一个CacheWriter并检查beforeUpdate(..)中的状态。但后来知道我们作为beforeUpdate的参数得到的是值的副本,而不是实际值。
有人知道我们可以尝试以原子方式实现它吗?
答案 0 :(得分:0)
您正在寻找的是Region.replace(key, oldValue, newValue)。这是一个原子操作。
更新:我还应该澄清一下,当前无法检查映射对象值的某些属性(例如someObject.state = XYZ)以确定是否执行更新/替换。为此,您将需要正确实施的Object.equals()
方法。