如何触发Hazelcast NearCache的预加载?

如何触发Hazelcast NearCache的预加载?,hazelcast,hazelcast-imap,Hazelcast,Hazelcast Imap,我知道只有在IMap上对该键执行第一次get操作后,才会加载NearCache。但是我很想知道是否有任何方法可以触发预加载NearCache及其集群中的所有条目 用例: 键是一个简单的bean对象,值是一个TIntHashMap类型的DAO对象,包含很多条目 大小: 值对象的大小范围为0.1MB到24MB(并且>90%的条目小于5MB)。IMap中的条目数范围为150-250 基准: 第一次调用get操作需要2-3秒,之后的调用需要正如您所说,在get()调用IMap或JCache数据结构时,会

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

用例
键是一个简单的bean对象,值是一个TIntHashMap类型的DAO对象,包含很多条目

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

基准

第一次调用get操作需要2-3秒,之后的调用需要正如您所说,在
get()
调用
IMap
JCache
数据结构时,会填充近缓存。目前还没有自动预加载任何数据的系统

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

Hazelcast 3.8将提供近缓存预加载功能,将密钥存储在磁盘上的近缓存中。重新启动Hazelcast客户端时,将预取以前的数据集,以尽可能快地在近缓存中重新填充以前的热数据集(仅存储密钥,从集群中再次获取数据)。因此,这对第一次部署没有帮助,但对所有后续重启都有帮助。也许这已经是你想要的了

您可以在3.8-EA或最新的3.8-SNAPSHOT版本中测试该功能。有关配置的文档可在此处找到:


请注意,我们将EA和实际快照之间的配置参数从
文件名
更改为
文件名
。我推荐快照版本,因为我们还对预加载程序代码进行了一些其他改进。

谢谢。这就是我一直在寻找的功能。但为什么只预取键并从集群中提取值呢?在我们的应用程序中,我们将客户机实例存储为单例,因此我们只连接一次,并在将来的所有连接中重用。此功能对我们的用例有帮助吗?此功能旨在在您必须重新启动应用程序时,尽快用以前的数据重新填充近缓存。同时,数据可以更改。为了防止过时的数据,我们只存储密钥。正如我所说的,这是有史以来第一次,人口增长毫无作用。这意味着在重新启动后再次填充近缓存。好的,明白了。非常感谢。目前,我们仍在生产3.6.2,因此,一旦3.8稳定,我将向我们的管理层提出建议。
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");