前一段时间安装了redis集群,现在就将redis集群整合到Spring Boot项目中。
一、环境准备
1、已经安装并配置好Redis集群
可以通过命令行或其他工具(如Redis Desktop Manager)来验证Redis集群的健康状况。
2、一个现成的 Spring Boot 3.4.3项目
JDK17及以上。
二、Spring Boot 框架整合Redis 集群
1、pom中添加依赖
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
2、 配置application.properties文件
# 集群节点
spring.data.redis.cluster.nodes=127.0.0.1:7001,127.0.0.1:7002,127.0.0.1:7003,127.0.0.1:7004,127.0.0.1:7005,127.0.0.1:7006
spring.redis.cluster.max-redirects=6
#spring.data.redis.password=
spring.data.redis.timeout=5000
# 默认连接池的配置
spring.data.redis.lettuce.pool.max-idle=100
spring.data.redis.lettuce.pool.min-idle=50
spring.data.redis.lettuce.pool.max-wait=2000
spring.data.redis.lettuce.pool.max-active=10
spring.data.redis.cluster.nodes:指定 Redis 集群的节点地址列表。格式为 host:port,多个节点用逗号分隔。
spring.redis.cluster.max-redirects:设置集群重定向的最大次数。当客户端请求的 key 不在当前节点时,会收到重定向响应,这里设置为 6,与节点数相同是常见做法。
spring.data.redis.timeout:定义 Redis 命令的超时时间(毫秒),这里设置为 5000 毫秒(5 秒)。
Lettuce 是 Spring Boot 2.x 以来默认的 Redis 客户端。
spring.data.redis.lettuce.pool.max-idle:连接池中最大空闲连接数,这里设置为 100。
spring.data.redis.lettuce.pool.min-idle:连接池中最小空闲连接数,这里设置为 50。
spring.data.redis.lettuce.pool.max-wait:当连接池耗尽时,获取连接的最大等待时间(毫秒),这里设置为 2000 毫秒(2 秒),超过这个时间会抛出异常。
spring.data.redis.lettuce.pool.max-active:连接池最大连接数(包括空闲和使用中的连接),这里设置为 10。
三、简单应用
经过以上两步,自动配置就生效了,我们可以直接通过 @Autowired 调用 RedisTemplate 模板方法,来操作redis集群数据库。
@Autowired
private StringRedisTemplate stringRedisTemplate;
publicvoidtestRedis(){
stringRedisTemplate.opsForValue().set("key", "value");
String value = stringRedisTemplate.opsForValue().get("key");
System.out.println(value);
}
把这段代码放到控制层或服务层,就可以进行测试了。
只要我们使用了 spring-boot-starter-data-redis + 正确的application.properties 配置, 是不需要额外手动写 @Bean 的,Spring Boot 自动根据配置创建连接工厂(比如 LettuceConnectionFactory),并且自动帮我们装配好 RedisTemplate 和 StringRedisTemplate,我们直接使用即可。
四、额外配置
1、自定义 RedisTemplate 的序列化器
如果我们需要自定义 RedisTemplate 的序列化器,比如 Key 要用 String,Value 要用 JSON,那么我们需要配置一个@Bean来做这件事。
@Configuration
publicclassRedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
// 设置 Key 和 Value 的序列化器
StringRedisSerializer keySerializer = new StringRedisSerializer();
GenericJackson2JsonRedisSerializer valueSerializer = new GenericJackson2JsonRedisSerializer();
template.setKeySerializer(keySerializer);
template.setValueSerializer(valueSerializer);
template.setHashKeySerializer(keySerializer);
template.setHashValueSerializer(valueSerializer);
template.afterPropertiesSet();
returntemplate;
}
}
RedisConnectionFactory redisConnectionFactory是 Redis的连接工厂,用于创建 Redis 的连接,这里默认的是LettuceConnectionFactory 工厂实现。
RedisTemplate 是一个泛型类,在这里指定了 Key 的类型为 String,Value 的类型为 Object。
调用 setConnectionFactory 方法,将 redisConnectionFactory 传递给 RedisTemplate,使其知道如何与 Redis 服务器建立连接。
StringRedisSerializer 用于将 Redis 的 Key 序列化为字符串(String),并将字符串反序列化为 Java 的 String 对象。Redis 的 Key 通常以字符串形式存储,因此使用 StringRedisSerializer 是很常见的做法。
GenericJackson2JsonRedisSerializer 用于将 Redis 的 Value 序列化为 JSON 格式,并将 JSON 反序列化为 Java 对象。与 StringRedisSerializer 不同,这种序列化器可以处理复杂的对象结构,适合存储非字符串类型的值(如自定义对象)。
setHashKeySerializer 表示:如果 Redis 中存储的是 Hash类型的数据(即 HSET 命令),还需要为 Hash 的 Key 和 Value 分别设置序列化器。这里分别复用了前面定义的 StringRedisSerializer 和GenericJackson2JsonRedisSerializer。
调用afterPropertiesSet() 方法,确保RedisTemplate 的所有属性(如连接工厂、序列化器等)都已正确设置。这是 Spring 的InitializingBean 接口中的方法,RedisTemplate 实现了该接口。
最后返回配置完成的 RedisTemplate 对象,供 Spring 容器管理并注入到其他需要的地方。
2、切换 Redis 客户端、连接池配置
spring-boot-starter-data-redis框架默认使用 Lettuce,如果要切换为 Jedis ,就需要引入 Jedis架包,并进行自定义配置。
还有其他业务场景,有需要再研究吧!
领取专属 10元无门槛券
私享最新 技术干货