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.pswp.cn/pingmian/77975.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/77975.shtml
英文地址,請注明出處:http://en.pswp.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 文件&#…