SpringBoot 实现 Redis读写分离
RedisTemplate的哨兵模式
在Sentinel集群监管下的Redis主从集群,其节点会因为自动故障转移而发生变化,Redis的客户端必须感知这种变化,及时更新连接信息。Spring的RedisTemplate底层利用lettuce实现了节点的感知和自动切换。
1.在pom文件中引入redis的starter依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
2.然后在配置文件application.yml中指定sentinel相关信息:
spring:redis:sentinel:master: mymaster #sentinel中配置的主节点名称(必须和Sentinel中配置一致!!!)nodes: #配置的各个sentinel节点- 192.168.101.129:27001- 192.168.101.129:27002- 192.168.101.129:27003
3.自定义 Lettuce 客户端的行为配置,配置Redis 读取操作时的 读取策略(ReadFrom)。
@Beanpublic LettuceClientConfigurationBuilderCustomizer configurationBuilderCustomizer(){return new LettuceClientConfigurationBuilderCustomizer() {@Overridepublic void customize(LettuceClientConfiguration.LettuceClientConfigurationBuilder clientConfigurationBuilder) {/*** MASTER:从主节点读取* MASTER_PREFERRED:优先从master节点读取,master不可用才读取replica* REPLICA:从slave(replica)节点读取* REPLICA _PREFERRED:优先从slave(replica)节点读取,所有的slave都不可用才读取master*///配置优先从slave(replica)节点读取,所有的slave都不可用才读取masterclientConfigurationBuilder.readFrom(ReadFrom.REPLICA_PREFERRED);}};}
🧠 ReadFrom 策略详解
枚举值 | 含义 |
---|---|
MASTER | 强制从主节点读取(默认行为) |
MASTER_PREFERRED | 优先从主节点读取,主节点不可用则从副本节点读 |
REPLICA | 只从副本节点读取(如果没有可用副本会失败) |
REPLICA_PREFERRED | 优先从副本节点读取,如果副本不可用再从主节点读(你当前使用的策略) |