我有一个在三个节点上运行的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
使用@Cacheable
映射的正确方法是什么?使用@Cacheable("my_map")
是否正确(无法找到诊断此地图是否为空的方法)?
附言尝试使用config.addMapConfig(...)
进行配置,但这不适用于正在运行的群集。
答案 0 :(得分:1)
尝试类似
@Service
public class MyService {
@Cacheable("my_map")
public Integer count(String input) {
System.out.printf("input==%s%n", input);
return input.length();
}
}
这将创建一个带有字符串键和一个整数值的IMap,名为“ my_map”。因此,它缓存了字符串的长度以节省重新计算的时间-几乎不值得,只是一个概念的演示。
使用相同的输入多次调用此函数,第一次调用应触发该方法,您将看到系统输出。输入相同的第二次调用应使用缓存的值,并且该方法将不会被调用,也不会产生系统输出。
您可以直接使用hazelcastInstance.getMap("my_map")
访问基础IMap,然后在地图上执行类似size()
或keySet()
的操作,以查看其中的内容。
size()
和keySet()
不是您通常要执行的操作。 size()
的计算量很大,并且keySet()
可能会溢出调用者的内存,因为远程分布式映射可能很大。