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