我如何判断Hazelcast';s IMap.putIfAbsent()有效吗?
我需要将一个密钥放入Hazelcast映射,如果该密钥已经存在于映射中,则抛出一个错误。这必须以原子的方式完成,因此先测试密钥是否存在,然后在单独的操作中执行put将不起作用 问题是:判断putIfAbsent()是否实际放置任何内容的唯一方法是测试返回的对象是新对象还是现有对象。但是Hazelcast不返回现有的;它返回它的一个克隆。因此,如果(old==new)进行测试,则不能执行我如何判断Hazelcast';s IMap.putIfAbsent()有效吗?,hazelcast,Hazelcast,我需要将一个密钥放入Hazelcast映射,如果该密钥已经存在于映射中,则抛出一个错误。这必须以原子的方式完成,因此先测试密钥是否存在,然后在单独的操作中执行put将不起作用 问题是:判断putIfAbsent()是否实际放置任何内容的唯一方法是测试返回的对象是新对象还是现有对象。但是Hazelcast不返回现有的;它返回它的一个克隆。因此,如果(old==new)进行测试,则不能执行。如果(old.equals(new)),则必须执行。问题是我的对象很大而且很复杂,实现自定义的.equals(
。如果(old.equals(new))
,则必须执行。问题是我的对象很大而且很复杂,实现自定义的.equals()方法并不容易
当然有更好的方法来做到这一点。Hazelcast是否有不同的方法来执行原子putIfAbsent()
编辑:
我在IMap.replace()中遇到了类似的问题。为了提供新旧值,我必须克隆旧值,修改它,调用replace(),并确保我的值上有一个equals()方法来进行比较。一定有更好的办法。如果Hazelcast能给我一个映射中某个对象的版本号或时间戳,这样我就可以比较并设置版本号或时间戳,而不必处理复杂对象的每个字段,那就太好了。也许你可以试试EntryProcessor
map.executeOnKey(key,putifabsentryprocessor(value))
您需要自行实现此PutiFabsentryProcessor,当原始值(您可以在EntryProcessor中访问该值)为空或不为空时,它将返回true