spring data redis with lettuce连接池配置

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

我们正在从 spring boot 版本 1.5.2 升级到 2.0.0。我发现 spring data redis 默认使用 lettuce,不需要连接池管理,只使用单个底层 tcp 连接。我们还使用 ConcurrentMetadatStore 来执行原子/阻塞操作,如 putIfAbsent。在没有连接池的情况下使用自动配置的 LettuseConnectionFactory 或配置 LettuceConnectionFactory 以使用池是否可以?

spring-data-redis lettuce
1个回答
0
投票

默认情况下,

LettuceConnectionFactory
配置为
client
pool
的默认值。

如果你想用不同的值配置

client
pool
,你需要将新配置传递给
LettuceConnectionFactory
,就像这个集群模式的例子:

private static final String COMMA = ",";

@Value("${redis.cluster.nodes}")
private String clusterNodes;

@Value("${redis.cluster.max-redirects}")
private Integer maxRedirects;

@Value("${redis.cluster.useDefaultPoolConfig}")
private boolean useDefaultPoolConfig;

@Value("${redis.password}")
private String password;

@Bean
public LettuceConnectionFactory redisConnectionFactory() {
    return loadFactory();
}

public LettuceConnectionFactory loadFactory() {
    RedisClusterConfiguration clusterConfiguration = new RedisClusterConfiguration();
    clusterConfiguration.setClusterNodes(getNodes(clusterNodes));
    clusterConfiguration.setMaxRedirects(maxRedirects);
    clusterConfiguration.setPassword(password);
    if (useDefaultPoolConfig) {
        return new LettuceConnectionFactory(clusterConfiguration);
    } else {
        LettuceClientConfiguration clientConfig = LettucePoolingClientConfiguration.builder()
                // Values you need to change on client like 
                // .clientName("")
                .poolConfig(buildLettucePoolConfig()).build();
        return new LettuceConnectionFactory(clusterConfiguration, clientConfig);
    }
}

protected GenericObjectPoolConfig buildLettucePoolConfig() {
    // Values you need to change on PoolConfig
    final GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
    poolConfig.setMaxTotal(maxTotal);
    poolConfig.setMaxIdle(maxIdle);
    poolConfig.setMinIdle(minIdle);
    poolConfig.setTestOnBorrow(testOnBorrow);
    poolConfig.setTestOnReturn(testOnReturn);
    poolConfig.setTestWhileIdle(testWhileIdle);
    poolConfig.setMinEvictableIdleTimeMillis(minEvictableMs);
    poolConfig.setTimeBetweenEvictionRunsMillis(evictionRunsMs);
    poolConfig.setMaxWaitMillis(maxWaitMills);
    poolConfig.setNumTestsPerEvictionRun(numberTestsPerEvictionRun);
    poolConfig.setBlockWhenExhausted(blockWhenExhausted);
    return poolConfig;
}

private List<RedisNode> getNodes(String nodes) {
    List<RedisNode> result;
    if (StringUtils.isBlank(nodes)) {
        result = Collections.emptyList();
    } else {
        result = new ArrayList<>();
        for (String hostPort : nodes.split(COMMA)) {
            result.add(RedisNode.fromString(hostPort));
        }
    }
    return result;
}
© www.soinside.com 2019 - 2024. All rights reserved.