All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.github.wooenrico.redis.LettuceConnectionConfiguration Maven / Gradle / Ivy

package io.github.wooenrico.redis;

import io.lettuce.core.ClientOptions;
import io.lettuce.core.SocketOptions;
import io.lettuce.core.TimeoutOptions;
import io.lettuce.core.cluster.ClusterClientOptions;
import io.lettuce.core.cluster.ClusterTopologyRefreshOptions;
import io.lettuce.core.resource.ClientResources;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import org.springframework.data.redis.connection.RedisClusterConfiguration;
import org.springframework.data.redis.connection.RedisSentinelConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;
import org.springframework.util.StringUtils;

public class LettuceConnectionConfiguration extends RedisConnectionConfiguration {

    public LettuceConnectionConfiguration(RedisProperties properties) {
        super(properties);
    }

    @Override
    public LettuceConnectionFactory createRedisConnectionFactory() {
        return this.createLettuceConnectionFactory(null);
    }

    public LettuceConnectionFactory createLettuceConnectionFactory(ClientResources clientResources) {

        if (clientResources == null) {
            clientResources = ClientResources.create();
        }
        LettuceClientConfiguration clientConfiguration = getLettuceClientConfiguration(clientResources, this.properties.getLettuce().getPool());
        // sentinel
        RedisSentinelConfiguration sentinelConfig = this.getSentinelConfig();
        if (sentinelConfig != null) {
            return new LettuceConnectionFactory(sentinelConfig, clientConfiguration);
        }
        // cluster
        RedisClusterConfiguration clusterConfiguration = this.getClusterConfiguration();
        if (clusterConfiguration != null) {
            return new LettuceConnectionFactory(clusterConfiguration, clientConfiguration);
        }
        // standalone
        return new LettuceConnectionFactory(this.getStandaloneConfig(), clientConfiguration);
    }

    private LettuceClientConfiguration getLettuceClientConfiguration(ClientResources clientResources, RedisProperties.Pool pool) {
        LettuceClientConfiguration.LettuceClientConfigurationBuilder builder;
        // pool or not
        if (pool != null && pool.getEnabled() != null && pool.getEnabled()) {
            builder = LettucePoolingClientConfiguration.builder().poolConfig(this.getPoolConfig(pool));
        } else {
            builder = LettuceClientConfiguration.builder();
        }
        // properties
        if (clientResources != null) {
            builder.clientResources(clientResources);
        }
        if (this.properties.getTimeout() != null) {
            builder.commandTimeout(this.properties.getTimeout());
        }
        if (StringUtils.hasText(this.properties.getClientName())) {
            builder.clientName(this.properties.getClientName());
        }
        if (this.properties.getLettuce().getShutdownTimeout() != null && !this.properties.getLettuce().getShutdownTimeout().isZero()) {
            builder.shutdownTimeout(this.properties.getLettuce().getShutdownTimeout());
        }
        // ssl
        if (this.properties.isSsl()) {
            builder.useSsl();
        }
        if (StringUtils.hasText(this.properties.getUrl()) && this.urlUsesSsl()) {
            builder.useSsl();
        }
        // client options (timeout、connectTimeout、refresh)
        ClientOptions clientOptions = this.createClientOptions();
        if (clientOptions != null) {
            builder.clientOptions(clientOptions);
        }
        return builder.build();
    }

    private ClientOptions createClientOptions() {
        ClientOptions.Builder builder = ClientOptions.builder();
        if (this.properties.getCluster() != null) {
            ClusterClientOptions.Builder cluster = ClusterClientOptions.builder();
            RedisProperties.Lettuce.Cluster.Refresh refreshProperties = this.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 = cluster.topologyRefreshOptions(refreshBuilder.build());
        }
        // connectTimeout
        if (this.properties.getConnectTimeout() != null) {
            builder.socketOptions(SocketOptions.builder().connectTimeout(this.properties.getConnectTimeout()).build());
        }
        return builder.timeoutOptions(TimeoutOptions.enabled()).build();
    }

    private GenericObjectPoolConfig getPoolConfig(RedisProperties.Pool properties) {
        GenericObjectPoolConfig config = new GenericObjectPoolConfig<>();
        config.setMaxTotal(properties.getMaxActive());
        config.setMaxIdle(properties.getMaxIdle());
        config.setMinIdle(properties.getMinIdle());
        if (properties.getTimeBetweenEvictionRuns() != null) {
            config.setTimeBetweenEvictionRuns(properties.getTimeBetweenEvictionRuns());
        }
        if (properties.getMaxWait() != null) {
            config.setMaxWait(properties.getMaxWait());
        }
        return config;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy