【问题标题】:Proper way to configure Hazelcast with Spring使用 Spring 配置 Hazelcast 的正确方法
【发布时间】:2018-12-19 23:17:50
【问题描述】:

我有一个 hazelcast 集群,在三个节点上运行,具有以下配置(使用 ansible 和 docker 进行部署):

hazelcast_cluster_login: "login"
hazelcast_cluster_password: "password"
hazelcast_maps: <map name="my_map"><backup-count>1</backup-count>
<time-to-live-seconds>3600</time-to-live-seconds></map>

以及下面的 Spring 配置

@Configuration
@EnableCaching
public class CacheConfig {

    @Autowired
    private HazelcastProperties properties;

    @Bean
    public HazelcastInstance getConfig() {
        log.info("Connecting to Hazelcast on {} with login = {}",
            properties.getHosts(),
            properties.getLogin());

        ClientConfig clientConfig = new ClientConfig();
        clientConfig.getGroupConfig()
            .setName(properties.getLogin())
            .setPassword(properties.getPassword());
        clientConfig.getNetworkConfig()
            .setAddresses(properties.getHosts())
            .setConnectionAttemptLimit(0);
        HazelcastInstance instance = HazelcastClient.newHazelcastClient(clientConfig);
        return instance;
    }

    @Bean
    public CacheManager hazelcastCacheManager(HazelcastInstance 
        hazelcastInstance) {
        return new HazelcastCacheManager(hazelcastInstance);
    }

}

此代码能够成功连接和授权。

在我的应用程序中使用my_map Map 和@Cacheable 的正确方法是什么?使用@Cacheable("my_map") 是否正确(找不到诊断方法,这张地图是否为空)? 附言尝试使用 config.addMapConfig(...) 进行配置,但这不适用于正在运行的集群。

【问题讨论】:

    标签: java spring hazelcast


    【解决方案1】:

    试试类似的东西

    @Service
    public class MyService {
    
        @Cacheable("my_map")
        public Integer count(String input) {
            System.out.printf("input==%s%n", input);
            return input.length();
        }
    
    }
    

    这将创建一个名为“my_map”的IMap,其中包含一个字符串键和一个整数值。所以它缓存了字符串的长度以节省重新计算——几乎不值得,更多只是一个概念的演示。

    使用相同的输入多次调用此方法,第一次调用应触发该方法,您将看到系统输出。相同输入的第二次调用应该使用缓存的值,并且不会调用该方法,没有系统输出。

    您可以使用hazelcastInstance.getMap("my_map") 直接访问底层IMap,然后在地图上执行size()keySet() 之类的操作以查看其中的内容。

    size()keySet() 不是您想要正常执行的操作。 size() 计算量很大,keySet() 可能会溢出调用者的内存,因为远程分布式地图可能很大。

    【讨论】:

    • 谢谢,通过记录 cacheManager.getCacheNames() 我发现应用程序中使用了缓存 my_map。有什么方法可以检查这张地图是否使用了我在 hazelcast_maps 中的配置?
    • 你可以试试hazelcastInstance.getConfig().getMapConfigs()。或者,在配置中添加一个监听器到地图,如果调用了监听器,你就知道该配置已被使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多