論如何在使用RedisStandaloneConfiguration時讓JedisConnectionFactory用上JedisPoolConfig

SomUrim發表於2022-03-21

前言

公司專案上線後經常執行一兩天後就會出現延時、無響應的情況,當時第一反應覺得可能是某些業務優化不行,檢查業務也沒發現有什麼問題,前前後後倒是修了兩三個BUG,本以為沒啥事兒了,但也就好了兩天,很奇怪,看JVM堆記憶體也停正常,GC日誌也沒啥問題,閘道器限流加上也沒起到效果,後來和朋友討論了下,又深入底層除錯了一下,發現問題居然是JedisPoolConfig沒有生效……,本著儘量少修改原來程式碼(主管寫的)的原則,所以有了下文

不生效的原因

他不是不用pool,而是用了一個自己的JedisConnectionFactory.MutableJedisClientConfiguration()
而MutableJedisClientConfiguration是一個內類,還不是public的,是protect的。你還沒辦法在你的configuration裡邊使用這個類。
MutableJedisClientConfiguration會自動生成一個JedisPoolConfig,這個JedisPoolConfig繼承自> GenericObjectPoolConfig,他的pool的配置就是8個。
所以,如果你要用RedisStandaloneConfiguration,基本上就是8個的pool配置。看來spring 也認為,既然是redis的單機版,8個夠用了。

[https://blog.csdn.net/gezilan/article/details/82117039][1]
原因找到了,那麼問題就解決90%了,嘗試了這篇文章中提到的設定方式發現並不適用,所以我騷向膽邊生……

你的內部類?你的就是我的!

因為當時這個問題很惡劣,所以能儘快就儘快了,也沒有仔細查閱相關資料就趕緊開始動手了。
看了一眼MutableJedisClientConfiguration類,實現自JedisClientConfiguration介面,而JedisConnectionFactory有個構造方法:

public JedisConnectionFactory(RedisStandaloneConfiguration standaloneConfig, JedisClientConfiguration clientConfig) {
   this(clientConfig);
   Assert.notNull(standaloneConfig, "RedisStandaloneConfiguration must not be null!");
   this.standaloneConfig = standaloneConfig;
}

第二個引數型別就是JedisClientConfiguration,而這個方法恰恰就是

public JedisConnectionFactory(RedisStandaloneConfiguration standaloneConfig) {
   this(standaloneConfig, new MutableJedisClientConfiguration());
}

這個構造方法所呼叫的一個過載方法,所以dddd

/**
 * 重新實現JedisClientConfiguration介面
 * JedisConnectionFactory在建立時可以同時使用RedisStandaloneConfiguration和JedisPoolConfig
 *
 * @author SomUrim
 * @version 1.0
 * @since 2021/6/26
 */
public class FuckJedisClientConfiguration implements JedisClientConfiguration {
        //dddd
}

蕪湖,你的就是我的!
緊接著

JedisClientConfiguration jedisClientConfiguration = FuckJedisClientConfiguration.create(jedisPoolConfig());
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(redisStandaloneConfiguration,jedisClientConfiguration);

解決!

壓力測試解決(口述)

之前在排查問題時進行壓力測試,50個執行緒就打死了,使用上面的方法使JedisPoolConfig生效並加以配置後,1w執行緒屁事兒沒有,從修復完成到現在寫這篇文章再也沒聽到過說專案延時、卡死了。起飛!

參考資料:
https://blog.csdn.net/gezilan/article/details/82117039
https://i.iter01.com/images/9f28d61e36d7a881c052d3290fc89219a63d0401b930dc29dfcf0c7feefb8a72.gif

相關文章