如何触发Hazelcast NearCache的预加载?

时间:2017-01-04 12:46:23

标签: hazelcast hazelcast-imap

据我所知,只有在对IMap上的该键执行第一次get操作后才会加载NearCache。但我有兴趣知道是否有任何方法可以触发NearCache的预加载以及其群集中的所有条目。

使用案例
键是一个简单的bean对象,值是包含大量条目的TIntHashMap类型的DAO对象。

尺寸:
值对象的大小范围从0.1MB到24MB(并且> 90%的条目小于5MB)。 IMap中的条目数量范围为150-250。

基准
第一次调用get操作需要2-3秒,之后调用时间<10 ms。

现在我创建了以下例程,它读取IMap并读取每个条目以刷新NearCache。

long startTime = System.currentTimeMillis();

IMap<Object, Object> map = client.getMap("utility-cache");

log.info("Connected to the Cache cluster. Starting the NearCache refresh.");

int i = 0;
for (Object key : map.keySet()) {
    Object value = map.get(key);

    if(log.isTraceEnabled()){
        SizeOf sizeOfKey = new SizeOf(key);
        SizeOf sizeOfValue = new SizeOf(value);
        log.info(String.format("Size of %s Key(%s) Object = %s MB - Size of %s Value Object = %s MB", key.getClass().getSimpleName(), key.toString(),
                sizeOfKey.sizeInMB(), value.getClass().getSimpleName(), sizeOfValue.sizeInMB()));
    }

    i++;
}

log.info("Refreshed NearCache with " + i + " Entries in " + (System.currentTimeMillis() - startTime) + " ms");

1 个答案:

答案 0 :(得分:1)

正如您所说,在get()IMap数据结构上的JCache次呼叫中会填充近缓存。目前没有系统可以自动预加载任何数据。

为了提高效率,您可以使用getAll()批量获取数据。这应该可以提高您自己的预加载功能的性能。您可以更改批量大小,直到找到最适合您的用例。

使用Hazelcast 3.8会有一个Near Cache预加载器功能,它会将密钥存储在磁盘上的Near Cache中。重新启动Hazelcast客户端时,将预先提取先前的数据集,以尽快重新填充Near Cache中的先前热数据集(仅存储密钥,再次从群集中获取数据)。所以这对第一次部署没有帮助,但对于所有后续重启都没有用。也许这已经是你要找的了?

您可以在3.8-EA或最近的3.8-SNAPSHOT版本中测试该功能。可以在此处找到配置文档:http://docs.hazelcast.org/docs/latest-dev/manual/html-single/index.html#configuring-near-cache

请注意,我们在EA和实际SNAPSHOT之间将配置参数从file-name更改为filename。我推荐使用SNAPSHOT版本,因为我们还在预加载器代码中进行了一些其他改进。