RedisTempalte 同时连接redis的集群模式和哨兵模式

22 篇文章 0 订阅

1、maven 依赖包

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <version>1.5.3.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>1.5.3.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>1.5.3.RELEASE</version>
        </dependency>

2、配置文件

    可以修改配置文件支持多个集群和哨兵,暂时一个集群一个哨兵

spring:
  redis:
    sentinel:
      master: sentinel-127.0.0.1-6383
      nodes: 127.0.0.1:6389,127.0.0.1:6384
      password:
      database: 0
      timeout: 2000
    cluster:
      nodes: 127.0.0.1:6388,127.0.0.1:6379
      max-redirects: 3
      password:
      database: 0
      timeout: 2000
    pool:
      max-total: 8
      max-idle: 8
      min-idle: 0
      max-wait: -1
      max-active: 8

3、读取的配置文件

BaseRedisConfig.java
        /**
	 * nodes
	 */
	private String nodes;
	/**
	 * 密码
	 */
	private String password;
	/**
	 * 超时时间
	 */
	private int timeout;
	/**
	 * 数据库,默认是0
	 */
	private int database;
RedisClusterConfig.java
@Data
@Configuration
@ConfigurationProperties(prefix = "spring.redis.cluster")
public class RedisClusterConfig extends BaseRedisConfig {
	/**
	 * maxRedirects
	 */
	private String maxRedirects;

}
RedisConfig.java
@Data
@Configuration
@ConfigurationProperties(prefix = "spring.redis")
public class RedisConfig {

	/**
	 * 哨兵的配置
	 */
	private RedisSentinelConfig sentinel;
	/**
	 * 集群的配置信息
	 */
	private RedisClusterConfig cluster;
	/**
	 * 连接池
	 */
	private RedisPoolConfig pool;

}
RedisPoolConfig.java
@Data
@Configuration
@ConfigurationProperties(prefix = "spring.redis.pool")
public class RedisPoolConfig {
	/**
	 * maxIdle
	 */
	private int maxIdle = 8;
	/**
	 * minIdle
	 */
	private int minIdle = 8;
	/**
	 * maxWait
	 */
	private int maxWait = -1;
	/**
	 * maxActive
	 */
	private int maxActive = 8;

}
RedisSentinelConfig.java
@Data
@Configuration
@ConfigurationProperties(prefix = "spring.redis.sentinel")
public class RedisSentinelConfig extends BaseRedisConfig {
	/**
	 * master
	 */
	private String master;

}
Redis.java
public class Redis {

	/**
	 * 连接工厂类
	 *
	 * @param connectionFactory 连接工厂类
	 * @param redisConfig       redis基本配置信息
	 * @return 返回 连接工厂类
	 */
	protected JedisConnectionFactory buildConnectionFactory(JedisConnectionFactory connectionFactory, RedisConfig redisConfig) {
		connectionFactory.setUsePool(true);
		connectionFactory.afterPropertiesSet();
		connectionFactory.setPoolConfig(jedisPoolConfig(redisConfig.getPool()));
		return connectionFactory;
	}


	/**
	 * 构建 连接模板
	 *
	 * @param redisConnectionFactory redis 连接工厂
	 * @return 返回 连接模板
	 */
	protected StringRedisTemplate buildRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
		StringRedisTemplate redisTemplate = new StringRedisTemplate();
		redisTemplate.setConnectionFactory(redisConnectionFactory);

		return redisTemplate;
	}


	/**
	 * redis 序列化的方式,避免数据异常
	 *
	 * @return 序列化的方式
	 */
	private StringRedisSerializer stringRedisSerializer() {
		return new StringRedisSerializer();
	}


	/**
	 * 连接池的配置信息
	 *
	 * @param redisPoolConfig 连接池
	 * @return 返回 连接池的配置信息
	 */
	private JedisPoolConfig jedisPoolConfig(RedisPoolConfig redisPoolConfig) {
		JedisPoolConfig poolConfig = new JedisPoolConfig();
		poolConfig.setMaxTotal(redisPoolConfig.getMaxActive());
		poolConfig.setMinIdle(redisPoolConfig.getMinIdle());
		poolConfig.setMaxIdle(redisPoolConfig.getMaxIdle());
		poolConfig.setMaxWaitMillis(redisPoolConfig.getMaxWait());
		return poolConfig;
	}


}
RedisCluster.java
@Configuration
public class RedisCluster extends Redis {

