日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

Jedis連接池究竟是何物

來源: 責(zé)編: 時(shí)間:2023-12-26 09:30:25 325觀看
導(dǎo)讀一、前言連接池的用途實(shí)際上有過開發(fā)經(jīng)驗(yàn)的朋友都已經(jīng)比較清楚了,當(dāng)資源對象的創(chuàng)建/銷毀比較耗時(shí)的場景下,可以通過"池化"技術(shù),達(dá)到資源的復(fù)用,以此來減少系統(tǒng)的開銷、增大系統(tǒng)吞吐量,比如數(shù)據(jù)庫連接池、線程池、Redis 連

一、前言

連接池的用途實(shí)際上有過開發(fā)經(jīng)驗(yàn)的朋友都已經(jīng)比較清楚了,當(dāng)資源對象的創(chuàng)建/銷毀比較耗時(shí)的場景下,可以通過"池化"技術(shù),達(dá)到資源的復(fù)用,以此來減少系統(tǒng)的開銷、增大系統(tǒng)吞吐量,比如數(shù)據(jù)庫連接池、線程池、Redis 連接池等都是使用的該方式,而我們在開發(fā)場景中使用較為廣泛的 Jedis 就是使用了 GenericObjectPool 作為它底層的連接池實(shí)現(xiàn)。dTi28資訊網(wǎng)——每日最新資訊28at.com

二、原理概述

dTi28資訊網(wǎng)——每日最新資訊28at.com

圖示

dTi28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片dTi28資訊網(wǎng)——每日最新資訊28at.com

  • BorrowObject

業(yè)務(wù)模塊通過 BorrowObject 方法從空閑連接隊(duì)列中獲取空閑連接,最長會(huì)等待 maxWaitMillis 毫秒,如果拿不到則走 Create。dTi28資訊網(wǎng)——每日最新資訊28at.com

  • ReturnObject
  • 把連接重新放回到 IdleObjects 隊(duì)列中。dTi28資訊網(wǎng)——每日最新資訊28at.com

dTi28資訊網(wǎng)——每日最新資訊28at.com

類結(jié)構(gòu)

圖片圖片dTi28資訊網(wǎng)——每日最新資訊28at.com

dTi28資訊網(wǎng)——每日最新資訊28at.com

Jedis里如何使用的

dTi28資訊網(wǎng)——每日最新資訊28at.com

一般情況下我們在 Spring Boot 應(yīng)用中會(huì)通過 Spring-Data-Redis 來使用 Redis,而在業(yè)務(wù)層會(huì)通過 RedisTemplate 來進(jìn)行 Redis 的操作,但是 RedisTemplate 是怎么來的呢?可以看到當(dāng)我們引入 Spring-Data-Redis 時(shí),就會(huì)引入 RedisAutoConfiguration,這個(gè) AutoConfiguration 定義了,當(dāng)我們存在 Jedis 的配置時(shí)且不存在 RedisTempalte 的 Bean 實(shí)例時(shí)會(huì)自動(dòng)創(chuàng)建 Bean,核心代碼如下圖。

圖片圖片dTi28資訊網(wǎng)——每日最新資訊28at.com

而 RedisConnectionFactory 的其中一個(gè)實(shí)現(xiàn)就是 JedisConnectionFactory,其中就包含了 Pool。dTi28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片dTi28資訊網(wǎng)——每日最新資訊28at.com

而 Pool 本身內(nèi)部就能看到我們真正的主角。dTi28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片dTi28資訊網(wǎng)——每日最新資訊28at.com

捋一下其中的關(guān)系,我們常用的 Spring-Data-Redis 的 Jedis 實(shí)現(xiàn)最終是通過以下的層級結(jié)構(gòu)來使用 GenericObjectPool 的。dTi28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片dTi28資訊網(wǎng)——每日最新資訊28at.com

三、深入分析

dTi28資訊網(wǎng)——每日最新資訊28at.com

