SpringBoot Redis 使用Lettuce和Jedis配置哨兵模式

news2024/10/7 12:18:50

Redis 从入门到精通【应用篇】之SpringBoot Redis 配置哨兵模式 Lettuce 和Jedis

文章目录

  • Redis 从入门到精通【应用篇】之SpringBoot Redis 配置哨兵模式 Lettuce 和Jedis
  • 前言
    • Lettuce和Jedis区别
      • 1. 连接方式
      • 2. 线程安全性
  • 教程如下
  • 1. Lettuce 方式配置
    • 1.1. 添加 Redis 和 Lettuce 依赖
    • 1.2. 配置 Redis 哨兵模式
    • 1.3. 创建自定义 RedisConnectionFactory以及RedisTemplate
  • 2. Jedis 方式配置
    • 2.1. 添加 Redis 和 Jedis 依赖
    • 2.2. 配置 Redis 哨兵模式
    • 2.3. 创建自定义 RedisTemplate
  • 3. 总结
  • 3. Redis从入门到精通系列文章

在这里插入图片描述

前言

在Spring Boot 中配置Redis哨兵模式,可以使用 Lettuce 或 Jedis 配置 Redis 哨兵模式,实现高可用的 Redis 集群。
因为在Spring Boot中spring-boot-starter-data-redis已经实现了两种客户端链接方式,我们选择其中一种就可以。
在这里插入图片描述

Lettuce和Jedis区别

Lettuce 和 Jedis 都是 Redis 客户端库,可以与 Redis 服务器进行通信。它们的区别在于:

1. 连接方式

  • Lettuce 采用 Netty 底层网络框架,使用异步非阻塞式 IO 模型,支持多个 Redis 节点的连接池复用,适合高并发场景。
  • Jedis 采用传统的阻塞 IO 模型,每个 Redis 节点需要维护一个连接池,适合低并发场景。

2. 线程安全性

  • Lettuce 是线程安全的,可以在多线程环境下共享连接,而 Jedis 不是线程安全的,需要使用连接池进行连接复用。

在 Spring Boot 中配置 Redis 哨兵模式使用 Lettuce 和Jedis 作为 Redis 客户端的步骤分别如下。
推荐使用Lettuce 方式配置

教程如下

1. Lettuce 方式配置

1.1. 添加 Redis 和 Lettuce 依赖

在 pom.xml 文件中添加 Redis 和 Lettuce 依赖:

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

因为默认情况下Spring-boot-starter-data-redis 已经引入了lettuce 所以我们不需要再引入客户端lettuce。只需要引入上面的Starter就OK。
在这里插入图片描述

1.2. 配置 Redis 哨兵模式

在 application.properties 或 application.yml 文件中添加 Redis 的配置信息:
两种配置方式我都罗列出来

# Redis 主节点的名称
spring.redis.sentinel.master=your-master-name
# Redis 哨兵节点的地址,多个节点之间使用逗号分隔
spring.redis.sentinel.nodes=127.0.0.1:26379,127.0.0.1:26380,127.0.0.1:26381
# Redis 访问密码
spring.redis.password=your-redis-password
# Lettuce 连接池最大连接数
spring.redis.lettuce.pool.max-active=8
# Lettuce 连接池最大空闲连接数
spring.redis.lettuce.pool.max-idle=8
# Lettuce 连接池最小空闲连接数
spring.redis.lettuce.pool.min-idle=0
# Lettuce 连接池最大等待时间
spring.redis.lettuce.pool.max-wait=5000ms

或者使用yaml配置方式,要看大家已有项目的配置方式,保持一致。

spring:
  redis:
    sentinel:
      master: your-master-name
      nodes: 127.0.0.1:26379,127.0.0.1:26380,127.0.0.1:26381
    password: your-redis-password
    lettuce:
      pool:
        max-active: 8
        max-idle: 8
        min-idle: 0
        max-wait: 5000ms

配置解释一下 此处的配置中带Lettuce 的事SpringBoot 配置Redis 使用Lettuce 的专项配置。不带的事公共配置。

  • spring.redis.sentinel.master:Redis 主节点的名称,用于访问 Redis 哨兵获取主节点的信息。
  • spring.redis.sentinel.nodes:Redis 哨兵节点的地址,多个节点之间使用逗号分隔。
  • spring.redis.password:Redis 访问密码,用于连接 Redis 时进行认证。
  • spring.redis.lettuce.pool.max-active:Lettuce 连接池最大连接数,用于限制连接池中的最大连接数。
  • spring.redis.lettuce.pool.max-idle:Lettuce 连接池最大空闲连接数,用于限制连接池中的最大空闲连接数。
  • spring.redis.lettuce.pool.min-idle:Lettuce 连接池最小空闲连接数,用于限制连接池中的最小空闲连接数。
  • spring.redis.lettuce.pool.max-wait:Lettuce 连接池最大等待时间,用于限制获取连接的最大等待时间。

