Springboot整合Redis主从

Springboot整合Redis主从

  • 前言
  • 原配置
  • 现配置
  • 测试
  • LettuceConnectionFactory.setShareNativeConnection 方法的作用

前言

SpringBoot版本:2.3.2.RELEASE

原配置

原yml配置内容:

spring:# Redis服务器配置redis:host: 127.0.0.1# Redis服务器连接端口port: 6379# Redis服务器连接密码password: redis@123#连接超时时间(毫秒)timeout: 30000msjedis:# Redis服务器连接池pool:# 连接池最大连接数(使用负值表示没有限制)maxIdle: 400#连接池中的最小空闲连接minIdle: 100#连接池中的最大空闲连接maxActive: 400# 连接池最大阻塞等待时间(使用负值表示没有限制)maxWait: -1mslettuce:pool:max-idle: 400min-idle: 100max-active: 400max-wait: -1ms

原RedisConfig配置类:

import com.alibaba.fastjson.support.spring.FastJsonRedisSerializer;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
import org.springframework.cache.annotation.EnableCaching;
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.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration
@EnableCaching
@AutoConfigureAfter(RedisAutoConfiguration.class)
public class RedisConfig {@Bean@ConditionalOnMissingBean(value = StringRedisTemplate.class, name = "stringRedisTemplate")public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory factory) {StringRedisTemplate template = new StringRedisTemplate();template.setConnectionFactory(factory);return template;}
}

现配置

现yml配置内容:

spring:redis:# 主节点master:host: 127.0.0.1port: 6379password: redis@123# 副本节点replicas:- host: 127.0.0.1port: 6380#连接超时时间(毫秒)timeout: 30000msjedis:# Redis服务器连接池pool:# 连接池最大连接数(使用负值表示没有限制)maxIdle: 400#连接池中的最小空闲连接minIdle: 100#连接池中的最大空闲连接maxActive: 400# 连接池最大阻塞等待时间(使用负值表示没有限制)maxWait: -1mslettuce:pool:max-idle: 400min-idle: 100max-active: 400max-wait: -1ms

现RedisConfig配置类:

import com.alibaba.fastjson.support.spring.FastJsonRedisSerializer;
import com.juxiao.xchat.manager.cache.properties.RedisMasterReplicaProperties;
import io.lettuce.core.ReadFrom;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisPassword;
import org.springframework.data.redis.connection.RedisStaticMasterReplicaConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration
@EnableCaching
@AutoConfigureAfter(RedisAutoConfiguration.class)
@EnableConfigurationProperties({RedisMasterReplicaProperties.class, RedisProperties.class})
public class RedisConfig {private final RedisMasterReplicaProperties properties;private final RedisProperties redisProperties;public RedisConfig(RedisMasterReplicaProperties redisMasterReplicaProperties, RedisProperties redisProperties) {this.properties = redisMasterReplicaProperties;this.redisProperties = redisProperties;}@Beanpublic LettuceConnectionFactory redisConnectionFactory() {RedisStaticMasterReplicaConfiguration config = new RedisStaticMasterReplicaConfiguration(properties.getMaster().getHost(), properties.getMaster().getPort());String password = properties.getMaster().getPassword();if (StringUtils.isNotBlank(password)) {config.setPassword(RedisPassword.of(password));}for (RedisMasterReplicaProperties.Node replica : properties.getReplicas()) {config.addNode(replica.getHost(), replica.getPort());}// 连接池配置LettucePoolingClientConfiguration.LettucePoolingClientConfigurationBuilder builder =LettucePoolingClientConfiguration.builder().commandTimeout(redisProperties.getTimeout());// 使用 application.yml 中的 lettuce.pool 参数RedisProperties.Pool poolProps = redisProperties.getLettuce().getPool();if (poolProps != null) {builder.poolConfig(poolConfig(poolProps));}// 优先从副本读取builder.readFrom(ReadFrom.REPLICA_PREFERRED);LettucePoolingClientConfiguration lettucePoolingClientConfiguration = builder.build();// 构建连接工厂LettuceConnectionFactory factory = new LettuceConnectionFactory(config, lettucePoolingClientConfiguration);// 禁用共享连接 默认是true// factory.setShareNativeConnection(false);return factory;}// 连接池参数绑定private GenericObjectPoolConfig<?> poolConfig(RedisProperties.Pool poolProps) {GenericObjectPoolConfig<?> config = new GenericObjectPoolConfig<>();config.setMaxTotal(poolProps.getMaxActive());config.setMaxIdle(poolProps.getMaxIdle());config.setMinIdle(poolProps.getMinIdle());config.setMaxWaitMillis(poolProps.getMaxWait().toMillis());return config;}@Bean@ConditionalOnMissingBean(value = StringRedisTemplate.class, name = "stringRedisTemplate")public StringRedisTemplate stringRedisTemplate(LettuceConnectionFactory redisConnectionFactory) {StringRedisTemplate template = new StringRedisTemplate();template.setConnectionFactory(redisConnectionFactory);return template;}
}

新增RedisMasterReplicaProperties配置类:

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;import java.util.ArrayList;
import java.util.List;@Data
@ConfigurationProperties(prefix = "spring.redis")
public class RedisMasterReplicaProperties {/*** 主节点*/private Node master;/*** 从节点*/private List<Node> replicas = new ArrayList<>();@Datapublic static class Node {/*** 主机地址*/private String host;/*** 端口*/private int port;/*** 密码(主从模式master、slave密码必须设置一样的)*/private String password;}
}

测试

