springboot集成redis哨兵集群的实现示例

 更新时间:2023年08月06日 11:16:39   作者:渣渣→_→  
本文主要介绍了springboot集成redis哨兵集群的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

redis主从集群和redis sentinel集群都配置完毕了, 现在我们需要了解spring boot 如何连接上该集群

才能用上这两个集群带来的便利

本章内容

  • 为什么需要关注这个问题?
  • 怎么配置?

记住. 本章是针对redis已经配置了主从集群和哨兵集群的, 而非cluster集群模式

为什么需要关注这个问题?

没有 Redis Sentinel 架构之前,如果主节点挂了,需要运维人员手动进行主从切换,然后更新所有用到的 Redis IP 地址参数再重新启动系统,所有恢复操作都需要人为干预,如果半夜挂了,如果系统很多,如果某个操作搞错了,等等,这对运维人员来说简直就是恶梦。

有了 Redis Sentinel,主从节点故障都是自动化切换,应用程序参数什么也不用改,对于客户端来说都是透明无缝切换的,运维人员再也不用担惊受怕了。

怎么配置?

看看源码分析分析

我们需要注意redis中springboot的这个接口

也就是RedisConnectionFactory这个接口

可以看到三个函数, 分别拿到

  • redis集群的Connection
  • 单机redis的Connection
  • 哨兵方式的Connection

如果你写过springboot整合redis的hello world 项目的话, 你会发现, springboot默认使用

LettuceConnectionFactory

同时我们通过在 application.yml 上的 spring.redis 字符串找到

org.springframework.boot.autoconfigure.data.redis.LettuceConnectionConfiguration

可以看到下面的这个Bean配置

优先级已经决定了, sentinel > cluster > 单机 方式

进入getSentinelConfig函数

protected final RedisSentinelConfiguration getSentinelConfig() {
   if (this.sentinelConfiguration != null) {
      return this.sentinelConfiguration;
   }
   RedisProperties.Sentinel sentinelProperties = this.properties.getSentinel();
   if (sentinelProperties != null) {
      RedisSentinelConfiguration config = new RedisSentinelConfiguration();
      config.master(sentinelProperties.getMaster());
      config.setSentinels(createSentinels(sentinelProperties));
      config.setUsername(this.properties.getUsername());
      if (this.properties.getPassword() != null) {
         config.setPassword(RedisPassword.of(this.properties.getPassword()));
      }
      config.setSentinelUsername(sentinelProperties.getUsername());
      if (sentinelProperties.getPassword() != null) {
         config.setSentinelPassword(RedisPassword.of(sentinelProperties.getPassword()));
      }
      config.setDatabase(this.properties.getDatabase());
      return config;
   }
   return null;
}

上面可以看到 password 和 sentinelPassword 是可选的

跳到RedisProperties.Sentinel 就看到

配置

sentinel:
  master: mymaster
  password: 123456
  nodes:
    - 192.168.7.5:26379
    - 192.168.7.6:26380
    - 192.168.7.7:26381

完整application.yml

server:
  port: 8081
spring:
  application:
    name: redis-data-demo
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/hmdp?useSSL=false&serverTimezone=UTC
    username: root
    password: 123456
  redis:
    host: 127.0.0.1
    port: 6379
    lettuce:
      pool:
        max-active: 10
        max-idle: 10
        min-idle: 1
        time-between-eviction-runs: 10s
        enabled: true
    sentinel:
      master: mymaster
      password: 123456
      nodes:
        - 192.168.7.5:26379
        - 192.168.7.6:26380
        - 192.168.7.7:26381
  jackson:
    default-property-inclusion: non_null
    date-format: yyyy-MM-dd HH:mm:ss
    serialization:
      WRITE_DATES_AS_TIMESTAMPS: false
    deserialization:
      READ_DATE_TIMESTAMPS_AS_NANOSECONDS: false
  #  cache:
  #    type: redis
  #    redis:
  #      time-to-live: 1800 # 全局 key 过期时间
  #      cache-null-values: true
  main:
    allow-circular-references: true
  rabbitmq:
    host: 127.0.0.1
    username: zhazha
    password: 123456
    virtual-host: /
    listener:
      simple:
        acknowledge-mode: manual
        retry:
          enabled: true
          initial-interval: 300
          max-attempts: 3
          max-interval: 1000
    publisher-returns: true
    publisher-confirm-type: correlated
mybatis-plus:
  type-aliases-package: com.zhazha.entity
  global-config:
    banner: off
logging:
  level:
    com.zhazha: debug

在项目的启动类中,添加一个新的bean:

@Bean
public LettuceClientConfigurationBuilderCustomizer clientConfigurationBuilderCustomizer(){
    return clientConfigurationBuilder -> clientConfigurationBuilder.readFrom(ReadFrom.REPLICA_PREFERRED);
}

这个bean中配置的就是读写策略,包括四种:

  • MASTER:从主节点读取
  • MASTER_PREFERRED:优先从master节点读取,master不可用才读取replica
  • REPLICA:从slave(replica)节点读取
  • REPLICA_PREFERRED:优先从slave(replica)节点读取,所有的slave都不可用才读取master

其他操作不需要修改

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

相关文章

  • PageHelper分页查询操作方法示例

    PageHelper分页查询操作方法示例

    这篇文章主要为大家介绍了PageHelper分页查询数据操作方法示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • Java实现Random随机数生成双色球号码

    Java实现Random随机数生成双色球号码

    使用Random类是Java中用于生成随机数的标准类,本文主要介绍了Java实现Random随机数生成双色球号码,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • java实现socket从服务器连续获取消息的示例

    java实现socket从服务器连续获取消息的示例

    这篇文章主要介绍了java实现socket从服务器连续获取消息的示例,需要的朋友可以参考下
    2014-04-04
  • Activiti进阶之组任务实现示例详解

    Activiti进阶之组任务实现示例详解

    这篇文章主要为大家介绍了Activiti进阶之组任务实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • 在IDEA中 实现给main方法附带参数的操作

    在IDEA中 实现给main方法附带参数的操作

    这篇文章主要介绍了在IDEA中 实现给main方法附带参数的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • Java实现将彩色PDF转为灰度PDF的示例代码

    Java实现将彩色PDF转为灰度PDF的示例代码

    本文以Java代码为例介绍如何实现将彩色PDF文件转为灰度(黑白)的PDF文件,文中的示例代码讲解详细,感兴趣的小伙伴快跟随小编一起学习一下吧
    2022-03-03
  • 如何解决java.util.zip.ZipFile解压后被java占用问题

    如何解决java.util.zip.ZipFile解压后被java占用问题

    这篇文章主要介绍了如何解决java.util.zip.ZipFile解压后被java占用问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • mybatis关于Criteria使用的小坑

    mybatis关于Criteria使用的小坑

    这篇文章主要介绍了mybatis关于Criteria使用的小坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • SpringBoot内部调用事务不起作用问题的解决方案

    SpringBoot内部调用事务不起作用问题的解决方案

    这篇文章主要介绍了SpringBoot事务不起作用问题的解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • 详解如何在SpringBoot中实现优雅关闭

    详解如何在SpringBoot中实现优雅关闭

    这篇文章主要介绍了如何在SpringBoot中实现优雅关闭,SpringBoot应用程序的关闭可以是崩溃,也可以是手动关闭的,Shutdown、Crash 和 Graceful 之间的区别在于,它控制决定了我们可以用这个事件做什么,本文中,一起研究下Spring Boot提供的开箱即用功能之一:优雅关闭
    2024-09-09

最新评论