參數(shù)說明

dTi28資訊網(wǎng)——每日最新資訊28at.com

如上述類結(jié)構(gòu)所示,GenericObjectPool 都是在 GenericObjectPoolConfig 或 BaseObjectPoolConfig 中進(jìn)行配置相關(guān)參數(shù)的,其中核心參數(shù)以及默認(rèn)值如下:dTi28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片dTi28資訊網(wǎng)——每日最新資訊28at.com

上圖對這些參數(shù)按顏色進(jìn)行了一個(gè)歸類:dTi28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片dTi28資訊網(wǎng)——每日最新資訊28at.com

這里需要注意的是,雖然 GenericObjectPool 支持我們配的參數(shù)較多,但是 Spring-Data-Redis 將這部分參數(shù)收斂了,具體可供我們修改的只有表格上面的這部分內(nèi)容,其他參數(shù),有一部分在 JedisPoolConfig 類中,繼承了 GenericObjectPoolConfig 進(jìn)行了修改,比如 Spring-Data-Redis 就修改了以下參數(shù)的默認(rèn)值。dTi28資訊網(wǎng)——每日最新資訊28at.com

testWhileIdle=truedTi28資訊網(wǎng)——每日最新資訊28at.com

minEvictableIdleTimeMillis=60000dTi28資訊網(wǎng)——每日最新資訊28at.com

timeBetweenEvictinotallow=30000dTi28資訊網(wǎng)——每日最新資訊28at.com

numTestsPerEvictinotallow=-1dTi28資訊網(wǎng)——每日最新資訊28at.com

dTi28資訊網(wǎng)——每日最新資訊28at.com

核心方法

dTi28資訊網(wǎng)——每日最新資訊28at.com

本文只會(huì)針對方法的一些核心鏈路進(jìn)行說明,如想知道更多細(xì)節(jié),針對源碼解析的可以在網(wǎng)上搜索其他相關(guān)文章或是到我的參考鏈接里進(jìn)行翻看。dTi28資訊網(wǎng)——每日最新資訊28at.com

dTi28資訊網(wǎng)——每日最新資訊28at.com

dTi28資訊網(wǎng)——每日最新資訊28at.com

BorrowObject

  • 超時(shí)時(shí)間怎么用的?

該方法用于從連接池中獲取一個(gè)空閑對象,它有可能是從空閑池中直接獲取的,或是直接創(chuàng)建出來的,如果第一次從空閑對象中沒有獲取到,會(huì)走創(chuàng)建后重新獲取,此時(shí)如果對象池目前配置的 BlockWhenExhausted=true,那么就會(huì)受 maxWaitMillis 參數(shù)所配置的超時(shí)時(shí)間所控制,如果超過了超時(shí)時(shí)間,都沒拿到一個(gè)空閑的對象,則會(huì)直接拋出異常。dTi28資訊網(wǎng)——每日最新資訊28at.com

  • testOnBorrow 和 testOnCreate 的使用場景

當(dāng)獲取到一個(gè)對象后,由于對象池中往往存放的是諸如數(shù)據(jù)庫連接、Redis 連接等創(chuàng)建時(shí)較為耗時(shí)的資源,但是因?yàn)檫B接本身是復(fù)用的,如果 MySQL/Redis Server 端如果因?yàn)槟承┰驍嚅_/釋放了該鏈接,那么此時(shí)拿到的對象就是個(gè)無效的對象,因此在 borrowObject 階段會(huì)判定,如果:dTi28資訊網(wǎng)——每日最新資訊28at.com

testOnBorrow=true || (create && testOnCreate=true)

就會(huì)走到:dTi28資訊網(wǎng)——每日最新資訊28at.com

factory.validateObject

這里如何進(jìn)行 validateObject 的,是由上層使用對象池的場景所決定的,比如在 Jedis 場景中,會(huì)向 Redis Server 發(fā)送一個(gè) Ping 命令,如果 Server 返回了 Pong,則認(rèn)為該連接仍然有效,可以給業(yè)務(wù)層使用。dTi28資訊網(wǎng)——每日最新資訊28at.com

