如何触发Hazelcast NearCache的预加载?

How to trigger the pre-load of Hazelcast NearCache?

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

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

尺码:
值对象的大小范围从 0.1MB 到 24MB(>90% 的条目小于 5MB)。 IMap中条目数在150-250之间。

基准:
第一次调用 get 操作需要 2-3 秒,之后的调用需要 <10 毫秒。

现在我已经创建了以下例程,它读取 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");

如您所说,近缓存在 get() 调用 IMapJCache 数据结构时填充。目前没有系统自动预加载任何数据。

为了提高效率,您可以使用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 版本,因为我们还对预加载器代码进行了一些其他改进。