SpringBoot整合Redis哨兵模式的实现示例

 更新时间:2024年02月06日 10:05:29   作者:-代号9527  
Redis哨兵模式是Redis高可用方案的一种实现方式,通过哨兵来自动实现故障转移,从而保证高可用,本文主要介绍了SpringBoot整合Redis哨兵模式的实现示例,具有一定的参考价值,感兴趣的可以了解一下

1、Redis哨兵复习

在这里插入图片描述

Redis哨兵主要有三点作用:

  • 监控:不断检查master和slave是否正常运行
  • 通知:当被监控的主从服务器发生问题时,向其他哨兵和客户端发送通知
  • 自动故障转移:断开master和slave的连接,选取一个slave做为master,将其他slave连接到新的maser,并导致客户端新的maser地址

关于Redis哨兵模式的搭建和详解,看这篇Redis哨兵模式

2、整合

  • 在pom.xml文件中添加以下依赖:
<dependencies>
    <!-- Redis依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
</dependencies>
  • 在application.properties文件中添加以下Redis配置:
# Redis连接配置
spring.redis.sentinel.master=mymaster
spring.redis.sentinel.nodes=host1:port1,host2:port2,host3:port3

# spring.redis.sentinel.master的值为你的Redis主节点名称
# spring.redis.sentinel.nodes的值为你的Redis哨兵节点列表。
  • 如果项目的配置文件用的yaml文件,则Redis配置的格式用下面这个
# 单哨兵
spring:
  redis:
    sentinel:
      master: mymaster
      nodes: 192.168.43.243:26379
    lettuce:
      pool:
        max-idle: 10
        max-active: 20
        min-idle: 0
        max-wait: 10000ms
# 多哨兵,则nodes用数组格式,也就是横线
spring:
  redis:
    sentinel:
      master: your-redis-master  # 指定Redis的主节点名称
      nodes:  # 指定一个或多个哨兵节点的地址和端口号
        - host: your-sentinel1-host
          port: your-sentinel1-port
        - host: your-sentinel2-host
          port: your-sentinel2-port
        - host: your-sentinel3-host
          port: your-sentinel3-port
    password: your-redis-password
    # 在哨兵模式中,Redis哨兵节点的配置通常与主节点保持一致,因为哨兵节点不存储数据,它们只负责监控节点的可用性。
    # 所以你不需要在哨兵节点的配置中指定用户名和密码,只需要在主节点的配置中指定密码即可

关于连接池的参数:

  • max-active:连接池中最大活跃连接数(默认值为8)。当连接数达到最大活跃连接数时,新的请求将会等待,直到有可用的连接为止。
  • max-idle:连接池中最大空闲连接数(默认值为8)。当空闲连接数超过最大空闲连接数时,多余的空闲连接将被释放。
  • min-idle:连接池中最小空闲连接数(默认值为0)。连接池中保持的最小空闲连接数,当请求连接时,如果空闲连接数不足,则会创建新的连接。
  • max-wait:连接池中获取连接的最大等待时间(默认-1,表示无限等待)。当连接池中的连接都被占用且达到最大活跃连接数时,新的请求会等待一段时间,如果超过最大等待时间,则会抛出异常。
  • test-on-create:在创建新的连接时,是否进行连接的测试验证(默认值为false)。如果设置为true,则在创建连接的时候会执行一次测试命令,确保连接可用。
  • test-on-borrow:在从连接池中借用连接时,是否进行连接的测试验证(默认值为false)。如果设置为true,则在从连接池中获取连接的时候会执行一次测试命令,确保连接可用。
  • test-on-return:在归还连接到连接池时,是否进行连接的测试验证(默认值为false)。如果设置为true,则在归还连接到连接池的时候会执行一次测试命令,确保连接可用。
  • test-while-idle:在连接空闲一段时间后,是否进行连接的测试验证(默认值为true)。如果设置为true,则连接空闲一段时间后会执行一次测试命令,确保连接可用。

最后,如果报错

"NOAUTH HELLO must be called with the client already HELLO" 

表明Redis连接需要进行认证,但是在发起 HELLO 命令之前没有进行认证。可以单独加下哨兵的密码:

spring.redis.sentinel.password=code9527

