当前位置: 首页 > java >正文

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.xdnf.cn/news/1519.html

相关文章:

  • Java基础系列-HashMap源码解析2-AVL树
  • Java内存模型之JMM
  • NEUOJ网格路径
  • 本地服务器 Odoo 安装指南,并实现公网访问
  • MySQL基础增删改
  • LeetCode-47. 全排列 II
  • 杰理ac792开发板按键不起效果
  • ElasticSearch:高并发场景下如何保证读写一致性?
  • 搭建TypeScript单元测试环境
  • 高性能全闪存储在大模型训练与推理中的效率提升作用
  • HTTP 请求头的 key 不区分大小写。
  • 接口测试和功能测试详解
  • 【AI】Windows环境安装SPAR3D单图三维重建心得
  • 玩转Docker | 使用Docker部署Neko自托管浏览器
  • Chronos - 时间序列预测语言模型
  • SwiftUI 1.Text介绍和使用
  • Elasticsearch 报错 Limit of total fields [1000] has been exceeded
  • SwiftUI 3.Button介绍和使用
  • Python爬虫学习:高校数据爬取与可视化
  • UIAutomator 与 Playwright 在 AI 自动化中的界面修改对比
  • Java学习手册:Web 安全基础
  • MyBatis 升级至 MyBatis-Plus 详细步骤
  • 常用嵌入式软件代码编码规范的关系和覆盖
  • 海康NVR配置NAS-TrueNAS
  • Mysql 简单数据查询
  • 知识储备-后仿
  • AtCoder Beginner Contest 402题解
  • Pillow库中的convert(“L“)彩色图像转换灰度图像详解~
  • 2026《数据结构》考研复习笔记六(串的KMP算法)
  • 【网工第6版】第5章 网络互联⑥