使用 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 的吞吐量。