在 Hazelcast 5.0 版中,Cache 和 Map 之间的正式区别是什么?

What is the formal difference between a Cache and Map in version 5.0 of Hazelcast?

第一次在一套web API中实现Hazelcast时,Map和Cache的使用不一致

例如,使用 SpringCacheManager 创建缓存会导致创建映射

var sCache = springCacheManager.getCache("testCache");
sCache.putIfAbsent("test", "test2");

但是,使用 CachingProvider CacheManager 创建缓存会导致创建必须打开和关闭的实际缓存(根据文档)

try (var cache = Caching.getCachingProvider().getCacheManager(null, null,
            HazelcastCachingProvider.propertiesByInstanceName("hazelcache")).createCache("actualCache", config)) {
        cache.putIfAbsent("test", "test");
    }

另一个例子,使用@Cacheable 注释将创建一个地图,即使文档概述了缓存的用法。以下代码将使用 hazelcast 中的 Map 成功 return 第一个计算值。从不使用缓存。

@Cacheable(value = "counter")
public Boolean test(Integer addTo) {
    counter += addTo;
    return counter % 2 != 0;
}

在 Hazelcast 中是否有缓存与映射的正式定义?两者都可用于同一目的吗?

下图包含一个测试 Hazelcast 管理中心的视图,其中显示了上述组件,即映射和缓存。这些都是由同一个客户端生成的。

测试

这里有CacheSpringCacheMap可以考虑.

对于 Cache,Hazelcast 是 Java 缓存标准 JSR107 的实施提供者。 这些在管理中心上显示为“Cache”,如果您 运行 hazelcastInstance.getDistributedObjects() 它们将是 ICache 类型。它在 Hazelcast 文档中 here.

对于Map,Hazelcast 提供了一种数据结构IMap,它主要是java.util.Map 的超集。这些在管理中心显示为“Map”。

Spring也提供了缓存,对于JSR107或者直接用Hazelcast可以设置CacheType,或者允许Spring来pick。当 Spring 直接使用 Hazelcast 时,它将使用 IMap 而不是 ICache 进行存储。

如果您选择 JCache 或配置 Spring 以使用 JCache,那么您将获得符合标准的行为。你有缓存,并且可以轻松地将缓存提供程序从 Hazelcast 交换到其他你想要的东西。

Map 为您提供 executeOnKey 等操作,以在原位更新一个或多个条目。如果条目是一个复合对象,但有一小部分发生了变化,这可能是一种比发送整个值更有效的更新方式。