嵌入式拓扑下Hazelcast节点不共享缓存条目问题求助
解决嵌入式Hazelcast集群缓存不共享的问题
嗨,我之前也碰到过一模一样的情况!你的Hazelcast集群确实正常组建起来了(从节点日志能看出来),但问题出在Spring的缓存抽象没有和Hazelcast的分布式缓存绑定,导致每个节点其实在用自己的本地缓存,自然不会共享数据。
问题根源
当你只添加@EnableCaching注解但没有显式配置CacheManager时,Spring会默认创建一个ConcurrentMapCacheManager——这是个纯本地的缓存实现,和你的Hazelcast集群完全没关系。所以哪怕Hazelcast节点互相发现了,Spring还是在各自节点用本地缓存,缓存数据自然没法共享。
解决方案:绑定Spring缓存到Hazelcast分布式缓存
你只需要在现有的HazelcastConfig配置类里,添加两个关键的Bean:HazelcastInstance和HazelcastCacheManager,让Spring明确使用Hazelcast的分布式缓存来处理@Cacheable注解。
修改后的完整配置类代码:
@Configuration @EnableCaching public class HazelcastConfig { public static final String BANKS = "banks"; @Bean Config config() { Config config = new Config(); MapConfig mapConfig = new MapConfig(); mapConfig.setTimeToLiveSeconds(3000); config.getMapConfigs().put(BANKS, mapConfig); return config; } // 创建Hazelcast实例,用上面定义的配置 @Bean public HazelcastInstance hazelcastInstance(Config config) { return Hazelcast.newHazelcastInstance(config); } // 让Spring缓存抽象使用Hazelcast的缓存管理器 @Bean public CacheManager cacheManager(HazelcastInstance hazelcastInstance) { return new HazelcastCacheManager(hazelcastInstance); } }
原理说明
HazelcastInstanceBean:基于你的配置创建一个嵌入式Hazelcast节点,加入集群。HazelcastCacheManagerBean:告诉Spring的缓存系统,使用Hazelcast的分布式Map来存储缓存数据。这样当你用@Cacheable(HazelcastConfig.BANKS)时,操作的就是集群中共享的那个名为BANKS的分布式Map,所有节点都能访问到同一份缓存数据。
验证步骤
修改配置后重启两个应用实例,再按之前的流程测试:
- 调用实例1的
findByAccountNumber方法→执行方法体(缓存为空) - 再次调用实例1的方法→直接取缓存(正常)
- 调用实例2的方法→不会执行方法体,直接从集群缓存取值(符合预期)
额外检查(可选)
确保你的依赖是完整的,如果用Maven的话,pom.xml里需要包含:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>com.hazelcast</groupId> <artifactId>hazelcast</artifactId> </dependency>
内容的提问来源于stack exchange,提问作者S-Wing
相关产品推荐
相关产品推荐

