天天看點

20210604 Redis連接配接池常用配置

Redis Client封裝的大緻步驟

1)建立配置對象(通過連接配接池配置對象建立連接配接池,根據具體的場景配置連接配接池參數 JedisPoolConfig),

2)建立連接配接池對象(單例模式管理JedisPool,連接配接池中會有很多jedis執行個體,RedisPool對象會很大,是以寫成單例模式),

3)擷取連接配接執行個體Jedis(别忘了歸還連接配接釋放資源,否則連接配接可能會被耗盡),

4)釋放連接配接;在try塊裡面有了其他異常會導緻resouce無法正常關閉,導緻某個Jedis執行個體用完後沒有還給JedisPool,導緻資源不足。 出現異常導緻Jedis連接配接無法關閉,是以要在finally裡面釋放資源。

JedisPool的配置參數很大程度上依賴于實際應用需求、軟硬體能力,JedisPool的配置參數大部分是由JedisPoolConfig的對應項來指派的。

maxTotal 最大連接配接數

maxIdle 最小連接配接數

maxWaitMillis 擷取連接配接時最大等待時間

testOnReturn 釋放檢測連接配接

testOnBorrow 擷取檢測連接配接

whenExhaustedAction [ɪgˈzɔ:stɪd] 連接配接耗盡時采取的政策

1)maxTotal 最大連接配接數,連接配接池的最大連接配接數,控制一個pool可配置設定多少個jedis執行個體,通過pool.getResource()來擷取;如果指派為-1,則表示不限制;如果pool已經配置設定了maxActive個jedis執行個體,則此時pool的狀态為exhausted( 耗盡狀态 )。

2)maxWaitMillis 最大等待時間 表示當borrow一個jedis執行個體時,最大的等待時間,如果超過等待時間,則直接抛出JedisConnectionException;

3)testOnBorrow:在borrow一個jedis執行個體時,是否提前進行validate操作;如果為true,則得到的jedis執行個體均是可用的;

4)testOnReturn:在return給pool時,是否提前進行validate操作;

5)whenExhaustedAction:表示當pool中的jedis執行個體都被allocated完時,pool要采取的操作;預設有三種。

(1)WHEN_EXHAUSTED_FAIL 表示無jedis執行個體時,直接抛出NoSuchElementException;

(2)WHEN_EXHAUSTED_BLOCK 則表示阻塞住,或者達到maxWaitMillis時抛出JedisConnectionException;

(3)WHEN_EXHAUSTED_GROW 則表示建立一個jedis執行個體,也就說設定的maxTotal無用;

複用連接配接對象,提高效率。性能高。重複建立連接配接和關閉連接配接,浪費資源。

常用類:Jedis,JedisPool,JedisPoolConfig。

通過java用戶端Jedis來操作redis。

用戶端----->連接配接池----->redis.

限制最大連接配接數,防止系統資源耗盡。 兩個時間的設定。

擷取連接配接時,測試連接配接是否可用。怎麼檢查的?

釋放連接配接時,測試連接配接是否可用。怎麼檢查的?

等待空閑連接配接:如果連接配接池中連接配接被取走完了,連接配接池沒有空餘連接配接,目前連接配接池的狀态就是疲勞的。其他需要擷取連接配接的線程就處于等待狀态,等待空閑連接配接。

1、什麼情況下,會出現連接配接耗盡情況?

連接配接池中的所有連接配接都被占用了,解決這個問題可以增加連接配接池中連接配接的個數,但是如果程式有問題,沒有釋放連接配接,那你增加多少最終還是會報錯,因為連接配接沒有釋放回收。

java.util.NoSuchElementException: Timeout waiting for idle object 等待空閑的連接配接對象逾時。idle 空閑。連接配接對象較少,拿不到連接配接對象。

java.util.NoSuchElementException: Timeout waiting for idle object

2、連接配接池配置的連接配接數過少可能會引起性能問題

檢視具體線程資訊,明顯可以看出來是在等待redis線程池。都在等待擷取連接配接,導緻tps上不去。因為單個get或者set隻有幾毫秒,不可能慢的。

複現場景:1個連接配接,100萬次處理。

3、timeBetweenEvictionRunsMillis;[ɪˈvɪkʃn]:驅除、驅趕。連接配接池中的連接配接空閑超過一定時間将會被回收。

minEvictableIdleTimeMillis; 連接配接池中連接配接可空閑的時間, 機關毫秒(如果連接配接超過多少毫秒沒有被使用,就會被釋放掉)

每n毫秒檢查一次連接配接池中空閑的連接配接,把空閑時間超過m毫秒的連接配接斷開,直到連接配接池中的連接配接數到minIdle為止。

4、問題:Could not return the resource to the pool;

不能将redis連接配接放回池内,放回連接配接池的對象是無效的對象。進行了兩次returnResource釋放連接配接資源造成的,因為第一次return成功以後,第二次return就會報上面這個錯誤。

1) 釋放資源的時候,判斷是否為空;2)把連接配接傳回給連接配接池的時候,要進行校驗,參數設定為testOnReturn(true); 3) 在finally中釋放連接配接,防止抛出異常連接配接釋放失敗。

finally {
    if (jedis != null) {
        log.info("queryBuildingListFromCache 釋放連接配接資源");
        jedis.close();
    }
}
           

繼續閱讀