其实配置完上面的配置基本上就是可以使用了,因为Spring Boot的实例化Redis客户端的顺序是先判断是否哨兵Sentinel模式,再接下来Cluster模式,接下来才是单机模式Standalone.
在这里插入图片描述

1.3. 创建自定义 RedisConnectionFactory以及RedisTemplate

在 Spring Boot 中,可以通过 RedisConnectionFactory 来连接 Redis。在配置文件中配置 RedisConnectionFactory 的相关信息后,可以通过在代码中注入 RedisConnectionFactory Bean 来使用 Redis。其实也可以直接使用默认的Bean。默认的在LettuceConnectionConfiguration 中已经配置,如果需要自定义配置可以使用以下方式。

我们定义了一个 RedisConfig 类,并创建了一个 RedisTemplate 的 Bean。在 RedisConfig 类中,我们注入了 RedisProperties 类,并将 Redis 的配置信息通过 RedisSentinelConfiguration的方式配置到 LettuceConnectionFactory 中,然后再将 LettuceConnectionFactory 注入到 RedisTemplate 中。

@Configuration
public class RedisConfig {

    @Autowired
    private RedisProperties redisProperties;

    @Bean
    public LettuceConnectionFactory lettuceConnectionFactory() {
        RedisSentinelConfiguration sentinelConfiguration = new RedisSentinelConfiguration()
                .master(redisProperties.getSentinel().getMaster())
                .sentinel(redisProperties.getSentinel().getNodes());
		
        LettuceClientConfiguration clientConfiguration = LettuceClientConfiguration.builder()
                .commandTimeout(Duration.ofMillis(redisProperties.getTimeout()))
                .poolConfig(new GenericObjectPoolConfig<>())
                .build();

        return new LettuceConnectionFactory(sentinelConfiguration, clientConfiguration);
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(lettuceConnectionFactory());
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}

2. Jedis 方式配置

2.1. 添加 Redis 和 Jedis 依赖

Jedis 和Lettuce 的方式的区别,Lettuce 是在Redis Spring Boot Redis依赖中内置了Lettuce 的依赖,但jedis 方式虽Maven然引入了,但是可选项。所以需要手动引入
在 pom.xml 文件中添加 Redis 和 Jedis 依赖:

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

2.2. 配置 Redis 哨兵模式

在 application.properties 或 application.yml 文件中添加 Redis 的配置信息:

spring.redis.sentinel.master=your-master-name
spring.redis.sentinel.nodes=redis-host1:port,redis-host2:port,redis-host3:port
spring.redis.password=your-redis-password
spring:
  redis:
    sentinel:
      master: your-master-name
      nodes: 127.0.0.1:26379,127.0.0.1:26380,127.0.0.1:26381
    password: your-redis-password

其中,your-master-name 是 Redis 主节点的名称,redis-host1:port,redis-host2:port,redis-host3:port 是 Redis 哨兵节点的地址,多个节点之间使用逗号分隔。

2.3. 创建自定义 RedisTemplate

此处为可选项,也可以使用Spring Boot 默认的RedisTemplate 。

和上面Lettuce的方式类似。我们注入了 RedisProperties 类,并将 Redis 的配置信息通过 RedisSentinelConfiguration 的方式配置到 JedisConnectionFactory 中,然后再将 JedisConnectionFactory 注入到 RedisTemplate 中。

@Configuration
public class RedisConfig {

    @Autowired
    private RedisProperties redisProperties;

    @Bean
    public JedisConnectionFactory jedisConnectionFactory() {
        RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration()
                .master(redisProperties.getSentinel().getMaster())
                .sentinel(redisProperties.getSentinel().getNodes());

        JedisConnectionFactory connectionFactory = new JedisConnectionFactory(sentinelConfig);
        connectionFactory.setPassword(redisProperties.getPassword());
        connectionFactory.setUsePool(true);
        return connectionFactory;
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(jedisConnectionFactory());
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}

上面这两种方式基本上就配置好了,具体如何使用,可参考 《Redis【应用篇】之RedisTemplate基本操作》。

3. 总结

使用 Lettuce 或 Jedis 配置 Redis 哨兵模式的配置方法类似,都需要在配置文件中指定 Redis 哨兵的主节点名称和地址端口号等参数,然后创建相应的 RedisConnectionFactory Bean,并使用 RedisTemplate 进行 Redis 操作。Lettuce 适合高并发、多线程的场景,具有更好的性能和稳定性;Jedis 适合低并发、单线程的场景,使用起来更加简单、方便。根据实际需求和场景,可以选择使用 Lettuce 或 Jedis 来配置 Redis 哨兵模式。

3. Redis从入门到精通系列文章

