論如何在使用RedisStandaloneConfiguration時讓JedisConnectionFactory用上JedisPoolConfig
前言
公司項目上線後經常運行一兩天後就會出現延時、無響應的情況,當時第一反應覺得可能是某些業務優化不行,檢查業務也沒發現有什麼問題,前前後後倒是修了兩三個BUG,本以為沒啥事兒了,但也就好了兩天,很奇怪,看JVM堆內存也停正常,GC日誌也沒啥問題,網關限流加上也沒起到效果,後來和朋友討論了下,又深入底層調試了一下,發現問題居然是JedisPoolConfig沒有生效……,本着盡量少修改原來代碼(主管寫的)的原則,所以有了下文
不生效的原因
他不是不用pool,而是用了一個自己的JedisConnectionFactory.MutableJedisClientConfiguration()
而MutableJedisClientConfiguration是一個內類,還不是public的,是protect的。你還沒辦法在你的configuration裡邊使用這個類。
MutableJedisClientConfiguration會自動生成一個JedisPoolConfig,這個JedisPoolConfig繼承自> GenericObjectPoolConfig,他的pool的配置就是8個。
所以,如果你要用RedisStandaloneConfiguration,基本上就是8個的pool配置。看來spring 也認為,既然是redis的單機版,8個夠用了。
[//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線程屁事兒沒有,從修復完成到現在寫這篇文章再也沒聽到過說項目延時、卡死了。起飛!
參考資料:
//blog.csdn.net/gezilan/article/details/82117039
//img2022.cnblogs.com/blog/2387823/202203/2387823-20220321114654620-1968944474.gif