但是!!!!!!dTi28資訊網(wǎng)——每日最新資訊28at.com

線上環(huán)境千萬不要配置 testOnBorrow=true 或是 testOnCreate=true。dTi28資訊網(wǎng)——每日最新資訊28at.com

每個(gè)對象的獲取都需要先校驗(yàn)再拿,會(huì)大大增加單次請求的 RT。dTi28資訊網(wǎng)——每日最新資訊28at.com

dTi28資訊網(wǎng)——每日最新資訊28at.com

dTi28資訊網(wǎng)——每日最新資訊28at.com

ReturnObjectdTi28資訊網(wǎng)——每日最新資訊28at.com

  • testOnReturn 的使用場景

實(shí)際上 testOnReturn 的使用場景與上述 borrowObject 時(shí)的 testOnBorrow 是類似的,只是testOnReturn就是一個(gè)歸還對象的操作。同理,線上千萬不要配置 testOnReturn=true。dTi28資訊網(wǎng)——每日最新資訊28at.com

  • 什么時(shí)候歸還,什么時(shí)候銷毀?

對象池中維護(hù)了一個(gè)結(jié)構(gòu)為 LinkedBlockingDeque,名為 IdleObjects 的對象用于維護(hù)空閑對象隊(duì)列,且是否歸或銷毀的判斷邏輯如下:dTi28資訊網(wǎng)——每日最新資訊28at.com

final int maxIdleSave = getMaxIdle();if (isClosed() || maxIdleSave > -1 && maxIdleSave <= idleObjects.size()) {  ...銷毀對象}else{  ...返還至idleObjects}

如果:dTi28資訊網(wǎng)——每日最新資訊28at.com

  • 對象池已經(jīng)關(guān)閉(只要是程序在運(yùn)行,且正常使用,不會(huì)關(guān)閉)

dTi28資訊網(wǎng)——每日最新資訊28at.com

  • 配置了 maxIdle 且空閑對象列表數(shù)量 >=maxIdle

則對象會(huì)被銷毀,否則對象會(huì)重新回到 IdleObjects 中。dTi28資訊網(wǎng)——每日最新資訊28at.com

四、內(nèi)部機(jī)制

dTi28資訊網(wǎng)——每日最新資訊28at.com

Evict(定期驅(qū)逐/保活機(jī)制)

dTi28資訊網(wǎng)——每日最新資訊28at.com

  • 周期怎么定?

當(dāng) timeBetweenEvictionRunsMillis 配置 >0 時(shí),在 GenericObjectPool 所繼承的基類中,會(huì)啟一個(gè)周期性執(zhí)行的線程,它的執(zhí)行周期就是 timeBetweenEvictionRunsMillis 的值。dTi28資訊網(wǎng)——每日最新資訊28at.com

  • 為什么要驅(qū)逐?

當(dāng)空閑對象過多,對于客戶端或服務(wù)端的 TCP 連接維護(hù)來講,本身就是一個(gè)開銷,因此,需要有一個(gè)規(guī)則,當(dāng)有一些對象實(shí)在太空閑了,就把它們踢掉。dTi28資訊網(wǎng)——每日最新資訊28at.com

  • 哪些對象應(yīng)該被驅(qū)逐?

首先會(huì)從空閑對象列表中挑選出一部分對象,而這個(gè)挑選過程本身也有一個(gè)規(guī)則,它受 numTestsPerEvictionRun 參數(shù)控制。dTi28資訊網(wǎng)——每日最新資訊28at.com

當(dāng) numTestsPerEvictionRun>0,會(huì)挑選出 numTestsPerEvictionRun 數(shù)量的空閑連接進(jìn)行檢查。dTi28資訊網(wǎng)——每日最新資訊28at.com

