【问题标题】:Hazelcast Near Cache not working with simple exampleHazelcast Near Cache 不适用于简单示例
【发布时间】:2019-01-24 06:10:02
【问题描述】:

我目前正在使用 hazelcast 版本 3.9

我尝试了几种方法来实现近缓存,但似乎我无法找到正确的方法。下面我分享了我的代码,让我确切地知道我哪里出错了。

    public class NearCacheExample {

    public static void main(String[] args) throws IOException 
    {
        HazelcastConfig hzConfig = new HazelcastConfig();

        HazelcastInstance hzInstance = hzConfig.getHZInstance();

        IMap<Double, String> nearCacheMap = hzInstance.getMap("cacheExample");

        for (int i = 0; i < 100000; i++) {
            nearCacheMap.set(Math.random(), i + "");
        }

        long startTime = System.currentTimeMillis();

        System.out.println("---------------------------Before Sort----------------------------------");

        for (Entry<Double, String> entrySet : nearCacheMap.entrySet()) {

            Double key = entrySet.getKey();
            String value = entrySet.getValue();

        }

        long endTime = System.currentTimeMillis();

        System.out.println("------------------------------------------------Read Both---------------------------------------------------");

        NearCacheStats nearCacheStatistics = nearCacheMap.getLocalMapStats().getNearCacheStats();

        System.out.println( "Near Cache hit/miss ratio 3= "
                + nearCacheStatistics.getHits());

        System.out.println("Near cache implemented or not " + nearCacheMap.getLocalMapStats().getNearCacheStats().getOwnedEntryCount());

        System.out.println(" EndTime timeDifference : " + startTime + " " + endTime + " " +(endTime-startTime));

    }
}

我在检查 NearCache 统计信息时得到的输出完全为 0。

HazelcastConfig.java 文件

public class HazelcastConfig 
{

    public HazelcastInstance getHZInstance() throws IOException
    {
        ClientConfig cfg = new XmlClientConfigBuilder("src/main/resources/hazelcast-client.xml").build();

        return HazelcastClient.newHazelcastClient(cfg);
    }
}

Hazelcast 客户端的配置

<near-cache name="default">
<in-memory-format>BINARY</in-memory-format>
<invalidate-on-change>true</invalidate-on-change>
<eviction eviction-policy="NONE" max-size-policy="ENTRY_COUNT" size="10"/>

我也尝试在 hazelcast-client.xml 文件中更改缓存名称。似乎没有任何效果

在 hazelcast 服务器端没有变化。

【问题讨论】:

标签: java hazelcast hazelcast-imap near-cache


【解决方案1】:

@Tatkal

  1. map.set 使附近的缓存无效,不要将新值放在那里
  2. Near Cache 仅用于基于键的访问,您的循环根本不会触及 Near Cache。您需要像这样更改循环中的第二行:String value = nearCacheMap.get(entrySet.getKey()); 或将循环更改为 keySet,如
        for (Double key : nearCacheMap.keySet()) {
            String value = entrySet.getValue(key);
        }
  1. 即使在更改之后,您仍然会看到 0,因为您只执行了 1 次获取操作,这是缓存未命中。如果您多次重复循环和统计信息打印,您会看到:
---------------------------Before Sort----------------------------------
------------------------------------------------Read Both---------------------------------------------------
Near Cache hit/miss ratio = 0 / 100000
Near cache implemented or not 10
 EndTime timeDifference : 1548313357643 1548313362527 4884
------------------------------------------------Read Both---------------------------------------------------
Near Cache hit/miss ratio = 10 / 199990
Near cache implemented or not 10
 EndTime timeDifference : 1548313357643 1548313367155 9512
------------------------------------------------Read Both---------------------------------------------------
Near Cache hit/miss ratio = 20 / 299980
Near cache implemented or not 10
 EndTime timeDifference : 1548313357643 1548313371688 14045

【讨论】:

  • 我想你的意思是:String value = nearCacheMap.get(entrySet.getKey());
  • 或更简化:for(Double key : nearCacheMap.keySet()) { String value = nearCacheMap.get(key); };
  • @OzanKılıç 是的,没错,我把它改成了 keySet,因为它更便宜
  • @GokhanOner 谢谢你的回复....我忘了接受你的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多