上一篇文章寫了關於集羣搭建的步驟、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