0
点赞
收藏
分享

微信扫一扫

简单一文了解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连接工厂类。

总结

本文详细介绍了如何在SpringBoot中整合Redis。最简单的单机模式的Redis整合只需要在yml文件中配置redis数据库的地址即可,其他哨兵模式和集群模式的Redis配置需要自己定义配置类。


举报

相关推荐

0 条评论