boxmoe_header_banner_img

Hello! 欢迎来到悠悠畅享网!

文章导读

Hazelcast缓存数据无法通过Map获取的解决方案


avatar
作者 2025年10月10日 8

Hazelcast缓存数据无法通过Map获取的解决方案

本文旨在解决在使用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。

Hazelcast缓存数据无法通过Map获取的解决方案

存了个图

视频图片解析/字幕/剪辑,视频高清保存/图片源图提取

Hazelcast缓存数据无法通过Map获取的解决方案17

查看详情 Hazelcast缓存数据无法通过Map获取的解决方案

<dependency>     <groupId>com.hazelcast</groupId>     <artifactId>hazelcast-spring</artifactId>     <version>${hazelcast.version}</version>     <scope>runtime</scope> </dependency>

确保正确获取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时,确保以下几点:

  1. 启用Spring Cache:使用@EnableCaching注解。
  2. 配置HazelcastCacheManager:显式声明CacheManager Bean,并使用HazelcastCacheManager。
  3. 添加hazelcast-spring依赖:确保项目中包含hazelcast-spring JAR。
  4. Hazelcast实例匹配:确保HazelcastCacheManager和获取的HazelcastInstance使用的是同一个实例。
  5. 缓存配置正确:检查MapConfig的name属性和@CachePut注解的value属性是否一致。

通过以上步骤,可以解决Hazelcast缓存数据无法通过Map获取的问题,并确保缓存功能正常工作。



评论(已关闭)

评论已关闭

text=ZqhQzanResources