    @Autowiredprivate StringRedisTemplate redisTemplate;@GetMapping("/test")public String test() {ValueOperations<String, String> opsedForValue = redisTemplate.opsForValue();opsedForValue.set("imu:test", "Hello6");String value = opsedForValue.get("imu:test");return value;}

LettuceConnectionFactory.setShareNativeConnection 方法的作用

代码中这一行被注释,保持了原本的默认配置true

// 禁用共享连接 默认是true
// factory.setShareNativeConnection(false);

在 Spring Data Redis 中,LettuceConnectionFactory 是一个用于管理 Redis 连接的工厂类,而 setShareNativeConnection(boolean shareNativeConnection) 方法用于控制是否 共享底层的 Redis 连接。

  • true(默认):
    适用于 大多数应用,多个 Redis 操作共享同一个底层连接,减少资源占用。
    适用于 Spring Boot + RedisTemplate 场景。
  • false:
    适用于 高并发、多线程环境,避免多个线程争抢同一个 Redis 连接。
    适用于 WebFlux、Reactive、Pipeline 等场景。

一般来说,除非你的 Redis 操作出现 多线程连接争用问题,否则 不用手动修改 setShareNativeConnection,保持默认值即可!🚀

而:

  • shareNativeConnection = true
    (默认)时,Spring 只会创建 一个共享的 StatefulRedisConnection,那么 连接池的 max-active、max-idle、min-idle 这些配置不会生效。
  • shareNativeConnection = false 时,每次请求都会新建连接,这时连接池才会管理多个连接,此时 max-active 等参数才会起作用。
    也就是说我们在yml配置文件中配置的连接池信息都将不起作用
    jedis:# Redis服务器连接池pool:# 连接池最大连接数(使用负值表示没有限制)maxIdle: 400#连接池中的最小空闲连接minIdle: 100#连接池中的最大空闲连接maxActive: 400# 连接池最大阻塞等待时间(使用负值表示没有限制)maxWait: -1mslettuce:pool:max-idle: 400min-idle: 100max-active: 400max-wait: -1ms

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

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

相关文章

git撤销最近一次commit

在Git中&#xff0c;在撤销最近一次的提交时&#xff0c;有几种不同的方法&#xff0c;这取决于你想要的结果。下面是一些常见的方法&#xff1a; 1. 取消最近的提交&#xff08;但不删除改动&#xff09; 如果你想要取消最近的提交&#xff0c;但是保留这些改动&#xff0c;以…

解决Docker 配置 daemon.json文件后无法生效

vim /etc/docker/daemon.json 在daemon中配置一下dns {"registry-mirrors": ["https://docker.m.daocloud.io","https://hub-mirror.c.163.com","https://dockerproxy.com","https://docker.mirrors.ustc.edu.cn","ht…

QML--全局对象Qt

在 QML 中&#xff0c;Qt 是一个内置的全局对象&#xff0c;提供了许多核心功能、工具函数、环境信息和类型构造方法。以下是 Qt 全局对象的详细分类和常见用途&#xff1a; 1. 工具函数 1.1 格式化与转换 Qt.formatDate(date, format) / Qt.formatTime(date, format) 格式化…

前端笔记-Vue3(下)

学习参考视频&#xff1a;尚硅谷Vue3入门到实战&#xff0c;最新版vue3TypeScript前端开发教程_哔哩哔哩_bilibili vue3学习目标&#xff1a; VUE 31、Vue3架构与设计理念2、组合式API&#xff08;Composition API&#xff09;3、常用API&#xff1a;ref、reactive、watch、c…

Git远程操作与标签管理

目录 1.理解分布式版本控制系统 2.远程仓库 3.新建远程仓库 4.克隆远程仓库 5.向远程仓库推送 6.拉取远程仓库 7.配置Git 7.1.忽略特殊文件 7.2.给命令配置别名 8.标签管理 8.1.理解标签 8.2.创建标签 8.3.操作标签 1.理解分布式版本控制系统 Git是目前世界上…

Vue3:component(组件:uniapp版本)

目录 一、基本概述二、基本使用(父传子)三、插槽四、子传父 一、基本概述 在项目的开发过程中&#xff0c;页面上井场会出现一些通用的内容&#xff0c;例如头部的导航栏&#xff0c;如果我们每一个页面都去写一遍&#xff0c;那实在是太繁琐了&#xff0c;所以&#xff0c;我…

C#语言实现PDF转Excel

实现效果 第三方库 ClosedXML iTextSharp 实现源码 using System.Text; using iTextSharp.text.pdf; using iTextSharp.text.pdf.parser; using System.Text.RegularExpressions; using ClosedXML.Excel;namespace PdfToExcel_winform {public partial class MainForm : For…

如何将IDP映射属性添加,到accountToken中 方便项目获取登录人信息

✅ 目标 你想要&#xff1a; 用户通过 IdP 登录&#xff08;SAML 或 OAuth2&#xff09;Keycloak 自动将 IdP 返回的属性&#xff08;如&#xff1a;email、name、role 等&#xff09;映射到用户账户中并把这些属性加入到用户登录返回的 Access Token 中&#xff0c;供业务系…

JSON-RPC远程控制

文章目录 &#x1f310; 一、什么是 JSON-RPC&#xff1f;&#x1f4ec; 二、通信过程1️⃣ 客户端发起请求2️⃣ 服务端处理请求&#xff0c;调用方法&#xff0c;返回结果 &#x1f4d1; 三、重要字段说明&#x1f6e0;️ 四、核心函数与概念&#xff08;结合你的代码&#x…

芝法酱躺平攻略(21)——kafka安装和使用

本节内容比较初级&#xff0c;故接着躺平攻略写 一、官网的下载 1.1 下载解压 首先&#xff0c;去官网下载jar包&#xff0c;放进linux中&#xff0c;解压到对应位置。 我的位置放在/WORK/MIDDLEWARE/kafka/4.0 1.2 常见配置 # 每个topic默认的分片数 num.properties4 # 数…

AutoSAR从概念到实践系列之MCAL篇(二)——Mcu模块配置及代码详解(上)

欢迎大家学习我的《AutoSAR从概念到实践系列之MCAL篇》系列课程,我是分享人M哥,目前从事车载控制器的软件开发及测试工作。 学习过程中如有任何疑问,可底下评论! 如果觉得文章内容在工作学习中有帮助到你,麻烦点赞收藏评论+关注走一波!感谢各位的支持! 根据上一篇内容中…

easypoi 实现word模板导出

特此非常致谢&#xff1a;easypoi实现word模板 基础的可以参考上文&#xff1b; 但是我的需求有一点点不一样。 这是我的模板&#xff1a;就是我的t.imgs 是个list 但是很难过的是easy poi 我弄了一天&#xff0c;我都没有弄出来嵌套list循环怎么输出显示&#xff0c;更难过…

Unity中数据存储_LitJson

文章目录 LitJson一&#xff1a;介绍二&#xff1a;特点三&#xff1a;使用四&#xff1a;注意事项 LitJson 一&#xff1a;介绍 LitJson 是一个专为 .NET 设计的轻量级 JSON 处理库&#xff0c;支持序列化和反序列化 JSON 数据。 二&#xff1a;特点 快速且轻量 无外部依赖…

2025年首届人形机器人半程马拉松比赛(附机器人照片)

2025年4月19日&#xff0c;北京亦庄半程马拉松暨人形机器人半场马拉松正式开赛&#xff0c;作为全球首届人形机器人户外跑步成功举办&#xff0c;21.0975公里的户外路程对人形机器人来讲&#xff0c;注定将成为历史性开篇&#xff0c;如果赛事能够持续举办&#xff0c;那举办意…

网络安全职业技能大赛Server2003

通过本地PC中渗透测试平台Kali对服务器场景Windows进⾏系统服务及版本扫描渗透测 试&#xff0c;并将该操作显示结果中Telnet服务对应的端⼝号作为FLAG提交 使用nmap扫描发现目标靶机开放端口232疑似telnet直接进行连接测试成功 Flag&#xff1a;232 通过本地PC中渗透测试平台…

[java八股文][Java基础面试篇]I/O

Java怎么实现网络IO高并发编程&#xff1f; 可以用 Java NIO &#xff0c;是一种同步非阻塞的I/O模型&#xff0c;也是I/O多路复用的基础。 传统的BIO里面socket.read()&#xff0c;如果TCP RecvBuffer里没有数据&#xff0c;函数会一直阻塞&#xff0c;直到收到数据&#xf…

Python常用的第三方模块之【jieba库】支持三种分词模式:精确模式、全模式和搜索引擎模式(提高召回率)

Jieba 是一个流行的中文分词Python库&#xff0c;它提供了三种分词模式&#xff1a;精确模式、全模式和搜索引擎模式。精确模式尝试将句子最精确地切分&#xff0c;适合文本分析&#xff1b;全模式则扫描文本中所有可能的词语&#xff0c;速度快但存在冗余&#xff1b;搜索引擎…

QT6 源(37):界面组件的总基类 QWidget 的源码阅读(下,c++ 代码部分)

&#xff08;1&#xff09; QT 在 c 的基础上增加了自己的编译器&#xff0c;以支持元对象系统和 UI 界面设计&#xff0c;有 MOC 、 UIC 等 QT 自己的编译器。本节的源代码里&#xff0c;为了减少篇幅&#xff0c;易于阅读&#xff0c;去除了上篇中的属性部分&#xff0c; 上篇…

rabbitmq-spring-boot-start版本优化升级

文章目录 1.前言2.优化升级内容3.依赖4.使用4.1发送消息代码示例4.2消费监听代码示例4.3 brock中的消息 5.RabbmitMq的MessageConverter消息转换器5.1默认行为5.2JDK 序列化的缺点5.3使用 JSON 进行序列化 6.总结 1.前言 由于之前手写了一个好用的rabbitmq-spring-boot-start启…

git lfs下载大文件限额

起因是用 model.load_state_dict(torch.load())加载pt权重文件时&#xff0c;出现错误&#xff1a;_pickle.UnpicklingError: invalid load key, ‘v’. GPT告诉我&#xff1a;你的 pt 文件不是权重文件&#xff0c;而是模型整体保存&#xff08;或根本不是 PyTorch 文件&#…