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

cn.jiangzeyin.redis.RedisConnectionFactoryPool Maven / Gradle / Ivy

package cn.jiangzeyin.redis;

import cn.jiangzeyin.common.spring.SpringUtil;
import org.springframework.data.redis.connection.RedisClusterConfiguration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisNode;
import org.springframework.data.redis.connection.RedisSentinelConfiguration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
import redis.clients.jedis.JedisPoolConfig;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;

public class RedisConnectionFactoryPool {
    private static RedisProperties redisProperties;
    private static final ConcurrentHashMap REDIS_CONNECTION_FACTORY_CONCURRENT_HASH_MAP = new ConcurrentHashMap<>();

    static RedisConnectionFactory getRedisConnectionFactory(int database) {
        RedisConnectionFactory redisConnectionFactory = REDIS_CONNECTION_FACTORY_CONCURRENT_HASH_MAP.get(database);
        if (redisConnectionFactory != null)
            return redisConnectionFactory;
        if (redisProperties == null)
            redisProperties = SpringUtil.getBean(RedisProperties.class);
        redisConnectionFactory = new RedisConnectionConfiguration(redisProperties, database).redisConnectionFactory();
        REDIS_CONNECTION_FACTORY_CONCURRENT_HASH_MAP.put(database, redisConnectionFactory);
        return redisConnectionFactory;
    }

    static RedisConnectionFactory getRedisConnectionFactory() {
        if (redisProperties == null)
            redisProperties = SpringUtil.getBean(RedisProperties.class);
        return getRedisConnectionFactory(redisProperties.getDatabase());
    }

    static int getDefaultDatabase() {
        if (redisProperties == null)
            redisProperties = SpringUtil.getBean(RedisProperties.class);
        return redisProperties.getDatabase();
    }

    /**
     * Redis connection configuration.
     */
    private static class RedisConnectionConfiguration {
        private final RedisProperties properties;
        private final int database;

        private RedisConnectionConfiguration(RedisProperties redisProperties, int database) {
            this.properties = redisProperties;
            this.database = database;
        }

        JedisConnectionFactory redisConnectionFactory() {
            return applyProperties(createJedisConnectionFactory());
        }

        private JedisConnectionFactory applyProperties(
                JedisConnectionFactory factory) {
            factory.setHostName(this.properties.getHost());
            factory.setPort(this.properties.getPort());
            if (this.properties.getPassword() != null) {
                factory.setPassword(this.properties.getPassword());
            }
            factory.setDatabase(database);
            if (this.properties.getTimeout() > 0) {
                factory.setTimeout(this.properties.getTimeout());
            }
            factory.afterPropertiesSet();
            return factory;
        }

        private RedisSentinelConfiguration getSentinelConfig() {
            RedisProperties.Sentinel sentinelProperties = this.properties.getSentinel();
            if (sentinelProperties != null) {
                RedisSentinelConfiguration config = new RedisSentinelConfiguration();
                config.master(sentinelProperties.getMaster());
                config.setSentinels(createSentinels(sentinelProperties));
                return config;
            }
            return null;
        }

        /**
         * Create a {@link RedisClusterConfiguration} if necessary.
         *
         * @return {@literal null} if no cluster settings are set.
         */
        private RedisClusterConfiguration getClusterConfiguration() {
            if (this.properties.getCluster() == null) {
                return null;
            }
            RedisProperties.Cluster clusterProperties = this.properties.getCluster();
            RedisClusterConfiguration config = new RedisClusterConfiguration(
                    clusterProperties.getNodes());

            if (clusterProperties.getMaxRedirects() != null) {
                config.setMaxRedirects(clusterProperties.getMaxRedirects());
            }
            return config;
        }

        private List createSentinels(RedisProperties.Sentinel sentinel) {
            List nodes = new ArrayList<>();
            for (String node : StringUtils.commaDelimitedListToStringArray(sentinel.getNodes())) {
                try {
                    String[] parts = StringUtils.split(node, ":");
                    Assert.state(parts.length == 2, "Must be defined as 'host:port'");
                    nodes.add(new RedisNode(parts[0], Integer.valueOf(parts[1])));
                } catch (RuntimeException ex) {
                    throw new IllegalStateException(
                            "Invalid redis sentinel " + "property '" + node + "'", ex);
                }
            }
            return nodes;
        }

        private JedisConnectionFactory createJedisConnectionFactory() {
            JedisPoolConfig poolConfig = this.properties.getPool() != null
                    ? jedisPoolConfig() : new JedisPoolConfig();

            if (getSentinelConfig() != null) {
                return new JedisConnectionFactory(getSentinelConfig(), poolConfig);
            }
            if (getClusterConfiguration() != null) {
                return new JedisConnectionFactory(getClusterConfiguration(), poolConfig);
            }
            return new JedisConnectionFactory(poolConfig);
        }

        private JedisPoolConfig jedisPoolConfig() {
            JedisPoolConfig config = new JedisPoolConfig();
            RedisProperties.Pool props = this.properties.getPool();
            config.setMaxTotal(props.getMaxActive());
            config.setMaxIdle(props.getMaxIdle());
            config.setMinIdle(props.getMinIdle());
            config.setMaxWaitMillis(props.getMaxWait());
            return config;
        }

    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy