将连接返回到JedisCluster中的连接池

问题描述 投票:0回答:1

在我的代码中,出于各种原因,我需要从

JedisCluster
实例获取连接。其他操作是使用
jedisCluster
实例发送命令:

val poolConfig = GenericObjectPoolConfig<Connection>().apply {
   maxTotal = 128
   maxIdle = 32
   minIdle = 8
   setMaxWait(Duration.ofMillis(1000))
   blockWhenExhausted = true
}
...
val jedisCluster = JedisCluster(HostAndPort(host, port), jedisConfigBuilder.build(), maxAttempts, poolConfig)
...
val connection = jedisCluster.getConnectionFromSlot(slotNumber)
// run operations
// Now I want to release that connection, but not close it!
...

但是,连接没有返回到池中并且无法再次选择。关闭此连接不是一个好的选择,因为我仍然想从其他地方重用它。
我特别想把它放回泳池。
有什么想法如何以优雅的方式做到这一点吗?
我提供了 kotlin 代码,但任何 Java 中的示例也值得赞赏!

java kotlin connection-pooling jedis
1个回答
0
投票

您可以使用单例模式处理连接。如果需要,您可以使用工厂模式来封装如何获取此连接。

看看我如何处理这个问题:

public final class RedisPoolConnection {
    
    private static final int CONNECTION_TIMEOUT = 5000;
    private static RedisPoolConexao instance;
    private final JedisPool jedisPool;
    
    private RedisPoolConexao(JedisPool jedisPool) {
        this.jedisPool = jedisPool; 
    }
    
    public static RedisPoolConnection getInstance(String hostUrl, int hostPort, String user, String password) {
        if(Objects.isNull(instance)) {
            final JedisPoolConfig poolConfig = new JedisPoolConfig();
            poolConfig.setMaxTotal(120);
            poolConfig.setMaxIdle(120);
            poolConfig.setMinIdle(16);
            poolConfig.setBlockWhenExhausted(true);
            poolConfig.setMaxWait(Duration.ofSeconds(2));
            try {
                instance = new RedisPoolConexao(new JedisPool(poolConfig, hostUrl, hostPort, CONNECTION_TIMEOUT, StringUtils.firstNonBlank(user), password));
            } catch(Exception e) {
                // handle exception
            }
        }
        return instance;
    }
    
    public JedisPool getJedisPool() {
        return jedisPool;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.