如何在Springboot + Hzelcast缓存中使用ReplicatedMap而不是Map

时间:2019-07-25 06:30:13

标签: spring-boot caching hazelcast

我正在使用springboot缓存抽象和hazelcast作为cacahe中间件。当使用批注@Cacheable时,我从HazelcastCacheManager#getCache方法中发现hazelcast默认使用Map作为数据结构,并且我想在继续使用@Cacheable进行缓存的同时将ReplicatedMap作为缓存的数据结构。我该怎么办?

我使用maven来介绍相关的依赖项:

<dependency>
  <groupId>com.hazelcast</groupId>
  <artifactId>hazelcast</artifactId>
</dependency>
<dependency>
  <groupId>com.hazelcast</groupId>
  <artifactId>hazelcast-spring</artifactId>
</dependency>

我看到的代码:

package com.hazelcast.spring.cache;

HazelcastCacheManager#getCache

    @Override
    public Cache getCache(String name) {
        Cache cache = caches.get(name);
        if (cache == null) {
            IMap<Object, Object> map = hazelcastInstance.getMap(name);
            cache = new HazelcastCache(map);
            long cacheTimeout = calculateCacheReadTimeout(name);
            ((HazelcastCache) cache).setReadTimeout(cacheTimeout);
            Cache currentCache = caches.putIfAbsent(name, cache);
            if (currentCache != null) {
                cache = currentCache;
            }
        }
        return cache;
    }

您可以看到代码hazelcastInstance.getMap(name)

20190726问题补充:

实际上,我们在使用hazelcast之前做了简单的研究。我们需要构建一个集群,并且希望每个节点的缓存更改都与其他节点的缓存同步,这就是复制模式。然后我们看到了hazelcast中的ReplicatedMap基本上可以满足我们的需求。

从一个演示中我们可以看到您可以在代码上使用ReplicatedMap来完成切换操作,但是我们更喜欢使用spring boot缓存注释(例如@Cacheable)来实现较低的耦合(即使您需要转换其他稍后再缓存组件。也无需更改使用缓存的代码,只需更改其他缓存配置即可。

使用@Cacheable时,我们发现尽管缓存有效,但无法监听ReplicatedMap,但是Map可以。我们怀疑默认情况下hazelcast使用Map作为缓存的数据结构,并且我们发现了com.hazelcast.spring.cache.HazelcastCacheManager#getCache方法。因此,我们想知道如何将Map切换到ReplicatedMap。

1 个答案:

答案 0 :(得分:0)

这目前无法实现,无法配置。

我看到了https://github.com/hazelcast/hazelcast/issues/15360。您可以自己实施并提交PR?对此需求进行一些解释也将有所帮助。

要注意的是,ReplicatedMapIMap之间有不同的一致性保证(请参阅https://docs.hazelcast.org/docs/3.12.1/manual/html-single/index.html#replicating-instead-of-partitioning),但是对于@Cacheable来说,这并不是什么大问题

作为替代方案,使用近缓存怎么办? (请参阅https://docs.hazelcast.org/docs/3.12.1/manual/html-single/index.html#near-cache