當(dāng) numTestsPerEvictionRun<0 時(shí),首先會(huì)對 numTestsPerEvictionRun 取絕對值,再然后挑選出空閑數(shù)量 /numTestsPerEvictionRun 絕對值的數(shù)量進(jìn)行檢查,舉個(gè)例子,如果 numTestsPerEvictinotallow=-2,就會(huì)挑選出一半進(jìn)行檢查。dTi28資訊網(wǎng)——每日最新資訊28at.com

  • 驅(qū)逐檢查怎么做?

本身驅(qū)逐檢查的實(shí)現(xiàn)方式是支持自定義的,也就是 evictionPolicy 參數(shù),但是往往只會(huì)選擇用默認(rèn)的實(shí)現(xiàn),也就是 DefaultEvictionPolicy,它的驅(qū)逐檢查策略如下:dTi28資訊網(wǎng)——每日最新資訊28at.com

if ((config.getIdleSoftEvictTime() < underTest.getIdleTimeMillis() &&        config.getMinIdle() < idleCount) ||        config.getIdleEvictTime() < underTest.getIdleTimeMillis()) {    return true;}return false;

underTest 為被檢查對象,當(dāng)存在以下場景時(shí),滿足驅(qū)逐檢查規(guī)則,會(huì)觸發(fā)驅(qū)逐。dTi28資訊網(wǎng)——每日最新資訊28at.com

underTest 的空閑時(shí)間 > softMinEvictableIdleTimeMillis 且當(dāng)前空閑對象數(shù)量 > minIdle 或 underTest 的空閑時(shí)間 > minEvictableIdleTimeMillis。dTi28資訊網(wǎng)——每日最新資訊28at.com

Tips:有一些好奇的同學(xué)可能會(huì)問,對象的空閑時(shí)間是怎么算的?dTi28資訊網(wǎng)——每日最新資訊28at.com

池中的對象本身會(huì)維護(hù)一個(gè) lastReturnTime 的時(shí)間戳,它會(huì)隨著對象每一次 returnObject 時(shí)進(jìn)行更新,當(dāng)獲取對象空閑時(shí)間時(shí),只要它還是在空閑對象中,那么用當(dāng)前時(shí)間戳 -lastReturnTime 就是認(rèn)為該對象的空閑時(shí)間。dTi28資訊網(wǎng)——每日最新資訊28at.com

  • 驅(qū)逐與保活的關(guān)系是怎么樣的?

由于前面提到過,不能配置 testOnBorrow 和 testOnReturn,那么如果 Server 端的鏈接直接斷開了,怎么能保證池中對象的有效性呢?如果讓調(diào)用端調(diào)用時(shí)再觸發(fā),會(huì)不會(huì)太晚了呢?這時(shí)候就有個(gè)參數(shù) testWhileIdle,當(dāng)此參數(shù)打開時(shí),就代表會(huì)在對象空閑時(shí)進(jìn)行對象可用性檢查,具體代碼如下:dTi28資訊網(wǎng)——每日最新資訊28at.com

if (evict) {    destroy(underTest);    destroyedByEvictorCount.incrementAndGet();} else {    if (testWhileIdle) {        try {            factory.activateObject(underTest);        } catch (final Exception e) {            destroy(underTest);            destroyedByEvictorCount.incrementAndGet();        }    }}

這里隱掉了一些相關(guān)的非核心邏輯,這里可以看到 testWhileIdle 的保活機(jī)制實(shí)際上和 evict 是配套使用的,如果被檢查對象需要被驅(qū)逐,也就是 evict=true,則會(huì)直接 destory 對象,否則它會(huì)判定 testWhileIdle 的狀態(tài),此時(shí)如果 testWhileIdle=true,那么就會(huì)激活一下對象,具體激活的方式是由使用對象池的上層工廠所決定的。dTi28資訊網(wǎng)——每日最新資訊28at.com

