Redis哨兵模式在Spring Boot项目中的使用与实践完全指南

 更新时间:2025年09月08日 17:11:59   作者:知识浅谈  
Redis哨兵模式为SpringBoot项目提供高可用Redis管理,实现自动故障转移与监控,通过配置依赖、参数及最佳实践(如哨兵节点数量、网络规划),可提升系统稳定性与可靠性,本文给大家介绍Redis哨兵模式在Spring Boot项目中的使用与实践,感兴趣的朋友跟随小编一起看看吧

Redis哨兵模式在Spring Boot项目中的使用与实践

什么是Redis哨兵模式?

Redis Sentinel(哨兵)是Redis官方提供的高可用性解决方案,主要用于管理Redis主从架构,实现自动故障转移监控通知。在没有哨兵模式之前,当Redis主节点宕机时,需要手动进行主从切换并更新应用程序配置,这对运维人员来说是极大的负担。有了哨兵模式,这些操作全部自动化,对客户端透明无缝切换,大大提高了系统的可靠性。

哨兵模式的工作原理

  • 监控:哨兵会周期性地向所有Redis节点发送PING命令,检查节点是否存活。
  • 通知:当哨兵发现某个节点出现故障时,会通知其他哨兵和客户端。
  • 自动故障转移:当主节点出现故障时,哨兵会从从节点中选举一个新的主节点,并将其他从节点指向新的主节点。

哨兵模式主要功能包括:

  • 监控:持续检查主节点和从节点是否正常运行
  • 通知:当监控的Redis实例出现问题时,向其他哨兵和客户端发送警报
  • 自动故障转移:主节点故障时自动选择一个从节点升级为主节点,并调整其他从节点指向新主节点

Spring Boot中配置Redis哨兵模式

添加依赖

pom.xml中添加Spring Boot Data Redis依赖,默认使用Lettuce客户端:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

如果需要使用Jedis客户端,还需添加:

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>

配置文件设置

application.yml中配置Redis哨兵相关信息:

spring:
  redis:
    password: your-redis-password  # Redis认证密码
    sentinel:
      master: mymaster  # Redis主节点名称
      nodes:  # 哨兵节点列表
        - 192.168.1.110:26379
        - 192.168.1.111:26379
        - 192.168.1.112:26379
    lettuce:
      pool:  # 连接池配置(可选)
        max-active: 8
        max-idle: 8
        min-idle: 0
        max-wait: 5000ms

或者在application.properties中配置:

spring.redis.sentinel.master=mymaster
spring.redis.sentinel.nodes=192.168.1.110:26379,192.168.1.111:26379,192.168.1.112:26379
spring.redis.password=your-redis-password

自定义配置类

如果需要更精细的控制,可以创建自定义配置类:

@Configuration
public class RedisConfig {
    @Value("${spring.redis.sentinel.nodes}")
    private String sentinelNodes;
    @Value("${spring.redis.sentinel.master}")
    private String sentinelMaster;
    @Bean
    public RedisSentinelConfiguration redisSentinelConfiguration() {
        RedisSentinelConfiguration config = new RedisSentinelConfiguration();
        config.setMaster(sentinelMaster);
        config.setSentinels(Arrays.stream(sentinelNodes.split(","))
                .map(hostAndPort -> {
                    String[] args = hostAndPort.split(":");
                    return new RedisNode(args[0], Integer.parseInt(args[1]));
                })
                .collect(Collectors.toSet()));
        return config;
    }
    @Bean
    public LettuceConnectionFactory lettuceConnectionFactory(RedisSentinelConfiguration redisSentinelConfiguration) {
        LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder()
                .readFrom(ReadFrom.MASTER_PREFERRED)  // 优先从主节点读取
                .build();
        return new LettuceConnectionFactory(redisSentinelConfiguration, clientConfig);
    }
    @Bean
    public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(lettuceConnectionFactory);
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        return template;
    }
}

使用RedisTemplate操作Redis

配置完成后,可以在服务中使用RedisTemplate来操作Redis:

@Service
public class UserService {
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    public void saveUser(String username, String password) {
        redisTemplate.opsForHash().put("users", username, password);
    }
    public String findUser(String username) {
        return (String) redisTemplate.opsForHash().get("users", username);
    }
    // 更多操作方法...
}

创建Controller提供API接口:

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;
    @PostMapping("/add")
    public String addUser(String username, String password) {
        userService.saveUser(username, password);
        return "用户添加成功";
    }
    @GetMapping("/{username}")
    public String getUser(@PathVariable String username) {
        return userService.findUser(username);
    }
}

