您好,我是碼農飛哥,感謝您閱讀本文!本文主要介紹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;
}
}
-
注解标記RedisAutoConfiguration類是一個配置類,可以替換xml配置檔案,被注解的類内部包含有一個或多個被@Bean注解的方法,這些方法将會被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext類進行掃描,并用于建構bean定義,初始化Spring容器。通過該注解之後可以保證Bean是單例的。@Configuration
-
的作用是定義條件裝配,隻有當RedisOperations類存在時才啟動該配置@ConditionalOnClass
-
的作用是開啟@ConfigurationProperties。@EnableConfigurationProperties
的作用是将配置檔案轉換成類對象,便于修改或者擷取值。@ConfigurationProperties
-
的作用是引入LettuceConnectionConfiguration和JedisConnectionConfiguration兩個配置類,其中LettuceConnectionConfiguration配置類中定義了LettuceConnectionFactory連接配接工廠類,JedisConnectionConfiguration定義了JedisConnectionFactory連接配接工廠類。@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })