PS: 分享一下Springboot项目怎么连接Redis哨兵集群,实现Redis的读写分离。
一、前言
1.Redis的哨兵集群搭建成功, 便可自动完成故障的自动转移, 但是SpringBoot项目集成Redis的时候,怎么做到读写分离呢。
2.还是上次搭建的环境,把上次搭建的集群信息直接粘贴过来。
二、SpringBoot的项目集成Redis
2.1 新建一个SpringBoot项目,引入我们需要的Redis的依赖
#引入Redis的pom依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.3.5.RELEASE</version>
</dependency>
2.2 完成aplication.yml的配置
#yml中的Redis信息配置, 这里无需关心Redis的节点信息,只需要知道主节点的名称(mymaster)和哨兵的信息
#如果Redis设置了密码,需要配置。
spring
redis:
sentinel:
master: mymaster
nodes:
- 192.168.195.59:26379
- 192.168.195.60:26379
- 192.168.195.61:26379
database: 0
password: Test2024
#配置一下 io.lettuce.core 包的日志级别, 待会方便查询关于Redis的日志
logging:
level:
io.lettuce.core: debug
2.3 配置读写分离的Bean,实现主写从读策略
这里再配置类或启动类中注册一个 LettuceClientConfigurationBuilderCustomizer, 这样一个Bean。
@Bean
public LettuceClientConfigurationBuilderCustomizer lettuceclientConfigurationBuilderCustomizer(){
return new LettuceClientConfigurationBuilderCustomizer() {
@Override
public void customize(LettuceClientConfiguration.LettuceClientConfigurationBuilder clientConfigurationBuilder) {
clientConfigurationBuilder.readFrom(ReadFrom.REPLICA_PREFERRED);
}
};
}
PS: 这里的ReadFrom是配置Redis的读取策略,是一个枚举,包括下面选择:
MASTER: 从主节点读取
MASTER_PREFERRED: 优先从master节点读取,master不可用才读取replica
REPLICA: 从slave(replica)节点读取
REPLICA_PREFERRED: 优先从slave(replica)节点读取,所有的slave都不可用才读取master
还有其他的一些枚举值,可自行了解。
2.4 定义接口进行验证读写分离
定义两个简单的测试接口, 读取key和设置key-value的两个web接口。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class RedisSentinelController {
@Autowired
StringRedisTemplate redisTemplate;
//读取key
@GetMapping("/get/{keyName}")
public String getKey(@PathVariable String keyName){
return redisTemplate.opsForValue().get(keyName);
}
//设置key-value
@GetMapping("/set/{keyName}/{value}")
public String setKey(@PathVariable String keyName, @PathVariable String value){
redisTemplate.opsForValue().set(keyName,value);
return "set key success";
}
}
1 调用查询接口,并查看控制台输出的日志信息 , 可以看出最终是由192.168.195.61这个从节点的Redis执行了一个查询操作。
2 调用设置key的接口,查看控制台输出的信息, 可以看出是由192.168.195.59主节点的Redis
执行了一个写操作。
到此基本上的测试已经结束了, 使用简单的Demo实现哨兵集群的读写分离。
PS: 这里有空的话可以自行模拟故障转移,测试项目的读写分离还是否能保持正常, 实测是没用问题的奥。
三、总结
通过Spring Boot集成Redis哨兵模式,我们可以轻松实现读写分离的功能,从而提高系统的性能和可靠性。通过利用Redis的主从复制和自动故障转移功能,我们可以确保系统在主服务器故障时能够自动切换到备用服务器,并且可以实现读写操作的负载均衡,从而更好地满足用户的需求。
PS: 之前有写过关于哨兵集群搭建的文章,欢迎前去阅读Redis的哨兵集群(一主两从三哨兵、部署教程和知识总结)-CSDN博客
PS: 收藏起来,忘了再继续学习, 后面继续分享一些没用的知识。