• 关于Redis Lettuce连接池的问题


    SpringBoot 2.x 不再使用jedis做连接池,而使用Lettuce。

    Jedis和Lettuce的区别

    jedis和Lettuce都是Redis的客户端,它们都可以连接Redis服务器,但是在SpringBoot2.0之后默认都是使用的Lettuce这个客户端连接Redis服务器。因为当使用Jedis客户端连接Redis服务器的时候,每个线程都要拿自己创建的Jedis实例去连接Redis客户端,当有很多个线程的时候,不仅开销大需要反复的创建关闭一个Jedis连接,而且也是线程不安全的,一个线程通过Jedis实例更改Redis服务器中的数据之后会影响另一个线程;

    但是如果使用Lettuce这个客户端连接Redis服务器的时候,就不会出现上面的情况,Lettuce底层使用的是Netty,当有多个线程都需要连接Redis服务器的时候,可以保证只创建一个Lettuce连接,使所有的线程共享这一个Lettuce连接,这样可以减少创建关闭一个Lettuce连接时候的开销;而且这种方式也是线程安全的,不会出现一个线程通过Lettuce更改Redis服务器中的数据之后而影响另一个线程的情况

    原文链接:https://blog.csdn.net/qq_45950109/article/details/114385983

    Lettuce连接超时的问题
    Springboot 项目中Redis用lettuce连接池,如果长时间不用redis的话,就会断连。

    解决方案一、

    换回jedis


        org.springframework.boot
        spring-boot-starter-data-redis
       
           
                redis.clients
                jedis
           

           
                lettuce-core
                io.lettuce
           

       




        redis.clients
        jedis



        org.apache.commons
        commons-pool2

    解决方案二、

    自己维护心跳,如写个定时任务去ping redis。

    public String ping(){
          return  redisTemplate.execute(new RedisCallback() {
              @Override
              public String doInRedis(RedisConnection connection) throws DataAccessException {
                  return connection.ping();
              }
          });
      }

    解决方案三、 添加netty心跳配置

    @Configuration
    public class RedisClientConfig {
     
        @Bean
        public ClientResources clientResources(){
     
            NettyCustomizer nettyCustomizer = new NettyCustomizer() {
     
                @Override
                public void afterChannelInitialized(Channel channel) {
                    channel.pipeline().addLast(
                            //此处时间必须小于超时时间
                            new IdleStateHandler(40, 0, 0));
                    channel.pipeline().addLast(new ChannelDuplexHandler() {
                        @Override
                        public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
                            if (evt instanceof IdleStateEvent) {
                                ctx.disconnect();
                            }
                        }
                    });
                }
     
                @Override
                public void afterBootstrapInitialized(Bootstrap bootstrap) {
     
                }
     
            };
     
            return ClientResources.builder().nettyCustomizer(nettyCustomizer ).build();
        }
        }
     

  • 相关阅读:
    【Vuex】vue状态机详解
    网络虚拟化之virtio-net和vhost
    2024绿色能源、城市规划与环境国际会议(ICGESCE 2024)
    猿创征文|11个开发者必备工具,赶快收藏
    Android Studio Chipmunk Patch 2(android-studio-2021.2.1.16)下载地址
    从php页面插入MySQL的数据变为乱码如何解决?
    接口测试面试题整理​​​​​​​
    jQuery淘宝服饰精品图片切换/自己实现
    LeetCode刷题总结---二分查找详解
    extern和static的使用与区别
  • 原文地址:https://blog.csdn.net/qq_39791232/article/details/126975972