
本文旨在解决在使用Spring Cache结合Hazelcast时,通过@CachePut注解成功将数据添加到缓存,但无法通过HazelcastInstance的getMap方法获取的问题。文章将详细介绍如何正确配置Spring Cache和Hazelcast,并提供代码示例和注意事项,确保缓存数据能够正确存储和访问。
启用Spring Cache
首先,确保在Spring配置中显式启用了缓存功能。这可以通过在配置类上添加@EnableCaching注解来实现。
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableCaching
public class CacheConfig {
// ... 其他配置
}如果使用Spring Boot,Spring Boot会自动配置缓存,但仍然建议显式添加@EnableCaching以确保缓存功能被启用。可以通过设置debug=true或使用命令行参数--debug来查看Spring Boot的自动配置报告,确认CacheAutoConfiguration已被处理。
配置HazelcastCacheManager
如果未使用Spring Boot,除了@EnableCaching之外,还需要显式声明一个CacheManager Bean。对于Hazelcast,需要使用HazelcastCacheManager。
import com.hazelcast.core.HazelcastInstance;
import org.springframework.cache.CacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.cache.hazelcast.HazelcastCacheManager;
@Configuration
public class HazelcastCacheConfig {
@Bean
public CacheManager cacheManager(HazelcastInstance hazelcastInstance) {
return new HazelcastCacheManager(hazelcastInstance);
}
}注意: 这里使用的是Spring Cache抽象的CacheManager实现org.springframework.cache.hazelcast.HazelcastCacheManager,而不是Hazelcast自身的com.hazelcast.cache.HazelcastCacheManager。 这两个类是不同的。
为了使用HazelcastCacheManager,需要在项目的依赖中添加hazelcast-spring JAR。
本文档主要讲述的是mybatis语法和介绍;MyBatis 是一个可以自定义SQL、存储过程和高级映射的持久层框架。MyBatis 摒除了大部分的JDBC代码、手工设置参数和结果集重获。MyBatis 只使用简单的XML 和注解来配置和映射基本数据类型、Map 接口和POJO 到数据库记录。相对Hibernate和Apache OJB等“一站式”ORM解决方案而言,Mybatis 是一种“半自动化”的ORM实现。感兴趣的朋友可
com.hazelcast hazelcast-spring ${hazelcast.version} runtime
确保正确获取Hazelcast实例
检查从Hazelcast.getHazelcastInstanceByName(config.getInstanceName()) 获取的实例是否与HazelcastCacheManager使用的实例相同。如果实例不匹配,缓存操作将不会生效。
检查缓存配置
确保testmap的配置正确。 检查MapConfig中的name属性是否与@CachePut注解中的value属性一致。
@Configuration
public class HazelcastConfig {
@Bean
public Config hazelcastConf() {
Config c = new Config()
.setInstanceName("hazelcast-instance")
.addMapConfig(
new MapConfig()
.setName("testmap") // 确保此处的name与@CachePut中的value一致
.setEvictionConfig(
new EvictionConfig()
.setEvictionPolicy(EvictionPolicy.LRU)
.setMaxSizePolicy(MaxSizePolicy.PER_NODE)
.setSize(1000)
)
.setTimeToLiveSeconds(500000)
);
c.getNetworkConfig().getRestApiConfig().setEnabled(true);
c.getNetworkConfig().getRestApiConfig().enableGroups(RestEndpointGroup.DATA);
return c;
}
}@Service
public class TestServiceImpl implements TestService {
@Override
@CachePut(value = "testmap", key="1") // 确保此处的value与MapConfig中的name一致
public String getId() {
// ...
}
}使用JCache (可选)
除了Spring Cache抽象,还可以使用JCache作为缓存提供者。Spring Framework提供了对JCache的支持。 如果使用Spring Boot,需要指定Hazelcast的JCache缓存提供者类型(嵌入式或客户端/服务器)。
总结
在使用Spring Cache和Hazelcast时,确保以下几点:
- 启用Spring Cache:使用@EnableCaching注解。
- 配置HazelcastCacheManager:显式声明CacheManager Bean,并使用HazelcastCacheManager。
- 添加hazelcast-spring依赖:确保项目中包含hazelcast-spring JAR。
- Hazelcast实例匹配:确保HazelcastCacheManager和获取的HazelcastInstance使用的是同一个实例。
- 缓存配置正确:检查MapConfig的name属性和@CachePut注解的value属性是否一致。
通过以上步骤,可以解决Hazelcast缓存数据无法通过Map获取的问题,并确保缓存功能正常工作。









