1. 程式人生 > >Spring boot 配置 Redis集模式

Spring boot 配置 Redis集模式

Spring官方提供了Redis叢集的配置,這裡不復述官方的文件,這篇文章主要指導讀者手動配置Redis叢集

以下是我搜集並整理出來的一個configuration,不足之處或錯誤請大家提出並指正

package cn.xt.config;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisClusterConfiguration;
import org.springframework.data.redis.connection.RedisNode;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.StringUtils;
import redis.clients.jedis.JedisPoolConfig;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

/**
 * Redis 配置叢集
 * @date 2018/10/15 9:51
 */
@Configuration
public class RedisConfig {

    private final Logger logger = LoggerFactory.getLogger(RedisConfig.class);

    // private final String defaultClusterNodes = "10.16.5.43:6379,10.16.5.44:6379,10.16.5.45:6379";

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

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

    @Value("${redis.pool.max-active}")
    private Integer maxTotal;

    @Value("${redis.pool.max-idle}")
    private Integer maxIdle;

    @Value("${redis.pool.min-idle}")
    private Integer minIdle;

    @Value("${redis.pool.max-wait}")
    private Integer maxWaitMillis;

    /**
     * 建立連線工廠
     * @return
     */
    @Bean
    public JedisConnectionFactory createConnectionFactory() {
        JedisConnectionFactory jedisConnectionFactory = null;
        // 叢集模式
        RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration();
        // 載入伺服器叢集節點
        Set<String> serviceRedisNodes = new HashSet<>(Arrays.asList(clusterNodes.split(",")));
        try {
            // 轉換成Redis點節
            Set<RedisNode> clusterNodes = new HashSet<>(serviceRedisNodes.size());
            for(String node : serviceRedisNodes) {
                String[] ipAndPort = StringUtils.split(node, ":");
                String ip = ipAndPort[0];
                Integer port = Integer.parseInt(ipAndPort[1]);
                clusterNodes.add(new RedisNode(ip, port));
            }
            redisClusterConfiguration.setClusterNodes(clusterNodes);

            // Redis 連線池配置
            JedisPoolConfig poolConfig = new JedisPoolConfig();
            poolConfig.setMaxIdle(maxIdle);
            poolConfig.setMaxTotal(maxTotal);
            poolConfig.setMinIdle(minIdle);
            poolConfig.setMaxWaitMillis(maxWaitMillis);

            // 建立連線工廠
            jedisConnectionFactory = new JedisConnectionFactory(redisClusterConfiguration, poolConfig);
            // 設定資料庫
            jedisConnectionFactory.setDatabase(0);
            // 設定密碼
            jedisConnectionFactory.setPassword(password);
        } catch (Exception e) {
            logger.error("建立Redis連線工廠錯誤:{}", e);
        }
        return jedisConnectionFactory;
    }

    /**
     * 註冊RedisTemplate
     * @param factory 連線工廠
     * @return
     */
    @Bean
    public RedisTemplate registerRedisTemplate(JedisConnectionFactory factory) {
        RedisTemplate redisTemplate = new RedisTemplate();
        redisTemplate.setConnectionFactory(factory);
        return redisTemplate;
    }

}