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
Springboot 项目中Redis用lettuce连接池,如果长时间不用redis的话,就会断连。
解决方案一、
换回jedis
org.springframework.boot spring-boot-starter-data-redisredis.clients jedislettuce-core io.lettuce redis.clients jedisorg.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(); } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)