	/**
	 * 集群的节点地址信息
	 */
	@Autowired
	private RedisConfig redisConfig;

	/**
	 * 集群的bean
	 *
	 * @return 返回获取集群信息的模板
	 */
	@Bean(name = "redisClusterTemplate")
	@Primary
	public StringRedisTemplate redisClusterTemplate() {
		JedisConnectionFactory connectionFactory = new JedisConnectionFactory(this.redisClusterConfiguration());
		RedisClusterConfig redisClusterConfig = this.redisConfig.getCluster();
		connectionFactory.setTimeout(redisClusterConfig.getTimeout());
		connectionFactory.setDatabase(redisClusterConfig.getDatabase());
		connectionFactory.setPassword(redisClusterConfig.getPassword());
		return super.buildRedisTemplate(buildConnectionFactory(connectionFactory, redisConfig));
	}


	// -------- 私有方法 --------

	/**
	 * redis集群的配置信息
	 *
	 * @return 返回 redis集群的配置信息
	 */
	private RedisClusterConfiguration redisClusterConfiguration() {
		String[] nodes = redisConfig.getCluster().getNodes().split(",");
		Set<String> setNodes = new HashSet<>();
		for (String node : nodes) {
			setNodes.add(node.trim());
		}
		RedisClusterConfiguration configuration = new RedisClusterConfiguration(setNodes);
		return configuration;
	}


}

RedisSentinel.java

@Configuration
public class RedisSentinel extends Redis {

	/**
	 * 哨兵模式的节点地址信息
	 */
	@Autowired
	private RedisConfig redisConfig;

	/**
	 * 哨兵模式的配置模板
	 *
	 * @return 返回 哨兵模式的配置模板
	 */
	@Bean(name = "redisSentinelTemplate")
	@Primary
	public StringRedisTemplate redisSentinelTemplate() {
		JedisConnectionFactory connectionFactory = new JedisConnectionFactory(this.redisSentinelConfiguration());
		RedisSentinelConfig redisSentinelConfig = this.redisConfig.getSentinel();
		connectionFactory.setTimeout(redisSentinelConfig.getTimeout());
		connectionFactory.setDatabase(redisSentinelConfig.getDatabase());
		connectionFactory.setPassword(redisSentinelConfig.getPassword());
		return super.buildRedisTemplate(buildConnectionFactory(connectionFactory, redisConfig));
	}


	// -------- 私有方法 --------

	/**
	 * redis 哨兵的配置信息
	 *
	 * @return 返回 redis 哨兵的配置信息
	 */
	private RedisSentinelConfiguration redisSentinelConfiguration() {
		RedisSentinelConfig redisSentinelConfig = this.redisConfig.getSentinel();
		String[] nodes = redisSentinelConfig.getNodes().split(",");
		Set<String> setNodes = new HashSet<>();
		for (String n : nodes) {
			setNodes.add(n.trim());
		}
		RedisSentinelConfiguration configuration = new RedisSentinelConfiguration(redisSentinelConfig.getMaster(), setNodes);
		return configuration;
	}


}

4、测试

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class RedisCompare {

	/**
	 * redisSentinelTemplate
	 */
	@Resource(name = "redisSentinelTemplate")
	private StringRedisTemplate redisSentinelTemplate;
	/**
	 * redisClusterTemplate
	 */
	@Resource(name = "redisClusterTemplate")
	private StringRedisTemplate redisClusterTemplate;
	/**
	 * redisCluster
	 */
	@Autowired
	private RedisCluster redisCluster;
	/**
	 * redisSentinel
	 */
	@Autowired
	private RedisSentinel redisSentinel;

	@Test
	public void test() {
		ValueOperations<String, String> redisSentinelOps = redisSentinelTemplate.opsForValue();
		Long key = redisSentinelOps.size("key");
		System.out.println(key);

		ValueOperations<String, String> redisClusterOps = redisClusterTemplate.opsForValue();
		key = redisClusterOps.size("key");
		System.out.println(key);


		redisSentinelOps = redisCluster.redisClusterTemplate().opsForValue();
		key = redisSentinelOps.size("key");
		System.out.println(key);

		redisClusterOps = redisSentinel.redisSentinelTemplate().opsForValue();
		key = redisClusterOps.size("key");
		System.out.println(key);
	}


}

5、结果

5
0
0
5

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

比嗨皮兔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值