使用 spring-data-redis 配置的 Redis 连接池但无法正常工作
Redis connection pool configured using spring-data-redis but not working correctly
我在用什么:
spring-data-redis.1.7.0.RELEASE
生菜.3.5.0.Final
我配置了Spring个与Redis相关的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' 命令检查时,连接看起来正确建立。 client count 与 lettucePool Bean + 1 设置的值完全相同。(redis-cli 也是一个 client)
但是,我的应用程序的日志显示它始终通过同一个端口发送操作请求。所以我使用 'client list' 命令检查了客户端状态,它说有客户端的池数,只有端口正在发送请求。
我错过了什么?
这是由 Lettuce 的特性造成的,'sharing native connection'。
spring-data-redis 中的 LettuceConnectionFactory 有一个名为 setShareNativeConnection(boolean) 的 setter 方法,默认设置为 true。这意味着无论创建和合并多少个连接,只要调用 non-blocking 和 non-transactional 操作,就只会使用一个本机连接。
如您所见,我没有手动设置该值,所以它被设置为默认值,'true'并且我没有阻塞或事务操作。
另外,之所以设置默认值为true,是因为Redis本身是single-threaded,也就是说即使客户端同时发送很多操作,Redis也必须一个一个执行,所以设置这个值'false' 并不意味着它会增加 Redis 的吞吐量。
我在用什么:
spring-data-redis.1.7.0.RELEASE
生菜.3.5.0.Final
我配置了Spring个与Redis相关的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' 命令检查时,连接看起来正确建立。 client count 与 lettucePool Bean + 1 设置的值完全相同。(redis-cli 也是一个 client)
但是,我的应用程序的日志显示它始终通过同一个端口发送操作请求。所以我使用 'client list' 命令检查了客户端状态,它说有客户端的池数,只有端口正在发送请求。
我错过了什么?
这是由 Lettuce 的特性造成的,'sharing native connection'。
spring-data-redis 中的 LettuceConnectionFactory 有一个名为 setShareNativeConnection(boolean) 的 setter 方法,默认设置为 true。这意味着无论创建和合并多少个连接,只要调用 non-blocking 和 non-transactional 操作,就只会使用一个本机连接。
如您所见,我没有手动设置该值,所以它被设置为默认值,'true'并且我没有阻塞或事务操作。
另外,之所以设置默认值为true,是因为Redis本身是single-threaded,也就是说即使客户端同时发送很多操作,Redis也必须一个一个执行,所以设置这个值'false' 并不意味着它会增加 Redis 的吞吐量。