dTi28資訊網(wǎng)——每日最新資訊28at.com

Test(檢查機(jī)制)

dTi28資訊網(wǎng)——每日最新資訊28at.com

本身 GenericObjectPool 為了保證在池子中的對象有效性,會(huì)允許上層分別在幾個(gè)節(jié)點(diǎn)進(jìn)行對象的有效性檢查,分別是:
testOnBorrow、testOnReturn、testOnCreate。

這幾個(gè)基本看名字就知道是什么意思了,在前面講 borrowObject 和 returnObject 的時(shí)候也有提到,還有一個(gè)相對比較特別的是:dTi28資訊網(wǎng)——每日最新資訊28at.com

testWhileIdle。dTi28資訊網(wǎng)——每日最新資訊28at.com

該參數(shù)目的是為了對象在空閑期間可以進(jìn)行檢查,而它的觸發(fā)實(shí)際上是和 evict(定期驅(qū)逐機(jī)制)聯(lián)合起來進(jìn)行使用的。dTi28資訊網(wǎng)——每日最新資訊28at.com

dTi28資訊網(wǎng)——每日最新資訊28at.com

Abandoned(拋棄機(jī)制)

dTi28資訊網(wǎng)——每日最新資訊28at.com

實(shí)際上在提到配置參數(shù)、BorrowObject 時(shí),還有一個(gè)機(jī)制,稱之為 Abandoned,由于本文的契機(jī)是因?yàn)?Jedis 的問題分析所寫,而 Jedis 連接池并不支持配置 Abandoned,所以本文暫不做解析,或者感興趣的可以自己到上面講的源碼路徑去看一下,本身這個(gè)機(jī)制的理解也不是特別復(fù)雜。

五、排障方式

本身 GenericObjectPool 默認(rèn)會(huì)把自己的一些參數(shù)通過 JMX 的方式進(jìn)行注冊,那么我們可以通過 Jvisualvm 進(jìn)行查看,或是通過 Arthas,輸入如下命令:dTi28資訊網(wǎng)——每日最新資訊28at.com

mbean org.apache.commons.pool2:type=GenericObjectPool,name=pool-redisConnectionFactory
可以獲取到對象池當(dāng)前的一些屬性,如下圖:

圖片圖片dTi28資訊網(wǎng)——每日最新資訊28at.com

其中對于優(yōu)化比較有用的就是 CreatedCount(創(chuàng)建對象的數(shù)量)、DestoryedCount(對象銷毀的對象)、DestoryedByEvictorCount(因?yàn)轵?qū)逐機(jī)制而被銷毀的對象數(shù)量)。dTi28資訊網(wǎng)——每日最新資訊28at.com

六、總結(jié)

上述文章以 Jedis 為引,分析了 GenericObjectPool 連接池的底層原理以及 Jedis 是如何使用該連接池的,并且結(jié)合了 Arthas 分享了一個(gè)簡單的排障方式,實(shí)際上如果知道了 GenericObjectPool 連接池的原理,其他連接池也是大同小異,本文希望拋磚引玉,帶大家對于連接池的底層實(shí)現(xiàn)有個(gè)基本概念,相信以后遇到此類問題也會(huì)有分析的思路,不再迷茫~dTi28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-54175-0.htmlJedis連接池究竟是何物

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: Java中的序列化和反序列化它們的作用和用途是什么?

