插入新值后是否可以从地图中获取旧值?

时间:2018-07-03 22:34:39

标签: java hazelcast consistency distributed-caching hazelcast-imap

我有hazelcast群集,其中包含4个节点。设置如下:

<hazelcast>
    ...
    <map name="default">
        <backup-count>1</backup-count>

        <async-backup-count>0</async-backup-count>

        <time-to-live-seconds>0</time-to-live-seconds>

        <eviction-policy>LRU</eviction-policy>

        <max-size policy="cluster_wide_map_size">5000</max-size>
    </map>
</hazelcast>

最重要的部分是同步备份

我正在这样使用hazelcast iMap

IMap<String, Object> map = getClient().getMap("default");
map.putAsync("key1", "1").get(1000, TimeUnit.MILLISECONDS);

//
String firstGet = map.getAsync("key1").get(1000, TimeUnit.MILLISECONDS);
map.putAsync("key1", firstGet + "2").get(1000, TimeUnit.MILLISECONDS);

// 
String secondGet = map.getAsync("key1").get(1000, TimeUnit.MILLISECONDS);
map.putAsync("key1", secondGet + "3").get(1000, TimeUnit.MILLISECONDS);

// 
String thirdGet = map.getAsync("key1").get(1000, TimeUnit.MILLISECONDS);

我希望 thirdGet 等于“ 123” 。但是我很少得到“ 13” 。看来,我的第二次更新在某些情况下丢失了。但我在日志中看不到任何错误。

重要的是,当系统具有最大数量的请求时,将出现此错误。

我考虑过将缓存逐出。但是在那种情况下,我会丢失整个密钥。但是我只丢失了第二次更新。

我也知道,Hazelcast是AP产品。但是我有同步复制。

1 个答案:

答案 0 :(得分:0)

您的代码实际上是理解异步代码的一个很好的例子:),因为您经历过异步调用并不能保证它们在提交后立即返回,所以您可能会丢失订单。您当前正在执行的操作是提交异步操作,等待最多1000ms的时间完成计算,然后检索其结果(如果有)。有些可以在几毫秒内返回,而另一些则不能在1000毫秒内返回。您只是得到一个Future对象,然后等待并说您将只等待1000毫秒即可完成它。

您需要使用同步操作(map.put,map.get等)来确保它们在返回时已完成。您使用的IMap备份设置与此无关,它定义了以异步/同步模式创建备份副本。请参阅:http://docs.hazelcast.org/docs/3.10.2/manual/html-single/index.html#backing-up-maps