前言

公司项目上线后经常运行一两天后就会出现延时、无响应的情况,当时第一反应觉得可能是某些业务优化不行,检查业务也没发现有什么问题,前前后后倒是修了两三个BUG,本以为没啥事儿了,但也就好了两天,很奇怪,看JVM堆内存也停正常,GC日志也没啥问题,网关限流加上也没起到效果,后来和朋友讨论了下,又深入底层调试了一下,发现问题居然是JedisPoolConfig没有生效……,本着尽量少修改原来代码(主管写的)的原则,所以有了下文

不生效的原因

你的内部类?你的就是我的!

因为当时这个问题很恶劣,所以能尽快就尽快了,也没有仔细查阅相关资料就赶紧开始动手了。
看了一眼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);

解决!
论如何在使用RedisStandaloneConfiguration时让JedisConnectionFactory用上JedisPoolConfig-LMLPHP

压力测试解决(口述)

之前在排查问题时进行压力测试,50个线程就打死了,使用上面的方法使JedisPoolConfig生效并加以配置后,1w线程屁事儿没有,从修复完成到现在写这篇文章再也没听到过说项目延时、卡死了。起飞!

03-21 14:44