redis连接池使用spring数据redis配置,但工作不正常

ccgok5k5  于 2021-06-08  发布在  Redis
关注(0)|答案(1)|浏览(380)

我使用的是:
spring-data-redis.1.7.0.release发布
4.3.5.0.最终
我将与redis相关的SpringBeans配置如下:

@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;
}

redistemplatebean是自动连接的,用于redis操作。
当我通过redis cli使用'info'命令进行检查时,连接看起来是正确建立的。客户机计数与设置为lettucepoolbean+1的值完全相同(redis cli也是一个客户端)
但是,我的应用程序的日志显示它总是通过同一个端口发送操作请求。所以我用'client list'命令检查了客户端的状态,它说有客户端的池数,只有port在发送请求。
我错过了什么?

8fsztsew

8fsztsew1#

这是由莴苣的特定特性“共享本机连接”引起的。
springdataredis中的lettuceconnectionfactory有一个名为setsharenativeconnection(boolean)的setter方法,默认设置为true。这意味着,无论创建了多少个连接并将其合并,只要调用了非阻塞和非事务性操作,就只能使用一个本机连接。
如您所见,我没有手动设置该值,因此将其设置为默认值“true”,并且没有阻塞或事务操作。
另外,之所以将默认值设置为true是因为redis本身是单线程的,这意味着即使客户端同时发送多个操作,redis也必须逐个执行,所以将这个值设置为false并不意味着它增加了redis的吞吐量。

相关问题