上一篇文章写了关于集群搭建的步骤、master节点切换的相关内容, 有了集群确定须要程序访问, 那么,今天就看一下SpringBoot如何访问Redis集群的;
因为前面访问单机版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|sentinel
maven
代码写完以后, 能够运行一下单元测试看是否能经过; 全部关于该项目的代码在Github spring-redis-example仓库中 欢迎 star & PR