【问题标题】:Redis connection pool configured using spring-data-redis but not working correctly使用 spring-data-redis 配置的 Redis 连接池但无法正常工作
【发布时间】:2020-09-01 09:24:10
【问题描述】:

我正在使用什么:
spring-data-redis.1.7.0.RELEASE
生菜.3.5.0.Final

我配置了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 使用“信息”命令检查时,连接看起来正确建立。客户端计数与设置为 lettucePool Bean + 1 的值完全相同。(redis-cli 也是客户端)

但是,我的应用程序日志显示它始终通过同一个端口发送操作请求。所以我使用'client list'命令检查了客户端状态,它说有客户端的池数量,只是端口正在发送请求。

我错过了什么?

【问题讨论】:

    标签: redis spring-data-redis lettuce


    【解决方案1】:

    这是由 Lettuce 的特定功能“共享本地连接”引起的。

    spring-data-redis 中的LettuceConnectionFactory 有一个setter 方法,名为setShareNativeConnection(boolean),默认设置为true。这意味着无论创建和池化多少个连接,只要调用非阻塞和非事务性操作,就只使用一个本机连接。

    如您所见,我没有手动设置该值,因此将其设置为默认值“true”,并且我没有阻塞或事务操作。

    另外,之所以将默认值设置为true,是因为Redis本身是单线程的,也就是说即使客户端同时发送了很多操作,Redis也必须一个一个地执行,所以将此值设置为'false'并不意味着它会增加 Redis 的吞吐量。

    【讨论】:

      猜你喜欢
      • 2021-01-01
      • 2016-06-18
      • 1970-01-01
      • 2021-11-22
      • 2019-04-16
      • 1970-01-01
      • 2022-08-03
      • 2018-06-01
      • 1970-01-01
      相关资源
      最近更新 更多