读写分离配置

Lettuce客户端支持读写分离策略,可以在配置中指定:

LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder()
    .readFrom(ReadFrom.MASTER_PREFERRED)  // 优先从主节点读
    .build();

可选读策略包括:

  • MASTER:只从主节点读取
  • MASTER_PREFERRED:优先从主节点读取,主节点不可用时从副本读取
  • REPLICA:只从副本读取
  • REPLICA_PREFERRED:优先从副本读取,副本不可用时从主节点读取

常见问题与解决方案

  • 认证失败错误:如果出现"NOAUTH HELLO must be called with the client already HELLO"错误,可能需要配置哨兵密码:
spring:
  redis:
    sentinel:
      password: your-sentinel-password
  • 域名解析问题:如果哨兵返回的是域名而不是IP,需要在本地hosts文件中配置域名解析。
  • 连接池配置:根据应用需求合理配置连接池参数,以提高性能并避免资源耗尽:
lettuce:
  pool:
    max-active: 8    # 最大连接数
    max-idle: 8      # 最大空闲连接数
    min-idle: 0      # 最小空闲连接数
    max-wait: 5000ms # 最大等待时间

最佳实践

  • 哨兵节点数量:生产环境至少部署3个哨兵节点,以确保哨兵集群自身的高可用性。
  • 网络规划:尽量让应用程序节点和Redis节点在相同的网络环境下,减少网络延迟。
  • 监控告警:监控Redis实例和哨兵进程的状态,设置适当的告警机制。
  • 定期演练:定期进行故障转移演练,验证系统的可靠性。
  • 客户端兼容性:确保使用的客户端版本与Redis服务器版本兼容。

总结

Redis哨兵模式为Spring Boot应用程序提供了高可用的Redis解决方案,实现了自动故障转移和监控功能。通过合理的配置和使用,可以大大提升系统的稳定性和可靠性。在实际项目中,应根据业务需求选择合适的配置参数,并遵循最佳实践,才能充分发挥Redis哨兵模式的优势。

到此这篇关于Redis哨兵模式在Spring Boot项目中的使用与实践完全指南的文章就介绍到这了,更多相关springboot使用redis哨兵模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 简单聊一聊redis过期时间的问题

    简单聊一聊redis过期时间的问题

    在使用redis的过期时间时不由想到设置了过期时间,下面这篇文章主要给大家介绍了关于redis过期时间问题的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-04-04
  • Redis缓存lettuce更换为Jedis的实现步骤

    Redis缓存lettuce更换为Jedis的实现步骤

    在springboot中引入spring-boot-starter-data-redis依赖时,默认使用的是lettuce,如果不想使用lettuce而是使用Jedis连接池,本文主要介绍了Redis缓存lettuce更换为Jedis的实现步骤,感兴趣的可以了解一下
    2024-08-08
  • 使用Redis如何设置永久有效

    使用Redis如何设置永久有效

    这篇文章主要介绍了使用Redis如何设置永久有效,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • 基于Redis分布式BitMap的应用分析

    基于Redis分布式BitMap的应用分析

    这篇文章主要介绍了基于Redis分布式BitMap的应用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • Redis中的数据一致性问题以及解决方案

    Redis中的数据一致性问题以及解决方案

    这篇文章主要介绍了Redis中的数据一致性问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05
  • Redis利用Pipeline加速查询速度的方法

    Redis利用Pipeline加速查询速度的方法

    这篇文章主要给大家介绍了关于Redis利用Pipeline加速查询速度的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Redis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-07-07
  • Redis执行Lua脚本的好处与示例代码

    Redis执行Lua脚本的好处与示例代码

    Redis在2.6推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行。下面这篇文章主要给大家介绍了关于Redis执行Lua脚本的好处与示例代码,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-10-10
  • Redis集群的三种部署方式及三种应用问题的处理

    Redis集群的三种部署方式及三种应用问题的处理

    这篇文章主要介绍了Redis集群的三种部署方式及三种应用问题的处理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • Redis GEO实现搜索附近用户的项目实践

    Redis GEO实现搜索附近用户的项目实践

    RedisGEO主要用于存储地理位置信息,并对存储的信息进行操作,本文主要介绍了Redis GEO实现搜索附近用户的项目实践,具有一定的参考价值,感兴趣的可以了解一下
    2024-05-05
  • redis延时队列的项目实践

    redis延时队列的项目实践

    本文主要介绍了redis延时队列的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-11-11

最新评论