1

我了解 NearCache 仅在对 IMap 上的该键执行第一次获取操作后才加载。但我很想知道是否有任何方法可以触发 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");
4

1 回答 1

2

正如您所说,Near Cache 在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 版本,因为我们还对预加载器代码进行了一些其他改进。

于 2017-01-04T15:18:04.440 回答