如何有效地使用jedisconfig池而不增加超过maxtotal的连接数?

pw9qyyiw  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(383)

绝地武士池并没有像预期的那样工作。我已经提到了活动连接10,但它允许甚至超过10个连接。
我已重写redisconnectionfactory中的getconnection()方法。为了获得连接,这个方法已经被调用了将近30次。
我已经配置了绝地配置池,如下所述。有人能帮我解释一下为什么它创建的连接多于maxtotal吗?有人能帮我关闭绝地连接池吗。

@Configuration
public class RedisConfiguration {
        @Bean
        public RedisTenantDataFactory redisTenantDataFactory(){
        JedisPoolConfig poolConfig = new JedisPoolConfig();
                        poolConfig.setMaxIdle(1);
                        poolConfig.setMaxTotal(10);
                        poolConfig.setBlockWhenExhausted(true);
                        poolConfig.setMaxWaitMillis(10);

                        JedisConnectionFactory jedisConnectionFactory = new 
                        JedisConnectionFactory(poolConfig);
                        jedisConnectionFactory.setHostName(redisHost);
                        jedisConnectionFactory.setUsePool(true);
                        jedisConnectionFactory.setPort(Integer.valueOf(redisPort));
    }

        #####
           @Bean
            public RedisTemplate<String, Object> redisTemplate(@Autowired RedisConnectionFactory redisConnectionFactory) {
                RedisTemplate<String, Object> template = new RedisTemplate<>();
                template.setConnectionFactory(redisConnectionFactory);
                template.afterPropertiesSet();
                return template;
            }
}

我已重写redisconnectionfactory中的getconnection()方法。为了获得连接,这个方法已经被调用了将近30次。

iaqfqrcu

iaqfqrcu1#

这可能是对连接池行为的误解。我想,在没有关于如何在应用程序中使用池的详细信息的情况下。
因此,池的配置如下:

...
poolConfig.setMaxIdle(1);
poolConfig.setMaxTotal(10);
poolConfig.setBlockWhenExhausted(true)
...

这意味着正如您所期望的,从这个特定池到redis的活动连接不会超过10个。
您可以使用redisinsight或命令client list检查redis本身的客户机数量(开放连接),您将看到来自这个jvm的连接不会超过10个。
事实上,你看到许多呼吁 getConnection() 只是因为应用程序每次需要连接时都在调用它。这并不意味着“打开一个新连接”,而是意味着“从池中给我一个连接”,您的配置定义了行为,如下所示: poolConfig.setMaxIdle(1) =>您的应用程序将始终至少有一个连接打开并可用。选择一个好的数字很重要,因为“创建一个新的连接”需要时间和资源(1在正常应用中可能过低) poolConfig.setMaxTotal(10) =>这意味着池在同一时间打开的连接不会超过10个。所以你必须定义当你达到10岁时会发生什么,而你的应用程序需要一个。这就是 poolConfig.setBlockWhenExhausted(true) =>这意味着如果应用程序已经使用了10个“活动”连接,那么应用程序调用 getConnection() ,它将“阻塞”,直到10个连接中的一个返回到池。
所以“封杀”可能不是个好主意(但这又取决于您的应用程序)
也许您想知道为什么您的应用程序调用getconnection()30次,为什么它不在10时停止/阻塞。。。。
因为你的代码很好;),我的意思是你的申请:
1- Jedis jedis = pool.getCoonnection(); (因此需要一个来自池的活动连接)2-您正在使用 jedis 按需连接3-关闭连接 jedis.close() (这不需要关闭真正的连接,它会返回到池的连接,池可以重用它或根据应用程序/配置关闭它)
有道理吗?
通常您将使用以下代码

/// Jedis implements Closeable. Hence, the jedis instance will be auto-closed after the last statement.
try (Jedis jedis = pool.getResource()) {
  /// ... do stuff here ... for example
  jedis.set("foo", "bar");
  String foobar = jedis.get("foo");
  jedis.zadd("sose", 0, "car"); jedis.zadd("sose", 0, "bike"); 
  Set<String> sose = jedis.zrange("sose", 0, -1);
}
/// ... when closing your application:
pool.close()

您可以在此处找到有关jedispool和apache commonpool的更多信息:
入门
apache公用池

相关问题