最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文詳解SpringBoot如何切換Redis的DB

 更新時間:2025年12月11日 08:48:43   作者:weixin_46244623  
這篇文章主要為大家詳細介紹了Spring Redis動態(tài)切換數據庫的核心機制,并指出僅調用setDatabase()和resetConnection()無法真正切換數據庫的根本原因,感興趣的小伙伴可以了解下

本文深入解析了Spring Redis動態(tài)切換數據庫的核心機制,指出僅調用setDatabase()和resetConnection()無法真正切換數據庫的根本原因。關鍵在于必須調用afterPropertiesSet()方法,該方法會重新初始化連接工廠、重建連接池,使新的database配置完全生效。文章提供了生產可用的動態(tài)切庫標準寫法,并警告缺少這一步驟將導致數據錯亂、連接池混亂等問題。同時提醒避免頻繁切庫和并發(fā)操作,建議為每個DB單獨配置RedisTemplate。下面我們就來深入了解下吧

afterPropertiesSet() 深度解析

Spring Redis 動態(tài)切換數據庫時,真正讓切庫生效的關鍵:afterPropertiesSet() 深度解析

在使用 Spring Data Redis(Lettuce 客戶端)時,許多開發(fā)者會遇到一個經典需求:在運行期動態(tài)切換 Redis 的 database(db index)。

常見的代碼類似這樣:

LettuceConnectionFactory connectionFactory =
        (LettuceConnectionFactory) redisTemplate.getConnectionFactory();
connectionFactory.setDatabase(num);
redisTemplate.setConnectionFactory(connectionFactory);
connectionFactory.resetConnection();
connectionFactory.afterPropertiesSet();

網上很多文章都告訴你:

  • 調用 setDatabase(num) 修改數據庫
  • 或者調用 resetConnection() 重建連接

但實際運行時你會發(fā)現(xiàn)一個反?,F(xiàn)象:

你明明把 database 切到 2,結果寫的數據還是落到 DB 0。

原因是什么?關鍵就在于——真正讓切庫生效的是 afterPropertiesSet(),不是其它方法。

本文將從源碼、連接池行為、RedisTemplate 機制等方面,深入解析這個關鍵點,并給出一套可直接投入生產的動態(tài)切庫方案。

setDatabase() ≠ 切換數據庫

首先要明確一點:

setDatabase() 只是修改了“屬性值”,絕不會影響已經存在的連接池和連接。

為什么?

因為 LettuceConnectionFactory 內部采用的是 長連接池機制,連接是在 Bean 初始化完成后創(chuàng)建的,而不是在屬性變更時動態(tài)調整。

所以:

  • 你 setDatabase(2),連接池根本不會重建
  • RedisTemplate 依舊復用舊連接
  • Redis 命令仍然落在舊的 DB

這就是為什么 “setDatabase 看似成功,但其實沒生效”。

resetConnection() 也不夠,它只是“斷開舊連接”

那 resetConnection() 能解決嗎?依然不行。

它的作用是:

  • 關閉舊連接
  • 清理當前連接資源

但它 不會重新初始化連接池,也不會重新構建 RedisURI、ClientOptions、PoolConfig 等底層配置。

簡單說:

方法做了什么是否讓切庫生效
setDatabase()改屬性? 不生效
resetConnection()關連接? 不生效
afterPropertiesSet()重新初始化連接工廠 + 重建連接池??? 切庫真正生效

afterPropertiesSet() 才是“真正生效”的核心

afterPropertiesSet() 是 Spring Bean 初始化方法,會在容器啟動時自動觸發(fā)一次。

關鍵是:

當你修改 connectionFactory 的配置后,必須再主動調用一次 afterPropertiesSet(),才能讓新的配置真正用于構建新的連接池。

它會做的事情包括:

  • 重建 RedisURI(其中包含 database index)
  • 重建 LettuceClientConfiguration
  • 重建 NettyClientResources
  • 重建連接池
  • RedisTemplate 獲取的新連接全部指向新數據庫

所以:

afterPropertiesSet() 才是動態(tài)切庫中唯一真正關鍵的步驟。

沒有它,其他方法都只能修改表面,看起來改了,實際上沒用。

動態(tài)切庫的標準寫法(生產可用)

public void switchDb(int num) {
    LettuceConnectionFactory connectionFactory =
            (LettuceConnectionFactory) redisTemplate.getConnectionFactory();

    // 1. 修改數據庫 index
    connectionFactory.setDatabase(num);

    // 2. 重新設置到 RedisTemplate(否則模板繼續(xù)持有舊連接工廠)
    redisTemplate.setConnectionFactory(connectionFactory);

    // 3. 清空舊連接
    connectionFactory.resetConnection();

    // 4. 最關鍵的一步:重新初始化連接工廠
    connectionFactory.afterPropertiesSet();
}

沒調用 afterPropertiesSet() 將出現(xiàn)什么問題?

假設你原來在 DB 0,切到 DB 2:

switchDb(2);
redisTemplate.opsForValue().set("test", "A");

如果缺少 afterPropertiesSet(),會出現(xiàn):

  • 數據依然寫入 DB 0
  • RedisTemplate 仍持有舊連接
  • 并發(fā)下連接池混亂,導致不可控 bug
  • 緩存錯亂,數據跨庫寫入

許多開發(fā)者踩坑正是因為缺少這一步。

