基于SpringBoot2.0默认使⽤Redis连接池的配置操作SpringBoot2.0默认采⽤Lettuce客户端来连接Redis服务端的
默认是不使⽤连接池的,只有配置 redis.lettuce.pool下的属性的时候才可以使⽤到redis连接池
redis:
cluster:
nodes: ${redis.host.cluster}
password: ${redis.password}
lettuce:
shutdown-timeout: 100 # 关闭超时时间
pool:
max-active: 8 # 连接池最⼤连接数(使⽤负值表⽰没有限制)
max-idle: 8 # 连接池中的最⼤空闲连接
max-wait: 30 # 连接池最⼤阻塞等待时间(使⽤负值表⽰没有限制)
min-idle: 0 # 连接池中的最⼩空闲连接
没有这个配置时
增加这个配置时
springframework包
同时,使⽤连接池,要依赖commons-pool2
<dependency>
<groupId>org.apachemons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
如果没有引⼊,会报错
同时如果你想使⽤jedis客户端,则需要配置
redis:
cluster:
nodes: ${redis.host.cluster}
password: ${redis.password}
jedis:
pool:
max-active: 8 # 连接池最⼤连接数(使⽤负值表⽰没有限制)
max-idle: 8 # 连接池中的最⼤空闲连接
max-wait: 30 # 连接池最⼤阻塞等待时间(使⽤负值表⽰没有限制)
min-idle: 0 # 连接池中的最⼩空闲连接
当然你也可以不配置,⾛默认的连接池配置,但是有⼀点要注意 <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
依赖包的引⽤⾥,要去掉lettuce,并且加上jedis的依赖包,否则都是⾛的lettuce客户端
同时jedis的客户端默认增加了pool的连接池依赖包,所以Jedis默认你配置与否都会有连接池,⽽lettuce则需要配置⽂件中配置⼀下
补充知识:解决springboot2 RedisTemplate使⽤lettuce连接池配置不⽣效的问题
springboot2 redis默认使⽤lettuce,使⽤连接池根据⽹上的内容,进⾏如下配置:
# 连接池最⼤连接数使⽤负值表⽰没有限制
# 连接池最⼤阻塞等待时间(使⽤负值表⽰没有限制)
# 连接池中的最⼤空闲连接默认 8
# 连接池中的最⼩空闲连接默认 0
但是启动后,多线程调⽤查询redis,通过redis-cli的info clients。
发现连接数并没有变多。
经过翻阅资料和源码发现,LettuceConnectionFactory类⾥⾯有个shareNativeConnection变量,默认为true。
说明共享本地连接,这样的话就不会创建多个连接了,连接池也就没⽤了。因此需要把这个值设为false。
import t.annotation.Bean;
import t.annotation.Configuration;
import org.tion.RedisConnectionFactory;
import org.tion.lettuce.LettuceConnectionFactory;
import org.RedisTemplate;
import org.StringRedisTemplate;
import javax.annotation.Resource;
@Configuration
public class RedisConfig {
@Resource
private LettuceConnectionFactory lqlcfactory;
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate template = new RedisTemplate();
template.setConnectionFactory(connectionFactory);
return template;
}
@Bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory factory) {
StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
lqlcfactory.setShareNativeConnection(false);
stringRedisTemplate.setConnectionFactory(lqlcfactory);
return stringRedisTemplate;
}
}
这样lettuce连接池就设置成功了。
为什么改这⾥就可以了呢?从LettuceConnectionFactory的源码分析
/*
* (non-Javadoc)
* @see org.tion.RedisConnectionFactory#getConnection()
*/
public RedisConnection getConnection() {
if (isClusterAware()) {
return getClusterConnection();
}
LettuceConnection connection;
connection = doCreateLettuceConnection(getSharedConnection(), connectionProvider, getTimeout(), getDatabase());
connection.setConvertPipelineAndTxResults(convertPipelineAndTxResults);
return connection;
}
protected LettuceConnection doCreateLettuceConnection(
@Nullable StatefulRedisConnection<byte[], byte[]> sharedConnection, LettuceConnectionProvider connectionProvider,
long timeout, int database) {
return new LettuceConnection(sharedConnection, connectionProvider, timeout, database);
}
上⾯两个函数是获取connection连接,可以看到getSharedConnection()和shareNativeConnection配置有关了
@Nullable
protected StatefulRedisConnection<byte[], byte[]> getSharedConnection() {
return shareNativeConnection ? (StatefulRedisConnection) getOrCreateSharedConnection().getConnection() : null;
}
如果是true,就是返回已经存在的连接,如果是false,返回null。那就只能创建新的连接了,如下
LettuceConnection(@Nullable StatefulConnection<byte[], byte[]> sharedConnection,
LettuceConnectionProvider connectionProvider, long timeout, int defaultDbIndex) {
this.asyncSharedConn = sharedConnection;
this.timeout = timeout;
this.defaultDbIndex = defaultDbIndex;
this.dbIndex = this.defaultDbIndex;
}
以上这篇基于SpringBoot2.0默认使⽤Redis连接池的配置操作就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。