- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们正在尝试找出在不使用悲观锁定的情况下使用 Hazelcast 的 IMap 的最佳方法。
EntryProcessor 似乎是正确的选择,但是我们需要应用两种不同类型的操作:当 containsKey 为 false 时“创建”,以及当 containsKey 为 true 时“更新”。
如何利用 EntryProcessor 来支持这些逻辑检查?
如果两个线程同时命中 containsKey() 并且它返回 false 给它们,我不希望它们都创建 key 。我希望第二个线程应用更新。
这是我们目前所拥有的:
public void put(String key, Object value) {
IMap<String, Object> map = getMap();
if (!map.containsKey(key)) {
// create key here
} else {
// update existing value here
// ...
map.executeOnKey(key, new TransactionEntryProcessor({my_new_value}));
}
}
private static class MyEntryProcessor implements
EntryProcessor<String, Object>, EntryBackupProcessor<String, Object>, Serializable {
private static final long serialVersionUID = // blah blah
private static final ThreadLocal<Object> entryToSet = new ThreadLocal<>();
MyEntryProcessor(Object entryToSet) {
MyEntryProcessor.entryToSet.set(entryToSet);
}
@Override
public Object process(Map.Entry<String, Object> entry) {
entry.setValue(entryToSet.get());
return entry.getValue();
}
@Override
public EntryBackupProcessor<String, Object> getBackupProcessor() {
return MyEntryProcessor.this;
}
@Override
public void processBackup(Map.Entry<String, Object> entry) {
entry.setValue(entryToSet.get());
}
}
可以看到两个线程可以同时进入put方法并调用containsKey。第二个将覆盖第一个的结果。
最佳答案
EntryProcessor 根据定义是在条目本身上执行的处理逻辑,消除了序列化/反序列化值的需要。在内部,EP 由分区线程执行,其中一个分区线程负责多个分区。当EP到达HC时,它被 key 所属分区的所有者线程挑选。一旦处理完成,分区线程就准备好接受并执行其他任务(很可能是由另一个线程提交的相同键的相同 EP)。因此,看起来似乎如此,但 EP 不应该用作悲观锁定的替代品。
如果您坚持并真正热衷于使用 EP 来实现此目的,那么您可以尝试在 process 方法中放置 null 检查。像这样的事情:
public Object process(Map.Entry<String, Object> entry) {
if(null == entry.getValue()) {
entry.setValue("value123");
}
return entry.getValue();
}
这样会发生两件事:1.另一个线程将等待分区线程再次可用2. 由于该值已经存在,因此您不会覆盖任何内容
关于java - Hazelcast EntryProcessor 的正确使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45237493/
我注意到 EntryProcessor 接口(interface)实现了 Serializable。我在 map 中有一个值,我想使用 executeOnKey 方法更新它,但出于显而易见的原因,我宁
我注意到 EntryProcessor 接口(interface)实现了 Serializable。我在 map 中有一个值,我想使用 executeOnKey 方法更新它,但出于显而易见的原因,我宁
我正在使用 hazelcast 缓存版本 3.11.2 来存储和操作 IMap 中的值。 对于 IMap 操作,我使用从 AbstractEntryProcessor 扩展的 EntryProcess
我们正在尝试找出在不使用悲观锁定的情况下使用 Hazelcast 的 IMap 的最佳方法。 EntryProcessor 似乎是正确的选择,但是我们需要应用两种不同类型的操作:当 containsK
我正在尝试实现使用 Coherence transient 缓存的业务功能。 我计划依赖的功能之一是在将项目放入缓存时提供(可配置的)生存时间时自动逐出缓存条目。 NamedCache 接口(inte
我使用的是 Hazelcast IMap,我在其中使用 EntryProcessor 更新了很多值。与此同时,其他线程也在调用get()。如果可能的话,我想避免所有不必要的反序列化。但似乎即使在使用单
我需要在 EntryProcessor.process 方法中获取当前的 hazelcast 实例。 我需要在 process 方法中向主题发送消息。 如何获取实例? 问候 最佳答案 您可以通过在 E
HZ版本:3.5.3 我在 IMap.unlock(key) 中遇到性能问题大约需要 4-5 秒才能完成执行。场景如下: 我有一个员工列表 IMap哪些商店companyId对照员工列表 ( Arra
我正在尝试使用 EntryProcessor 为我们的应用程序设置 Hazelcast 的代码。为了分析为什么 EntryProcessor 的代码在我们的应用程序中不起作用,我尝试在本地计算机上设置
我是一名优秀的程序员,十分优秀!