深刻理解Redis系列之集羣環境SpringBoot集成

上一篇文章寫了關於集羣搭建的步驟、master節點切換的相關內容, 有了集羣確定須要程序訪問, 那麼,今天就看一下SpringBoot如何訪問Redis集羣的;

繼續Spring-redis-example框架

因爲前面訪問單機版Redis已經寫好了一個maven工程, 後面對於集羣的訪問也都在該工程上面進行了; 不瞭解的能夠移步深刻理解Redis之SpringBoot集成Redis;java

咱們在原來工程的基礎上稍微改造一下, 就可以同時支持單節點與集羣模式的Redis訪問了.node

package com.terrylmay.redis.example.config;

import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConfigurationProperties(prefix = "spring.redis.cluster")
@ConditionalOnProperty(name = {"spring.redis.cluster.nodes"})
public class ClusterRedisConfig {

    private String nodes;

    private String password;

    private int maxRedirects;

    public String getNodes() {
        return nodes;
    }

    public void setNodes(String nodes) {
        this.nodes = nodes;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getMaxRedirects() {
        return maxRedirects;
    }

    public void setMaxRedirects(int maxRedirects) {
        this.maxRedirects = maxRedirects;
    }
}

新增一個關於集羣信息的配置類, 方便後面建立JedisConnectionFactory的時候用到. 修改Application類git

package com.terrylmay.redis.example;

import com.terrylmay.redis.example.config.ClusterRedisConfig;
import com.terrylmay.redis.example.config.StandaloneRedisConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisClusterConfiguration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.StringRedisTemplate;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

import java.util.Arrays;
import java.util.Collections;

@SpringBootApplication(scanBasePackages = {"com.terrylmay.redis.example"})
public class RedisExampleApplication {

    public static void main(String[] args) {
        SpringApplication.run(RedisExampleApplication.class, args);
    }
    
    @Autowired(required = false) 
    StandaloneRedisConfig standaloneRedisConfig;

    @Autowired(required = false)
    ClusterRedisConfig clusterRedisConfig;

    @Autowired
    RedisConnectionFactory redisConnectionFactory;

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        JedisConnectionFactory factory = null;
        if (standaloneRedisConfig != null) {
            factory = new JedisConnectionFactory(new RedisStandaloneConfiguration(standaloneRedisConfig.getHost(), standaloneRedisConfig.getPort()));
            return factory;
        }

        if (clusterRedisConfig != null) {
            JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
            RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration(Arrays.asList(clusterRedisConfig.getNodes().split(",")));
            redisClusterConfiguration.setMaxRedirects(clusterRedisConfig.getMaxRedirects());
            redisClusterConfiguration.setPassword(clusterRedisConfig.getPassword());
            factory = new JedisConnectionFactory(redisClusterConfiguration, jedisPoolConfig);
        }

        return factory;
    }

    @Bean
    public StringRedisTemplate stringRedisTemplate() {
        return new StringRedisTemplate(redisConnectionFactory);
    }
}

這兩個類StandaloneRedisConfig,ClusterRedisConfig 的註解之因此用required=false 是由於這些類的Bean只有在知足配置文件中有特定的屬性Key的時候纔會生成, 因此對於某一個特定環境, 只可能使用一種Redis模式; 在建立RedisConnectionFactory 根據Bean是否存在, 建立出來不一樣模式的集羣訪問類;github

最後, 對工程進行一下完善, 由於原來是打算把全部模式下的redis配置信息放到一個配置文件中, 而後經過註釋的方式作個演示; 後面發現多建立幾個application-xxx.properties文件更加方便;redis

建立出來的不一樣模式下的Redis配置信息文件以下:spring

application.properties 裏面只放置當前運行時的spring.profiles.active 信息segmentfault

spring.profiles.active=cluster

application-standalone.properties 文件內容以下:app

spring.redis.host=localhost
spring.redis.port=6379

application-cluster.properties 文件內容以下:框架

spring.redis.cluster.nodes=127.0.0.1:6379,127.0.0.1:6380,127.0.0.1:6381,127.0.0.1:26379,127.0.0.1:26380,127.0.0.1:26381,
spring.redis.cluster.password=
spring.redis.cluster.max-redirects=12

這樣, 若是測試的時候, 只須要切換application.properties文件中的spring.profiles.active屬性值便可; 可選項有: standalone|cluster|sentinelmaven

代碼寫完以後, 能夠運行一下單元測試看是否能經過; 全部關於該項目的代碼在Github spring-redis-example倉庫中 歡迎 star & PR

相關文章
相關標籤/搜索