下一篇: 20行經(jīng)典C代碼,很多人看不明白,你來試一下?

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 7月安卓手機(jī)好評榜:三星S23Ultra好評率第一

    性能榜和性價(jià)比榜之后,我們來看最后的安卓手機(jī)好評榜,數(shù)據(jù)來源安兔兔評測,收集時(shí)間2023年7月1日至7月31日,僅限國內(nèi)市場。第一名:三星Galaxy S23 Ultra好評率:95.71%在即將迎來新
  • 三言兩語說透設(shè)計(jì)模式的藝術(shù)-簡單工廠模式

    一、寫在前面工廠模式是最常見的一種創(chuàng)建型設(shè)計(jì)模式,通常說的工廠模式指的是工廠方法模式,是使用頻率最高的工廠模式。簡單工廠模式又稱為靜態(tài)工廠方法模式,不屬于GoF 23種設(shè)計(jì)
  • 之家push系統(tǒng)迭代之路

    前言在這個(gè)信息爆炸的互聯(lián)網(wǎng)時(shí)代,能夠及時(shí)準(zhǔn)確獲取信息是當(dāng)今社會(huì)要解決的關(guān)鍵問題之一。隨著之家用戶體量和內(nèi)容規(guī)模的不斷增大,傳統(tǒng)的靠"主動(dòng)拉"獲取信息的方式已不能滿足用
  • 虛擬鍵盤 API 的妙用

    你是否在遇到過這樣的問題:移動(dòng)設(shè)備上有一個(gè)固定元素,當(dāng)激活虛擬鍵盤時(shí),該元素被隱藏在了鍵盤下方?多年來,這一直是 Web 上的默認(rèn)行為,在本文中,我們將探討這個(gè)問題、為什么會(huì)發(fā)生
  • JVM優(yōu)化:實(shí)戰(zhàn)OutOfMemoryError異常

    一、Java堆溢出堆內(nèi)存中主要存放對象、數(shù)組等,只要不斷地創(chuàng)建這些對象,并且保證 GC Roots 到對象之間有可達(dá)路徑來避免垃 圾收集回收機(jī)制清除這些對象,當(dāng)這些對象所占空間超過
  • 新電商三兄弟,“抖快紅”成團(tuán)!

    來源:價(jià)值研究所作 者:Hernanderz 隨著內(nèi)容電商的概念興起,抖音、快手、小紅書組成的&ldquo;新電商三兄弟&rdquo;成為業(yè)內(nèi)一股不可忽視的勢力,給阿里、京東、拼多多帶去了巨大壓
  • 網(wǎng)紅炒股不為了賺錢,那就是耍流氓!

    來源:首席商業(yè)評論6月26日高調(diào)宣布入市,網(wǎng)絡(luò)名嘴大v胡錫進(jìn)居然進(jìn)軍了股市。在一次財(cái)經(jīng)媒體峰會(huì)上,幾個(gè)財(cái)經(jīng)圈媒體大佬就&ldquo;胡錫進(jìn)炒股是否知道認(rèn)真報(bào)道&rdquo;展開討論。有
  • 華為HarmonyOS 4.0將于8月4日發(fā)布 或搭載AI大模型技術(shù)

    華為宣布HarmonyOS4.0將于8月4日正式發(fā)布。此前,華為已經(jīng)針對開發(fā)者公布了HarmonyOS4.0,以便于開發(fā)者提前進(jìn)行適配,也因此被曝光出了一些新系統(tǒng)的特性
  • 蘋果、三星、惠普等暫停向印度出口筆記本和平板電腦

    集微網(wǎng)消息,據(jù)彭博社報(bào)道,在8月3日印度突然禁止在沒有許可證的情況下向印度進(jìn)口電腦/平板及顯示器等產(chǎn)品后,蘋果、三星電子和惠普等大公司暫停向印度
Top 主站蜘蛛池模板: 襄樊市| 恭城| 凤阳县| 黑水县| 连南| 荥经县| 东山县| 上犹县| 池州市| 上栗县| 和田县| 辽中县| 长顺县| 深泽县| 崇明县| 贵州省| 阳原县| 静乐县| 惠安县| 乐陵市| 资源县| 宜章县| 金门县| 甘孜| 元氏县| 五寨县| 什邡市| 广元市| 邢台县| 宜宾市| 白城市| 平定县| 江达县| 崇左市| 棋牌| 青海省| 兖州市| 黄山市| 澄城县| 南雄市| 东城区|