Skip to content

Commit

Permalink
refactor!: Using Spring Boot Redis properties
Browse files Browse the repository at this point in the history
  • Loading branch information
jruaux committed Jul 30, 2024
1 parent aa63fd2 commit 3d29833
Show file tree
Hide file tree
Showing 5 changed files with 120 additions and 645 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,19 @@
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties.Lettuce.Cluster.Refresh;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties.Pool;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.StringUtils;

import com.redis.lettucemod.RedisModulesClient;
import com.redis.lettucemod.RedisURIBuilder;
import com.redis.lettucemod.api.StatefulRedisModulesConnection;
import com.redis.lettucemod.cluster.RedisModulesClusterClient;
import com.redis.lettucemod.cluster.api.StatefulRedisModulesClusterConnection;
import com.redis.spring.lettucemod.RedisProperties.Lettuce.Cluster.Refresh;
import com.redis.spring.lettucemod.RedisProperties.Pool;

import io.lettuce.core.ClientOptions;
import io.lettuce.core.RedisURI;
Expand All @@ -32,115 +34,114 @@
@EnableConfigurationProperties({ RedisProperties.class })
public class RedisModulesAutoConfiguration {

@SuppressWarnings("deprecation")
@Bean
RedisURI redisURI(RedisProperties properties) {
RedisURI uri = StringUtils.hasLength(properties.getUrl()) ? RedisURI.create(properties.getUrl())
: RedisURI.create(properties.getHost(), properties.getPort());
if (StringUtils.hasLength(properties.getClientName())) {
uri.setClientName(properties.getClientName());
}
if (properties.getDatabase() > 0) {
uri.setDatabase(properties.getDatabase());
}
if (StringUtils.hasLength(properties.getPassword())) {
uri.setPassword(properties.getPassword());
}
if (properties.isSsl()) {
uri.setSsl(properties.isSsl());
}
if (properties.getTimeout() != null) {
uri.setTimeout(properties.getTimeout());
}
if (StringUtils.hasLength(properties.getUsername())) {
uri.setUsername(properties.getUsername());
}
return uri;
}

private <B extends ClientOptions.Builder> B clientOptions(B builder, RedisProperties properties) {
RedisModulesClient.defaultClientOptions(builder);
Duration connectTimeout = properties.getConnectTimeout();
if (connectTimeout != null) {
builder.socketOptions(SocketOptions.builder().connectTimeout(connectTimeout).build());
}
builder.timeoutOptions(TimeoutOptions.enabled());
return builder;
}

@Bean(destroyMethod = "shutdown")
ClientResources clientResources() {
return DefaultClientResources.create();
}

@Bean(destroyMethod = "shutdown")
@ConditionalOnProperty(name = "spring.redis.cluster.enabled", havingValue = "false", matchIfMissing = true)
RedisModulesClient client(RedisURI redisURI, RedisProperties properties, ClientResources clientResources) {
RedisModulesClient client = RedisModulesClient.create(clientResources, redisURI);
client.setOptions(clientOptions(ClientOptions.builder(), properties).build());
return client;
}

@Bean(destroyMethod = "shutdown")
@ConditionalOnProperty(name = "spring.redis.cluster.enabled", havingValue = "true", matchIfMissing = false)
RedisModulesClusterClient clusterClient(RedisURI redisURI, RedisProperties properties, ClientResources clientResources) {
RedisModulesClusterClient client = RedisModulesClusterClient.create(clientResources, redisURI);
ClusterClientOptions.Builder builder = ClusterClientOptions.builder();
Refresh refreshProperties = properties.getLettuce().getCluster().getRefresh();
ClusterTopologyRefreshOptions.Builder refreshBuilder = ClusterTopologyRefreshOptions.builder()
.dynamicRefreshSources(refreshProperties.isDynamicRefreshSources());
if (refreshProperties.getPeriod() != null) {
refreshBuilder.enablePeriodicRefresh(refreshProperties.getPeriod());
}
if (refreshProperties.isAdaptive()) {
refreshBuilder.enableAllAdaptiveRefreshTriggers();
}
builder.topologyRefreshOptions(refreshBuilder.build());
client.setOptions(clientOptions(builder, properties).build());
return client;

}

@Bean(name = "redisConnection", destroyMethod = "close")
@ConditionalOnBean(RedisModulesClient.class)
StatefulRedisModulesConnection<String, String> redisConnection(RedisModulesClient client) {
return client.connect();
}

@Bean(name = "redisClusterConnection", destroyMethod = "close")
@ConditionalOnBean(RedisModulesClusterClient.class)
StatefulRedisModulesClusterConnection<String, String> redisClusterConnection(RedisModulesClusterClient client) {
return client.connect();
}

private <K, V, C extends StatefulRedisModulesConnection<K, V>> GenericObjectPoolConfig<C> poolConfig(
RedisProperties redisProperties) {
GenericObjectPoolConfig<C> config = new GenericObjectPoolConfig<>();
config.setJmxEnabled(false);
Pool poolProps = redisProperties.getLettuce().getPool();
if (poolProps != null) {
config.setMaxTotal(poolProps.getMaxActive());
config.setMaxIdle(poolProps.getMaxIdle());
config.setMinIdle(poolProps.getMinIdle());
if (poolProps.getMaxWait() != null) {
config.setMaxWait(poolProps.getMaxWait());
}
}
return config;
}

@Bean(name = "redisConnectionPool", destroyMethod = "close")
@ConditionalOnBean(RedisModulesClient.class)
GenericObjectPool<StatefulRedisModulesConnection<String, String>> redisConnectionPool(RedisProperties properties,
RedisModulesClient client) {
return ConnectionPoolSupport.createGenericObjectPool(client::connect, poolConfig(properties));
}

@Bean(name = "redisClusterConnectionPool", destroyMethod = "close")
@ConditionalOnBean(RedisModulesClusterClient.class)
GenericObjectPool<StatefulRedisModulesClusterConnection<String, String>> redisClusterConnectionPool(
RedisProperties properties, RedisModulesClusterClient client) {
return ConnectionPoolSupport.createGenericObjectPool(client::connect, poolConfig(properties));
}
@Bean
RedisURI redisURI(RedisProperties properties) {
RedisURIBuilder builder = new RedisURIBuilder();
if (StringUtils.hasLength(properties.getUrl())) {
builder.uri(RedisURI.create(properties.getUrl()));
}
builder.host(properties.getHost());
builder.port(properties.getPort());
builder.clientName(properties.getClientName());
builder.database(properties.getDatabase());
builder.username(properties.getUsername());
if (StringUtils.hasLength(properties.getPassword())) {
builder.password(properties.getPassword());
}
if (properties.getSsl() != null) {
builder.tls(properties.getSsl().isEnabled());
}
builder.timeout(properties.getTimeout());
return builder.build();
}

private <B extends ClientOptions.Builder> B clientOptions(B builder, RedisProperties properties) {
RedisModulesClient.defaultClientOptions(builder);
Duration connectTimeout = properties.getConnectTimeout();
if (connectTimeout != null) {
builder.socketOptions(SocketOptions.builder().connectTimeout(connectTimeout).build());
}
builder.timeoutOptions(TimeoutOptions.enabled());
return builder;
}

@Bean(destroyMethod = "shutdown")
ClientResources clientResources() {
return DefaultClientResources.create();
}

@Bean(destroyMethod = "shutdown")
@ConditionalOnProperty(name = "spring.redis.cluster.enabled", havingValue = "false", matchIfMissing = true)
RedisModulesClient client(RedisURI redisURI, RedisProperties properties, ClientResources clientResources) {
RedisModulesClient client = RedisModulesClient.create(clientResources, redisURI);
client.setOptions(clientOptions(ClientOptions.builder(), properties).build());
return client;
}

@Bean(destroyMethod = "shutdown")
@ConditionalOnProperty(name = "spring.redis.cluster.enabled", havingValue = "true", matchIfMissing = false)
RedisModulesClusterClient clusterClient(RedisURI redisURI, RedisProperties properties,
ClientResources clientResources) {
RedisModulesClusterClient client = RedisModulesClusterClient.create(clientResources, redisURI);
ClusterClientOptions.Builder builder = ClusterClientOptions.builder();
Refresh refreshProperties = properties.getLettuce().getCluster().getRefresh();
ClusterTopologyRefreshOptions.Builder refreshBuilder = ClusterTopologyRefreshOptions.builder()
.dynamicRefreshSources(refreshProperties.isDynamicRefreshSources());
if (refreshProperties.getPeriod() != null) {
refreshBuilder.enablePeriodicRefresh(refreshProperties.getPeriod());
}
if (refreshProperties.isAdaptive()) {
refreshBuilder.enableAllAdaptiveRefreshTriggers();
}
builder.topologyRefreshOptions(refreshBuilder.build());
client.setOptions(clientOptions(builder, properties).build());
return client;

}

@Bean(name = "redisConnection", destroyMethod = "close")
@ConditionalOnBean(RedisModulesClient.class)
StatefulRedisModulesConnection<String, String> redisConnection(RedisModulesClient client) {
return client.connect();
}

@Bean(name = "redisClusterConnection", destroyMethod = "close")
@ConditionalOnBean(RedisModulesClusterClient.class)
StatefulRedisModulesClusterConnection<String, String> redisClusterConnection(RedisModulesClusterClient client) {
return client.connect();
}

private <K, V, C extends StatefulRedisModulesConnection<K, V>> GenericObjectPoolConfig<C> poolConfig(
RedisProperties redisProperties) {
GenericObjectPoolConfig<C> config = new GenericObjectPoolConfig<>();
config.setJmxEnabled(false);
Pool pool = redisProperties.getLettuce().getPool();
if (pool != null) {
config.setMaxTotal(pool.getMaxActive());
config.setMaxIdle(pool.getMaxIdle());
config.setMinIdle(pool.getMinIdle());
if (pool.getMaxWait() != null) {
config.setMaxWait(pool.getMaxWait());
}
if (pool.getTimeBetweenEvictionRuns() != null) {
config.setTimeBetweenEvictionRuns(pool.getTimeBetweenEvictionRuns());
}
}
return config;
}

@Bean(name = "redisConnectionPool", destroyMethod = "close")
@ConditionalOnBean(RedisModulesClient.class)
GenericObjectPool<StatefulRedisModulesConnection<String, String>> redisConnectionPool(RedisProperties properties,
RedisModulesClient client) {
return ConnectionPoolSupport.createGenericObjectPool(client::connect, poolConfig(properties));
}

@Bean(name = "redisClusterConnectionPool", destroyMethod = "close")
@ConditionalOnBean(RedisModulesClusterClient.class)
GenericObjectPool<StatefulRedisModulesClusterConnection<String, String>> redisClusterConnectionPool(
RedisProperties properties, RedisModulesClusterClient client) {
return ConnectionPoolSupport.createGenericObjectPool(client::connect, poolConfig(properties));
}

}
Loading

0 comments on commit 3d29833

Please sign in to comment.