3、简单举例

  • 使用RedisTemplate或者使用注解的方式来访问Redis。以下是使用RedisTemplate的示例:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

@Service
public class UserService {
    
    @Autowired
    private RedisTemplate 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);
    }
    
}

//RedisTemplate是通过自动装配注入的,可以直接使用来操作Redis
  • 创建一个Controller类来处理请求并调用UserService中的方法
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {
    
    @Autowired
    private UserService userService;

	@PostMapping("/user/addRedis")
	public void addUserToRedis(String username,String password){
		userService.saveUser(username,password);
	}
    
    @GetMapping("/user/{username}")
    public String getUser(@PathVariable String username) {
        return userService.findUser(username);
    }
    

}

测试一下:

在这里插入图片描述

添加成功:

在这里插入图片描述

查询一下:

在这里插入图片描述

最后记录下一个我遇到的问题,哨兵拿到master的host时,host是个域名,我本地IDEA启动时不能解析成IP,报错:

在这里插入图片描述

可以先通过修改操作系统的Hosts文件来实现模拟域名和IP的关系:

C:\Windows\System32\drivers\etc

在文件末尾添加一行,格式为 "<IP地址> <域名>"
例如: "127.0.0.1 mydomain.com".

 到此这篇关于SpringBoot整合Redis哨兵模式的实现示例的文章就介绍到这了,更多相关SpringBoot Redis哨兵 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java将数字金额转为大写中文金额

    Java将数字金额转为大写中文金额

    这篇文章主要为大家详细介绍了Java将数字金额转为大写中文金额,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • Java使用多线程异步执行批量更新操作方法

    Java使用多线程异步执行批量更新操作方法

    这篇文章主要介绍了Java使用多线程异步执行批量更新操作,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Java泛型中<?>和<T>的区别浅析

    Java泛型中<?>和<T>的区别浅析

    <T>和<?>的区别 <T>是参数类型,常常用于泛型类或泛型方法的定义,下面这篇文章主要给大家介绍了关于Java泛型中<?>和<T>区别的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • java ResourceBundle读取properties文件方式

    java ResourceBundle读取properties文件方式

    这篇文章主要介绍了java ResourceBundle读取properties文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Java设计模式之单例模式实例详解【懒汉式与饿汉式】

    Java设计模式之单例模式实例详解【懒汉式与饿汉式】

    这篇文章主要介绍了Java设计模式之单例模式,简单说明了单例模式的原理并结合具体实例形式分析了单例模式中懒汉式与饿汉式的具体实现与使用技巧,需要的朋友可以参考下
    2017-09-09
  • Java 时间日期详细介绍及实例

    Java 时间日期详细介绍及实例

    这篇文章主要介绍了Java 时间日期详细介绍及实例的相关资料,需要的朋友可以参考下
    2017-01-01
  • 原来Java接口多实现还可以这样玩

    原来Java接口多实现还可以这样玩

    JAVA中类不直接支持多继承,因为会出现调用的不确定性,所以JAVA将多继承机制进行改良,在JAVA中变成了多实现,这篇文章主要给大家介绍了关于Java接口多实现的相关资料,需要的朋友可以参考下
    2021-09-09
  • 搭建SpringBoot项目三种方式(图文教程)

    搭建SpringBoot项目三种方式(图文教程)

    Springboot作为当下最主流的java开发框架,已成为IT从业人员的入门必备技能,本文主要介绍了搭建SpringBoot项目三种方式,感兴趣的可以了解一下
    2023-09-09
  • Java如何判断一个空对象的常见方法

    Java如何判断一个空对象的常见方法

    在Java中判断对象是否为空是一项重要的编程技巧,可以有效防止空指针异常的发生,下面这篇文章主要给大家介绍了关于利用Java如何判断一个空对象的相关资料,需要的朋友可以参考下
    2024-01-01
  • Spring中的ConversionService源码解析

    Spring中的ConversionService源码解析

    这篇文章主要介绍了Spring中的ConversionService源码解析,ConversionService是类型转换服务的接口,从名字就可以看出ConverterRegistry是要实现转换器注册表的接口,添加和移除Converter和GenericConverter,需要的朋友可以参考下
    2023-11-11

最新评论