spring boot集成redis哨兵模式(一主二从)

本文介绍了如何在SpringBoot项目中配置并集成Redis哨兵模式,以实现高可用的Redis连接。在配置过程中,遇到无法连接Redis的权限问题,通过检查sentinel配置文件和application.yml中的密码设置,解决了该问题。此外,还提供了详细的配置文件内容和测试类代码供参考。

spring boot集成redis哨兵模式(一主二从)

  Spring Boot 集成 Redis 哨兵模式(一主二从),是指在 Spring Boot 应用中配置并连接采用哨兵机制的 Redis 集群。该集群包含 1 个主节点负责处理读写操作,2 个从节点通过复制主节点数据实现备份,而哨兵节点则持续监控主从节点状态,当主节点故障时自动将从节点晋升为主节点,保障 Redis 服务的高可用。通过 Spring Boot 的配置类或配置文件指定哨兵节点信息、主节点名称等参数,可实现应用与该 Redis 集群的无缝集成,既利用了 Redis 的高性能缓存能力,又借助哨兵模式提升了系统的稳定性和容错性,适用于对数据可靠性和服务连续性有较高要求的业务场景。

  1. 搭建redis主从环境
  2. sprint boot集成redis
  3. Nginx代理Redis哨兵模式
一、环境介绍
  • spring boot 2.5.3
  • spring boot data redis 2.5.3
  • lettuce 6.1.4.RELEASE
  • commons-pool2 2.2.9.0
二、application.yml配置

说明
1. 使用约定大于配置的模式实现spring boot redis哨兵模式
2. 关于怎么样创建spring boot工程,可以自行网络一下,教程多如牛毛
3. 如果配置文件中使用Nginx代理的哨兵模式,后续由于redis迁移、配置变更等问题均不会影响业务应用的正常运行。

server:
  port: 8090

spring:
  redis:
    # 数据库(默认为0号库)
    # database: 2
    # 密码(默认空),操作redis需要使用的密码
    password: jwssw
    # 端口号
    #    port: 6379
    #连接超时时间(毫秒)
    timeout: 10000ms
    sentinel:
      master: mymaster
      nodes:
        - 192.168.229.200:26379
        - 192.168.229.201:26379
        - 192.168.229.202:26379
      # 操作sentinel时需要提供的密码
      password: jwssw
    # 使用lettuce配置
    lettuce:
      pool:
        # 连接池最大连接数(使用负值表示没有限制)
        max-active: 200
        # 连接池中的最大空闲连接
        max-idle: 20
        # 连接池中的最小空闲连接
        min-idle: 5
        # 连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: -1ms
三、redis配置类
package cn.jwssw.ddd.infrastructure.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * 类描述:redis配置类
 *
 * @version 1.0
 * @date 2021/8/10 12:50
 * @since JDK 8
 */
@Configuration
public class RedisConfig {
   
   

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
   
   
        // 定义redis模板
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);

        // 创建序列号对象
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer(<
### Spring Boot Redis 单机与哨兵模式自适应配置教程 在 Spring Boot集成 Redis 并实现单机和哨兵模式的自适应配置,可以通过动态判断 Redis 的运行模式来调整配置。以下是个完整的解决方案,涵盖单机模式和哨兵模式的切换逻辑。 #### 1. 引入依赖 确保项目中引入了正确的 Spring BootRedis 相关依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>2.1.8.RELEASE</version> </dependency> ``` 此版本支持基本的 Redis 配置[^1]。 #### 2. 配置文件设置 在 `application.properties` 或 `application.yml` 文件中定义 Redis 的两种模式配置: ##### application.yml 示例 ```yaml spring: redis: single: host: localhost port: 6379 sentinel: master: mymaster nodes: 127.0.0.1:26379,127.0.0.1:26380,127.0.0.1:26381 mode: single # 可选值:single | sentinel ``` #### 3. 动态配置类 创建个配置类,根据配置文件中的 `spring.redis.mode` 参数动态选择 Redis 的连接方式。 ##### 动态配置类代码 ```java import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.RedisSentinelConfiguration; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; import org.springframework.data.redis.core.StringRedisTemplate; @Configuration public class RedisConfig { @Value("${spring.redis.mode}") private String redisMode; @Value("${spring.redis.single.host}") private String singleHost; @Value("${spring.redis.single.port}") private int singlePort; @Value("${spring.redis.sentinel.master}") private String sentinelMaster; @Value("${spring.redis.sentinel.nodes}") private String sentinelNodes; @Bean public RedisConnectionFactory redisConnectionFactory() { if ("sentinel".equalsIgnoreCase(redisMode)) { return sentinelConnection(); } else { return singleConnection(); } } private RedisConnectionFactory singleConnection() { JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(); jedisConnectionFactory.setHostName(singleHost); jedisConnectionFactory.setPort(singlePort); jedisConnectionFactory.afterPropertiesSet(); return jedisConnectionFactory; } private RedisConnectionFactory sentinelConnection() { RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration() .master(sentinelMaster) .sentinel(getSentinelAddresses(sentinelNodes)); JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(sentinelConfig); jedisConnectionFactory.afterPropertiesSet(); return jedisConnectionFactory; } private Iterable<String> getSentinelAddresses(String nodes) { return Arrays.stream(nodes.split(",")) .map(address -> address.trim()) .toList(); } @Bean public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory factory) { return new StringRedisTemplate(factory); } } ``` #### 4. 测试代码 编写测试代码验证单机和哨兵模式的切换是否正常工作。 ##### 测试代码示例 ```java import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.redis.core.StringRedisTemplate; @SpringBootTest public class RedisTest { @Autowired private StringRedisTemplate stringRedisTemplate; @Test public void testRedis() { stringRedisTemplate.opsForValue().set("testKey", "testValue"); System.out.println("Value: " + stringRedisTemplate.opsForValue().get("testKey")); } } ``` #### 5. 注意事项 - 如果需要支持密码认证,可以在 `JedisConnectionFactory` 中通过 `setPassword` 方法设置密码。 - 哨兵模式下,确保所有 Sentinel 节点地址正确,并且从配置正常[^2]。 - 在生产环境中,建议使用连接池(如 JedisPool)优化性能。 --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值