集群Redis的配置
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;
? ? }
}
新增一個(gè)關(guān)于集群信息的配置類, 方便后面創(chuàng)建JedisConnectionFactory的時(shí)候用到. 修改Application類
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);
? ? }
}
這兩個(gè)類StandaloneRedisConfig,ClusterRedisConfig 的注解之所以用required=false 是因?yàn)檫@些類的Bean只有在滿足配置文件中有特定的屬性Key的時(shí)候才會(huì)生成, 所以對(duì)于某一個(gè)特定環(huán)境, 只可能使用一種Redis模式; 在創(chuàng)建RedisConnectionFactory 根據(jù)Bean是否存在, 創(chuàng)建出來不同模式的集群訪問類;
最后, 對(duì)工程進(jìn)行一下完善, 因?yàn)樵瓉硎谴蛩惆阉心J较碌膔edis配置信息放到一個(gè)配置文件中, 然后通過注釋的方式做個(gè)演示; 后面發(fā)現(xiàn)多創(chuàng)建幾個(gè)application-xxx.properties文件更加方便;
創(chuàng)建出來的不同模式下的Redis配置信息文件如下:
application.properties 里面只放置當(dāng)前運(yùn)行時(shí)的spring.profiles.active 信息
spring.profiles.active=cluster
application-standalone.properties 文件內(nèi)容如下:
spring.redis.host=localhost
spring.redis.port=6379
application-cluster.properties 文件內(nèi)容如下:
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
這樣, 如果測(cè)試的時(shí)候, 只需要切換application.properties文件中的spring.profiles.active屬性值即可; 可選項(xiàng)有: standalone|cluster|sentinel