问题描述
我正在使用什么:
spring-data-redis.1.7.0.RELEASE
生菜.3.5.0。最后
我对与Redis相关的Spring bean进行了如下配置:
@Bean
public LettucePool lettucePool() {
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
poolConfig.setMasIdle(10);
poolConfig.setMinIdle(8);
... // setting others..
return new DefaultLettucePool(host,port,poolConfig)
}
@Bean
public RedisConnectionFactory redisConnectionFactory() {
new LettuceConnectionFactory(lettucePool());
}
@Bean
public RedisTemplate<String,Object> redisTemplate() {
RedisTemplate<Stirng,Object> redisTemplate = new RedisTemplate<String,Object>();
redisTemplate.setConnectionFactory(redisConnectionFactory());
redisTemplate.setEnableTransactionSupport(true);
... // setting serializers..
return redisTemplate;
}
redisTemplate Bean是自动装配的,用于Redis操作。
当我通过redis-cli使用“ info”命令进行检查时,连接看起来正确建立。客户端计数与设置为lettucePool Bean +1的值完全相同(redis-cli也是客户端)
但是,我的应用程序的日志说它总是通过同一端口发送操作请求。因此,我使用“客户端列表”命令检查了客户端状态,它说有客户端池的数量,只是端口正在发送请求。
我想念什么?
解决方法
这是由莴苣的特定功能“共享本地连接”引起的。
spring-data-redis中的LettuceConnectionFactory有一个名为setShareNativeConnection(boolean)的setter方法,默认情况下设置为true。这意味着无论创建和合并多少个连接,只要调用非阻塞和非事务操作,就仅使用一个本机连接。
如您所见,我没有手动设置该值,因此将其设置为默认值“ true”,并且没有阻塞或事务操作。
此外,将默认值设置为true的原因是Redis本身是单线程的,这意味着即使客户端同时发送许多操作,Redis也必须一次执行一次,因此请将此值设置为“ false”并不意味着它会增加Redis的吞吐量。