Spring Boot集成Hazelcast Near Cache配置及服务端启动示例请求
没问题!我给你整理一套完整的Spring Boot + Hazelcast Near Cache配置方案,包括服务端启动、客户端Near Cache设置,还有和Hibernate二级缓存的集成示例,都是可直接复用的代码~
一、Hazelcast服务端配置(两种启动方式)
你可以选择嵌入式服务端(和Spring Boot一起启动)或者独立服务端,我都给你提供示例:
1. 嵌入式服务端(Spring Boot内置)
写一个配置类,Spring Boot启动时会自动启动Hazelcast节点:
import com.hazelcast.config.Config; import com.hazelcast.config.MapConfig; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class HazelcastServerConfig { @Bean public Config hazelcastServerConfig() { Config config = new Config(); // 设置集群名称,客户端需要和这个一致才能连接 config.setClusterName("hazelcast-demo-cluster"); // 配置默认Map的基础参数(比如备份数,保证高可用) MapConfig defaultMapConfig = new MapConfig("default"); defaultMapConfig.setBackupCount(1); config.addMapConfig(defaultMapConfig); // 针对业务缓存单独配置Map(比如用户缓存) MapConfig userCacheMapConfig = new MapConfig("user-cache"); userCacheMapConfig.setBackupCount(1); config.addMapConfig(userCacheMapConfig); return config; } }
2. 独立服务端(单独启动)
如果需要独立部署Hazelcast集群,可以下载官方jar包,编写hazelcast.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?> <hazelcast xmlns="http://www.hazelcast.com/schema/config" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.hazelcast.com/schema/config http://www.hazelcast.com/schema/config/hazelcast-config-5.3.xsd"> <cluster-name>hazelcast-demo-cluster</cluster-name> <map name="default"> <backup-count>1</backup-count> </map> <map name="user-cache"> <backup-count>1</backup-count> </map> </hazelcast>
启动命令(替换成你下载的Hazelcast版本):
java -jar hazelcast-5.3.6.jar -c hazelcast.xml
二、客户端配置(核心:Near Cache设置)
客户端需要连接到服务端,并针对特定Map配置Near Cache——这样客户端会把常用数据缓存到本地,减少远程调用,提升速度:
import com.hazelcast.client.config.ClientConfig; import com.hazelcast.client.config.NearCacheConfig; import com.hazelcast.config.EvictionConfig; import com.hazelcast.config.EvictionPolicy; import com.hazelcast.config.MaxSizePolicy; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class HazelcastClientConfig { @Bean public ClientConfig hazelcastClientConfig() { ClientConfig clientConfig = new ClientConfig(); clientConfig.setClusterName("hazelcast-demo-cluster"); // 配置服务端地址,多个节点用逗号分隔 clientConfig.getNetworkConfig().addAddress("127.0.0.1:5701"); // 针对user-cache配置Near Cache NearCacheConfig nearCacheConfig = new NearCacheConfig("user-cache"); // 服务端缓存更新时,自动失效客户端本地缓存,避免脏数据 nearCacheConfig.setInvalidateOnChange(true); // 缓存存活时间(5分钟) nearCacheConfig.setTimeToLiveSeconds(300); // 最大空闲时间(3分钟) nearCacheConfig.setMaxIdleSeconds(180); // 配置驱逐策略:本地缓存到1000条时,按LRU(最近最少使用)驱逐 EvictionConfig evictionConfig = new EvictionConfig(); evictionConfig.setEvictionPolicy(EvictionPolicy.LRU); evictionConfig.setMaxSizePolicy(MaxSizePolicy.ENTRY_COUNT); evictionConfig.setSize(1000); nearCacheConfig.setEvictionConfig(evictionConfig); clientConfig.addNearCacheConfig(nearCacheConfig); return clientConfig; } }
三、集成Hibernate二级缓存
把Hazelcast作为Hibernate的二级缓存,让实体类查询也能用上Near Cache的优化:
1. 依赖配置(Maven)
<!-- Hazelcast Spring Boot Starter --> <dependency> <groupId>com.hazelcast</groupId> <artifactId>hazelcast-spring-boot-starter</artifactId> <version>5.3.6</version> </dependency> <!-- Hazelcast Hibernate集成包(根据你的Hibernate版本选择,这里是5.3.x) --> <dependency> <groupId>com.hazelcast</groupId> <artifactId>hazelcast-hibernate53</artifactId> <version>5.3.6</version> </dependency>
2. 配置文件(application.properties)
# 开启Hibernate二级缓存和查询缓存 spring.jpa.properties.hibernate.cache.use_second_level_cache=true spring.jpa.properties.hibernate.cache.use_query_cache=true # 指定Hazelcast作为缓存区域工厂 spring.jpa.properties.hibernate.cache.region.factory_class=com.hazelcast.hibernate.HazelcastCacheRegionFactory # 如果用客户端模式,指定客户端配置文件路径 spring.jpa.properties.hibernate.hazelcast.cache.client_config=classpath:hazelcast-client.xml
3. 实体类配置缓存
给需要缓存的实体类添加注解,关联到我们配置了Near Cache的Map:
import javax.persistence.*; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; @Entity @Table(name = "users") // READ_WRITE策略支持读写,region对应我们的user-cache Map @Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "user-cache") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String username; private String email; // getter、setter省略 }
四、测试方法缓存
用Spring的@Cacheable注解缓存方法调用,直接复用配置好的Near Cache:
import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; @Service public class UserService { // 缓存方法结果,value对应user-cache Map @Cacheable(value = "user-cache", key = "#userId") public User getUserById(Long userId) { // 模拟数据库查询,第一次调用会打印,后续从缓存获取 System.out.println("从数据库查询用户ID: " + userId); User user = new User(); user.setId(userId); user.setUsername("user_" + userId); user.setEmail("user_" + userId + "@example.com"); return user; } }
内容的提问来源于stack exchange,提问作者tinashe.chipomho




