gpt4 book ai didi

java - Hazelcast ILock 在更新锁范围内的映射时无法在集群中工作

转载 作者:行者123 更新时间:2023-12-02 10:19:50 25 4
gpt4 key购买 nike

我有一个有 2 个节点(即 2 个 JVM)的集群环境。我正在尝试检查 Hazelcast ILock 内的 Hazelcast IMap 是否存在 key ,如下所示:解决方案1:

public static final String CUR_ACC_MAP = "CUR_ACC_MAP";
private static final HazelcastInstance hazelInstance = Hazelcast.getHazelcastInstanceByName("accountCache");

public static boolean currencyAccountCreationInPorgress(String key) {
ILock lock = hazelInstance.getLock(CUR_ACC_MAP);
lock.lock();
try {
IMap<Object, Object> map = hazelInstance.getMap(CUR_ACC_MAP);
if (!map.containsKey(key)) {
map.putIfAbsent(key, System.currentTimeMillis());
return false;
}
return true;
} finally {
lock.unlock();
}
}

但问题是,当在2个节点中同时调用请求时,两个节点都会进入if条件[if (!map.containsKey(key)) { ... }]。因此,集群中的两个节点都从上述方法返回 false。我在做什么吗?

我最初尝试了以下代码,但也不起作用,因此我切换到上面的解决方案 1,但这也不起作用。

解决方案 2:

public static final String CUR_ACC_MAP = "CUR_ACC_MAP";
private static final HazelcastInstance hazelInstance = Hazelcast.getHazelcastInstanceByName("accountCache");

public static boolean currencyAccountCreationInPorgress(String key) {
IMap<Object, Object> map = hazelInstance.getMap(CUR_ACC_MAP);
map.lock(CUR_ACC_MAP);
try {
if (!map.containsKey(key)) {
map.putIfAbsent(key, System.currentTimeMillis());
return false;
}
return true;
} finally {
map.unlock(CUR_ACC_MAP);
}
}

这是我的 Hazelcast 配置:

    <hz:hazelcast id="hzInstance">
<hz:config>
<hz:instance-name>accountCache</hz:instance-name>
<hz:group name="hzAcc" password="Vam123" />
<hz:network port="${account.hazelcast.port}" port-auto-increment="true">
<hz:join>
<hz:multicast enabled="false" />
<hz:tcp-ip enabled="${account.hazelcast.join.tcpip.enabled}">
<hz:members>${account.hazelcast.members}</hz:members>
</hz:tcp-ip>
</hz:join>
</hz:network>

<!-- Account File Upload Concurrent Processing Maps -->
<hz:map name="CUR_ACC_MAP" max-idle-seconds="60" eviction-policy="LRU" max-size="100000" />

最佳答案

@拉吉布,

  • 在解决方案 2 中,尝试改用 map.lock(key),即使没有要锁定的 key ,它也应该可以工作。
  • 在解决方案 1 中,如果您的两个成员都属于同一个 Hazelcast 集群,则只有其中一个成员应访问 if block ,而不是两者都访问。
  • 更好的解决方案,没有锁,是这样的:
public static boolean currencyAccountCreationInPorgress(String key) {
return hazelInstance.getMap(CUR_ACC_MAP).putIfAbsent(key, System.currentTimeMillis()) != null;
}

putIfAbsent 操作是原子操作,因此只能成功完成一次,所有其他请求将仅返回先前的值,因此您的方法将仅返回 true。

关于java - Hazelcast ILock 在更新锁范围内的映射时无法在集群中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54416184/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com