• 论如何在使用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个够用了。

    [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://img2022.cnblogs.com/blog/2387823/202203/2387823-20220321114654620-1968944474.gif

  • 相关阅读:
    Docker Swarm 维护模式
    使用 Docker + Jenkins + Gitlab + Maven 自动化部署 Spring Boot
    kafka原理与应用
    StarRocks实战——欢聚集团极速的数据分析能力
    四氧化三铁/硫化铋纳米复合材料(FeO@PDA@BSABiS纳米颗粒)|树状大分子稳定的硫化铋纳米颗粒|科研试剂
    c++多态
    升级 MacOS 系统后,playCover 内游戏打不开了如何解决
    量子力学的应用:量子通信和量子感应
    Choose the WiFi card that suits you: QCA9882 vs. MT7915/QCN6024
    MySQL入门第三天——数据表的约束
  • 原文地址:https://www.cnblogs.com/somurim/p/16034025.html