  • 《Redis【应用篇】之RedisTemplate基本操作》
  • 《Redis 从入门到精通【实践篇】之SpringBoot配置Redis多数据源》
  • 《Redis 从入门到精通【进阶篇】之三分钟了解Redis HyperLogLog 数据结构》
  • 《Redis 从入门到精通【进阶篇】之三分钟了解Redis地理位置数据结构GeoHash》
  • 《Redis 从入门到精通【进阶篇】之高可用哨兵机制(Redis Sentinel)详解》
  • 《Redis 从入门到精通【进阶篇】之redis主从复制详解》
  • 《Redis 从入门到精通【进阶篇】之Redis事务详解》
  • 《Redis从入门到精通【进阶篇】之对象机制详解》
  • 《Redis从入门到精通【进阶篇】之消息传递发布订阅模式详解》
  • 《Redis从入门到精通【进阶篇】之持久化 AOF详解》
  • 《Redis从入门到精通【进阶篇】之持久化RDB详解》
  • 《Redis从入门到精通【高阶篇】之底层数据结构字典(Dictionary)详解》
  • 《Redis从入门到精通【高阶篇】之底层数据结构快表QuickList详解》
  • 《Redis从入门到精通【高阶篇】之底层数据结构简单动态字符串(SDS)详解》
  • 《Redis从入门到精通【高阶篇】之底层数据结构压缩列表(ZipList)详解》
  • 《Redis从入门到精通【进阶篇】之数据类型Stream详解和使用示例》
    在这里插入图片描述大家好,我是冰点,今天的Redis【实践篇】之SpringBoot Redis 配置多数据源,全部内容就是这些。如果你有疑问或见解可以在评论区留言。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/783827.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java项目里添加python解析器

java项目里配置了SDK为1.8&#xff0c;添加python文件时会无法解析。 提示让模块配置Python解析器&#xff0c;点击 配置python解析器 &#xff0c;弹出如下&#xff1a; 应用即可。

【机器学习】异常检测

异常检测 假设你是一名飞机涡扇引擎工程师&#xff0c;你在每个引擎出厂之前都需要检测两个指标——启动震动幅度和温度&#xff0c;查看其是否正常。在此之前你已经积累了相当多合格的发动机的出厂检测数据&#xff0c;如下图所示 我们把上述的正常启动的数据集总结为 D a t…

【Linux命令200例】chattr改变文件的扩展属性

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;本文已收录于专栏&#xff1a;Linux命令大全。 &#x1f3c6;本专栏我们会通过具体的系统的命令讲解加上鲜活的实操案例对各个命令进行深入…

【人工智能】博弈、极小极大值、α-β剪枝、截断测试

文章目录 博弈极小极大值α-β剪枝截断测试博弈 极小极大值 假设两个玩家都以最大化自身利用进行博弈举例: 计算机假设在它移动后,对手会选择最小化的行动计算机在考虑自己的行动和对手的最佳行动后选择最佳行动算法实现

【python】在matlab中调用python

参考 Matlab调用Python - 知乎 (zhihu.com) 说一下我犯的错误&#xff1a; 1、电脑上有没有python都可以&#xff0c;我以为anaconda里的python不行&#xff0c;又重新下了一个python3.8 实际上导入的时候可以用 pyversion(D:\myDownloads\anaconda\envs\pytorch38\pytho…

Docker 全栈体系(五)

Docker 体系&#xff08;高级篇&#xff09; 二、DockerFile解析 1. 是什么&#xff1f; Dockerfile是用来构建Docker镜像的文本文件&#xff0c;是由一条条构建镜像所需的指令和参数构成的脚本。 1.1 概述 1.2 官网 https://docs.docker.com/engine/reference/builder/ 1…

freeBSD:ssh登录root

/etc/inetd.conf ee /etc/inetd.conf 去掉# /etc/rc.conf ee /etc/rc.conf 添加一句 sshd_enable"YES" /etc/ssh/sshd_config vi /etc/ssh/sshd_config 22行可以修改端口号&#xff0c;非必要就默认22 36行 去掉# 后面修改成 yes 61 PasswordAuthentication…

Python处理Elasticsearch

简介&#xff1a;Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性&#xff0c;能使数据在生产环境变得更有价值。Elasticsearch 的实现原理主要分为以下几个步骤&…

Golang数据库连接池技术原理与实现

1 为什么需要连接池&#xff1f; 如果不用连接池&#xff0c;而是每次请求都创建一个连接是比较昂贵的&#xff0c;因此需要完成3次tcp握手。同时在高并发场景下&#xff0c;由于没有连接池的最大连接数限制&#xff0c;可以创建无数个连接&#xff0c;耗尽文件描述符。连接池…

【软件测试】什么是selenium

1.seleniumJava环境搭建 前置条件: Java最低版本要求为8,浏览器使用chrome浏览器 1.1下载chrome浏览器 https://www.google.cn/chrome/ 1.2查看浏览器版本 点击关于Google chrome. 记住版本的前三个数. 1.3下载浏览器驱动 http://chromedriver.chromium.org/downloads 下载…

JS案例:在浏览器实现自定义菜单

目录 前言 设计思路 BaseElem Menu CustomElement BaseDrag Drag Resize 最终效果 总结 相关代码 前言 分享一下之前公司实现自定义菜单的思路&#xff0c;禁用浏览器右键菜单&#xff0c;使用自定义的菜单将其代替&#xff0c;主要功能有&#xff1a;鼠标右键调出菜…

二、基本数据类型和表达式

2.1数据类型 数据类型占用字节数取值范围bool1true 或 falsechar1-128 到 127 或 0 到 255 &#xff08;取决于是否带符号&#xff09;unsigned char10 到 255short2-32,768 到 32,767unsigned short20 到 65,535int4-2,147,483,648 到 2,147,483,647unsigned int40 到 4,294,…

ES6基础知识二:ES6中数组新增了哪些扩展?

一、扩展运算符的应用 ES6通过扩展元素符…&#xff0c;好比 rest 参数的逆运算&#xff0c;将一个数组转为用逗号分隔的参数序列 console.log(...[1, 2, 3]) // 1 2 3console.log(1, ...[2, 3, 4], 5) // 1 2 3 4 5[...document.querySelectorAll(div)] // [<div>, &l…

12 扩展Spring MVC

12.1 实现页面跳转功能 页面跳转功能&#xff1a;访问localhost:8081/jiang会自动跳转到另一个页面。 首先&#xff0c;在config包下创建一个名为MyMvcConfig的配置类&#xff1a; 类上加入Configuration注解&#xff0c;类实现WebMvcConfiger接口&#xff0c;实现里面的视图跳…

Python入门【列表元素访问和计数 、切片操作、列表的遍历、复制列表所有的元素到新列表对象、多维列表、元组tuple】(五)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小王&#xff0c;CSDN博客博主,Python小白 &#x1f4d5;系列专栏&#xff1a;python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 &#x1f4e7;如果文章知识点有错误…

OSI 和 TCP/IP 网络分层模型详解(基础)

OSI模型: 即开放式通信系统互联参考模型&#xff08;Open System Interconnection Reference Model&#xff09;&#xff0c;是国际标准化组织&#xff08;ISO&#xff09;提出的一个试图使各种计算机在世界范围内互连为网络的标准框架&#xff0c;简称OSI。 OSI 七层模型 OS…

两个数组的dp问题(1)--动态规划

一)最长公共子序列: 1143. 最长公共子序列 - 力扣&#xff08;LeetCode&#xff09; 一)定义一个状态表示:根据经验题目要求 1)选取第一个字符串[0&#xff0c;i]区间以及第二个字符串[0&#xff0c;j]区间作为研究对象&#xff0c;先选取两段区间研究问题&#xff0c;先求出[0…

即时零售业务调研2022

调研时间22年7月 核心观点&#xff1a; 即时零售业务正处于爆发期疫情催化&#xff0c;线下商家和零售平台处于双向奔赴的蜜月期未来规模会是万亿市场&#xff0c;市场不容小觑&#xff0c;广告业务重要 业务对比优势 平台模式护城河是&#xff1a;线上流量线下配送网络&am…

芯洲科技-降压DCDC开关电源参考选型目录

芯洲科技&#xff0c;是国内领先的中高压DC-DC&#xff08;直流转直流&#xff09;功率转换芯片供应商。北京冠宇铭通 一级代理。 国产化替代&#xff0c;对标TI&#xff0c;有很多料号可直接PIN TO PIN&#xff0c;比如TPS562200(SOT23-6)\TPS563200(SOT23-6)/TPS54540/LMR140…

02、什么是TPS和响应时间

在这个图中&#xff0c;定义了三条曲线、三个区域、两个点以及三个状态描述。 三条曲线&#xff1a;吞吐量的曲线&#xff08;紫色&#xff09;、使用率 / 用户数曲线&#xff08;绿色&#xff09;、响应时间曲线&#xff08;深蓝色&#xff09;。三个区域&#xff1a;轻负载区…