资讯专栏INFORMATION COLUMN

深入理解Redis系列之集群环境SpringBoot集成

JeOam / 1705人阅读

摘要:上一篇文章写了关于集群搭建的步骤节点切换的相关内容有了集群肯定需要程序访问那么,今天就看一下如何访问集群的继续框架由于前面访问单机版已经写好了一个工程后面对于集群的访问也都在该工程上面进行了不了解的可以移步深入理解之集成我们在原来工程的

上一篇文章写了关于集群搭建的步骤、master节点切换的相关内容, 有了集群肯定需要程序访问, 那么,今天就看一下SpringBoot如何访问Redis集群的;
继续Spring-redis-example框架

由于前面访问单机版Redis已经写好了一个maven工程, 后面对于集群的访问也都在该工程上面进行了; 不了解的可以移步深入理解Redis之SpringBoot集成Redis;

我们在原来工程的基础上稍微改造一下, 就能够同时支持单节点与集群模式的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;
    }
}

新增一个关于集群信息的配置类, 方便后面创建JedisConnectionFactory的时候用到. 修改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);
    }
}

这两个类StandaloneRedisConfig,ClusterRedisConfig 的注解之所以用required=false 是因为这些类的Bean只有在满足配置文件中有特定的属性Key的时候才会生成, 所以对于某一个特定环境, 只可能使用一种Redis模式; 在创建RedisConnectionFactory 根据Bean是否存在, 创建出来不同模式的集群访问类;

最后, 对工程进行一下完善, 因为原来是打算把所有模式下的redis配置信息放到一个配置文件中, 然后通过注释的方式做个演示; 后面发现多创建几个application-xxx.properties文件更加方便;

创建出来的不同模式下的Redis配置信息文件如下:

application.properties 里面只放置当前运行时的spring.profiles.active 信息

spring.profiles.active=cluster

application-standalone.properties 文件内容如下:

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

代码写完之后, 可以运行一下单元测试看是否能通过; 所有关于该项目的代码在Github spring-redis-example仓库中 欢迎 star & PR

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/36961.html

相关文章

  • 深入理解Redis系列SpringBoot集成Redis

    摘要:前面一篇文章已经写了如何搭建一个单机版服务那么我们应该怎么在现有的系统中集成进来呢由于笔者使用的编程语言是所以本篇文章主要描述如何集成单节点完成数据的增删改查环境快速搭建一个工程进入网站使用该网站初始化一个工程添加相关依赖因为使用已经帮我们 前面一篇文章已经写了如何搭建一个单机版Redis服务, 那么我们应该怎么在现有的系统中集成进来呢? 由于笔者使用的编程语言是Java, 所以本篇文...

    wendux 评论0 收藏0
  • 【推荐】最新200篇:技术文章整理

    摘要:作为面试官,我是如何甄别应聘者的包装程度语言和等其他语言的对比分析和主从复制的原理详解和持久化的原理是什么面试中经常被问到的持久化与恢复实现故障恢复自动化详解哨兵技术查漏补缺最易错过的技术要点大扫盲意外宕机不难解决,但你真的懂数据恢复吗每秒 作为面试官,我是如何甄别应聘者的包装程度Go语言和Java、python等其他语言的对比分析 Redis和MySQL Redis:主从复制的原理详...

    BicycleWarrior 评论0 收藏0
  • 【推荐】最新200篇:技术文章整理

    摘要:作为面试官,我是如何甄别应聘者的包装程度语言和等其他语言的对比分析和主从复制的原理详解和持久化的原理是什么面试中经常被问到的持久化与恢复实现故障恢复自动化详解哨兵技术查漏补缺最易错过的技术要点大扫盲意外宕机不难解决,但你真的懂数据恢复吗每秒 作为面试官,我是如何甄别应聘者的包装程度Go语言和Java、python等其他语言的对比分析 Redis和MySQL Redis:主从复制的原理详...

    Mr_houzi 评论0 收藏0
  • 【推荐】最新200篇:技术文章整理

    摘要:作为面试官,我是如何甄别应聘者的包装程度语言和等其他语言的对比分析和主从复制的原理详解和持久化的原理是什么面试中经常被问到的持久化与恢复实现故障恢复自动化详解哨兵技术查漏补缺最易错过的技术要点大扫盲意外宕机不难解决,但你真的懂数据恢复吗每秒 作为面试官,我是如何甄别应聘者的包装程度Go语言和Java、python等其他语言的对比分析 Redis和MySQL Redis:主从复制的原理详...

    tommego 评论0 收藏0
  • 深入理解Redis系列集群环境搭建

    前面分别写了关于单机版Redis搭建以及使用SpringBoot来访问Redis服务, 后面也就顺着写一些关于分布式环境的搭建以及高可用的大概原理; 分布式环境准备 因为在前面一篇深入理解Redis系列之单机Redis环境搭建中已经安装好了Redis的介质, 后面只需要使用配置文件指定不同端口来做Master以及Slave节点即可;因为是在一台机器安装, 所以只能通过端口来启动不同角色的Redis...

    Ashin 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<