天天看點

簡單一文了解SpringBoot與Redis的整合(哨兵模式)

您好,我是碼農飛哥,感謝您閱讀本文!本文主要介紹SpringBoot如何整合Redis。

文章目錄

  • ​​引入依賴​​
  • ​​Redis的配置​​
  • ​​最簡單的配置(單機模式)​​
  • ​​哨兵模式配置​​
  • ​​1.在yml檔案中配置好哨兵​​
  • ​​2. 定義配置類​​
  • ​​源碼分析​​
  • ​​總結​​

引入依賴

啥都不說,先引入依賴,SpringBoot其實已經整合好了redis,這裡就直接使用Spring的redis來操作。

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

Redis的配置

最簡單的配置(單機模式)

直接在application.yml 添加如下配置:

spring:
  redis:
    host: 127.0.0.1
    password: 123456
    port: 6379
    database: 1      

配置好之後就可以直接使用StringRedisTemplate 以及RedisTemplate<Object, Object> 兩個redis用戶端的操作類了。這是由于SpringBoot的自動配置,SpringBoot通過RedisProperties類來映射yml中的Redis配置,通過RedisAutoConfiguration配置類來加載Redis配置。

哨兵模式配置

1.在yml檔案中配置好哨兵

spring:
  redis:
    sentinel:
      master: mymaster
      nodes: 127.0.0.1:26379,127.0.0.1:26380,127.0.0.1:26381
    password: 123456
    lettuce:
      pool:
        max-idle: 30
    database: 1      

2. 定義配置類

// 定義配置類
@Configuration
// 啟動自動配置
@EnableAutoConfiguration
public class RedisSentinelConfig {
    private static Logger logger = LoggerFactory.getLogger(RedisSentinelConfig.class);

    @Value("#{'${spring.redis.sentinel.nodes}'.split(',')}")
    private List<String> nodes;

    @Value("${spring.redis.password}")
    private String password;

    @Value("${spring.redis.sentinel.nodes}")
    private String redisNodes;

    @Value("${spring.redis.sentinel.master}")
    private String master;

  // 定義redis的連接配接池
    @Bean(name = "poolConfig")
    @ConfigurationProperties(prefix = "spring.redis")
    public JedisPoolConfig poolConfig() {
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        return poolConfig;
    }
  
  //定義RedisSentinelConfiguration,用于設定哨兵
    @Bean
    public RedisSentinelConfiguration sentinelConfiguration() {
        RedisSentinelConfiguration redisSentinelConfiguration = new RedisSentinelConfiguration();
        //配置matser的名稱
        redisSentinelConfiguration.master(master);
        //資料庫是1庫
        redisSentinelConfiguration.setDatabase(1);
        redisSentinelConfiguration.setPassword(password);
        //配置redis的哨兵sentinel
        Set<RedisNode> redisNodeSet = new HashSet<>();
        nodes.forEach(x -> {
            redisNodeSet.add(new RedisNode(x.split(":")[0], Integer.parseInt(x.split(":")[1])));
        });
        logger.info("redisNodeSet -->" + redisNodeSet);
        redisSentinelConfiguration.setSentinels(redisNodeSet);
        return redisSentinelConfiguration;
    }

  //定義工廠類
    @Bean
    public JedisConnectionFactory redisConnectionFactory(
            JedisPoolConfig poolConfig,
            RedisSentinelConfiguration sentinelConfig) {
        return new JedisConnectionFactory(sentinelConfig, poolConfig);
    }      

這樣就定義好了。

源碼分析

RedisAutoConfiguration配置類的代碼如下;

@Configuration
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)
@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
public class RedisAutoConfiguration {
  
  //定義了RedisTemplate<Object, Object>的執行個體,隻有當存在名為redisTemplate的時才啟動
  @Bean
  @ConditionalOnMissingBean(name = "redisTemplate")
  public RedisTemplate<Object, Object> redisTemplate(
      RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
    RedisTemplate<Object, Object> template = new RedisTemplate<>();
    template.setConnectionFactory(redisConnectionFactory);
    return template;
  }

  //定義了StringRedisTemplate的執行個體
  @Bean
  @ConditionalOnMissingBean
  public StringRedisTemplate stringRedisTemplate(
      RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
    StringRedisTemplate template = new StringRedisTemplate();
    template.setConnectionFactory(redisConnectionFactory);
    return template;
  }

}      
  1. ​@Configuration​

    ​注解标記RedisAutoConfiguration類是一個配置類,可以替換xml配置檔案,被注解的類内部包含有一個或多個被@Bean注解的方法,這些方法将會被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext類進行掃描,并用于建構bean定義,初始化Spring容器。通過該注解之後可以保證Bean是單例的。
  2. ​@ConditionalOnClass​

    ​ 的作用是定義條件裝配,隻有當RedisOperations類存在時才啟動該配置
  3. ​@EnableConfigurationProperties​

    ​​ 的作用是開啟@ConfigurationProperties。​

    ​@ConfigurationProperties​

    ​的作用是将配置檔案轉換成類對象,便于修改或者擷取值。
  4. ​@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })​

    ​的作用是引入LettuceConnectionConfiguration和JedisConnectionConfiguration兩個配置類,其中LettuceConnectionConfiguration配置類中定義了LettuceConnectionFactory連接配接工廠類,JedisConnectionConfiguration定義了JedisConnectionFactory連接配接工廠類。

總結

繼續閱讀