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