深入到源碼(為什么 afterPropertiesSet 能生效?)

afterPropertiesSet() 最重要的操作是:

this.client = createClient();
this.connectionProvider = new LettuceConnectionProvider(client, redisURI);
this.pool = createConnectionPool(redisURI, clientConfiguration);

完全重新構建了:

  • DefaultClientResources
  • RedisURI(含新 database)
  • StateAwareConnectionPool
  • ConnectionProvider

這意味著:

原來的連接全部失效,新的連接全部基于新 database 構建。

生產環(huán)境動態(tài)切庫有哪些注意事項

別頻繁切庫

每次切庫都會重建連接池,開銷很大。

多線程環(huán)境要避免并發(fā)切庫

同一套 RedisTemplate 不適合“多人同時改庫”,應考慮:

  • 每個 DB 一個 RedisTemplate
  • 或者一個切庫請求只使用一次 RedisTemplate

結語

動態(tài)切換 Redis 數據庫是一個看似簡單但極易踩坑的操作。大多數錯誤并不是代碼寫錯,而是:

以為 setDatabase + resetConnection 就能切庫,但沒有意識到 連接池需要重建。

核心原因只有一句話:

afterPropertiesSet() 才是真正讓 Redis 切庫生效的關鍵步驟,它重新構建了所有連接資源。

到此這篇關于一文詳解SpringBoot如何切換Redis的DB的文章就介紹到這了,更多相關SpringBoot切換Redis DB內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Spring Boot 連接LDAP的方法

    Spring Boot 連接LDAP的方法

    這篇文章主要介紹了Spring Boot 連接LDAP的方法,僅僅涉及基本的使用ODM來快速實現(xiàn)LDAP增刪改查操作。具有一定的參考價值,有興趣的可以了解一下
    2017-12-12
  • Java中HashMap集合的常用方法詳解

    Java中HashMap集合的常用方法詳解

    本篇文章給大家?guī)淼膬热菔顷P于Java中HashMap集合的常用方法詳解,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。下面我們就來學習一下吧
    2021-11-11
  • MyBatis中多條件查詢商品的三種方法及區(qū)別

    MyBatis中多條件查詢商品的三種方法及區(qū)別

    本文主要介紹了MyBatis中多條件查詢商品的三種方法及區(qū)別,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • idea 實現(xiàn)git rebase操作應用場景

    idea 實現(xiàn)git rebase操作應用場景

    本文結合idea工具進行rebase的各種場景的操作,借助工具更能直觀地觀察到分支之間地操作差異,方便我們理解rebase的各種操作以及場景的使用,對idea  git rebase操作知識感興趣的朋友一起看看吧
    2024-01-01
  • Java實現(xiàn)獲取小程序帶參二維碼并保存到本地

    Java實現(xiàn)獲取小程序帶參二維碼并保存到本地

    這篇文章主要介紹了Java實現(xiàn)獲取小程序帶參二維碼并保存到本地,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Hadoop使用hdfs指令查看hdfs目錄的根目錄顯示被拒的原因及解決方案

    Hadoop使用hdfs指令查看hdfs目錄的根目錄顯示被拒的原因及解決方案

    這篇文章主要介紹了Hadoop使用hdfs指令查看hdfs目錄的根目錄顯示被拒的原因及解決方案,分布式部署hadoop,服務機只有namenode節(jié)點,主機包含其他所有節(jié)點,本文給大家介紹的非常詳細,需要的朋友可以參考下
    2023-10-10
  • Java使用MethodHandle來替代反射,提高性能問題

    Java使用MethodHandle來替代反射,提高性能問題

    這篇文章主要介紹了Java使用MethodHandle來替代反射,提高性能問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • Java多線程中的CountDownLatch解析

    Java多線程中的CountDownLatch解析

    這篇文章主要介紹了Java多線程中的CountDownLatch解析,CountDownLatch是一個阻塞部分線程直到其他線程執(zhí)行完成后喚醒的同步計數器,核心是其內部類Sync繼承于AQS,同時也是利用的AQS的同步原理,也稱之為閉鎖,需要的朋友可以參考下
    2023-11-11
  • Java字符串數字左右補全0的四種方式

    Java字符串數字左右補全0的四種方式

    這篇文章主要給大家介紹了關于Java字符串數字左右補全0的四種方式,在編程中有時候我們需要對一個字符串進行字符填充,以滿足某些特定的要求,其中補全0是一種常見的需求,需要的朋友可以參考下
    2023-08-08
  • 詳解關于mybatis-plus中Service和Mapper的分析

    詳解關于mybatis-plus中Service和Mapper的分析

    這篇文章主要介紹了詳解關于mybatis-plus中Service和Mapper的分析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09

最新評論

文成县| 九台市| 金门县| 杭锦后旗| 开江县| 富民县| 泽州县| 阿拉尔市| 商都县| 美姑县| 大城县| 新宁县| 武穴市| 土默特左旗| 滕州市| 峨眉山市| 盖州市| 饶阳县| 四会市| 巨鹿县| 健康| 松江区| 西乡县| 大化| 江西省| 沅江市| 神农架林区| 河西区| 申扎县| 榆树市| 枞阳县| 深泽县| 拉萨市| 九龙城区| 万载县| 淄博市| 阿拉善右旗| 晋城| 馆陶县| 保靖县| 沾益县|