SpringBoot中使用Redis

本文介绍SpringBoot Redis的基本使用多Redis数据源配置

基本使用

SpringBoot 2.x项目中引入spring-boot-starter-data-redis

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

查看引入包,发现SpringBoot 2.x 使用的是: lettuce

配置 application.yml

1
2
3
4
5
6
spring:
redis:
host: 127.0.0.1
port: 6379
password:
database: 0

使用:

1
2
3
4
5
@Autowired
private RedisTemplate<String, String> redisTemplate;
@Autowired
private StringRedisTemplate stringRedisTemplate;

SpringBoot Redis的自动化配置位于:RedisAutoConfiguration

多Redis数据源配置

项目中常常用到不止一个Redis数据源,如果按照上面的简单配置,那么很难满足需要。需要我们自己来声明 ConnectionFactoryRedisTemplate

application.yml中配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
spring:
redis: #redis配置
redis-a:
host: 127.0.0.1
port: 6379
password: pwd@local
ssl: true
database: 0
redis-b:
host: 127.0.0.1
port: 6479
password: pwd@local
ssl: true
database: 0

以上配置是在spring.redis下做区分两个数据源,这是为了能够方便地查找配置位置。

添加RedisConfig.java,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
@Configuration
public class RedisConfig {
@Bean(name = "aRedisTemplate")
public StringRedisTemplate aRedisTemplate(
@Qualifier("aLettuceConnectionFactory") RedisConnectionFactory aLettuceConnectionFactory) {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(aLettuceConnectionFactory);
return template;
}
@Bean(name = "bRedisTemplate")
public StringRedisTemplate bRedisTemplate(
@Qualifier("bConnectionFactory") RedisConnectionFactory bConnectionFactory) {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(bConnectionFactory);
return template;
}
@Bean(name = "aLettuceConnectionFactory")
@Primary
public LettuceConnectionFactory aLettuceConnectionFactory(@Value("${spring.redis.redis-a.host}") String host,
@Value("${spring.redis.redis-a.port}") int port,
@Value("${spring.redis.redis-a.password}") String password,
@Value("${spring.redis.redis-a.ssl}") boolean ssl,
@Value("${spring.redis.redis-a.database}") int database) {
LettuceClientConfiguration.LettuceClientConfigurationBuilder builder = LettuceClientConfiguration.builder();
if (ssl) {
builder.useSsl();
}
RedisStandaloneConfiguration standaloneConfiguration = getRedisStandaloneConfiguration(host, port, password, database);
return new LettuceConnectionFactory(standaloneConfiguration, builder.build());
}
@Bean(name = "bConnectionFactory")
public LettuceConnectionFactory bConnectionFactory(@Value("${spring.redis.redis-b.host}") String host,
@Value("${spring.redis.redis-b.port}") int port,
@Value("${spring.redis.redis-b.password}") String password,
@Value("${spring.redis.redis-b.ssl}") boolean ssl,
@Value("${spring.redis.redis-b.database}") int database) {
LettuceClientConfiguration.LettuceClientConfigurationBuilder builder = LettuceClientConfiguration.builder();
if (ssl) {
builder.useSsl();
}
RedisStandaloneConfiguration standaloneConfiguration = getRedisStandaloneConfiguration(host, port, password, database);
return new LettuceConnectionFactory(standaloneConfiguration, builder.build());
}
private RedisStandaloneConfiguration getRedisStandaloneConfiguration(String host, int port, String password, int database) {
RedisStandaloneConfiguration standaloneConfiguration = new RedisStandaloneConfiguration();
standaloneConfiguration.setHostName(host);
standaloneConfiguration.setPort(port);
standaloneConfiguration.setPassword(password);
standaloneConfiguration.setDatabase(database);
return standaloneConfiguration;
}
}

使用:

1
2
3
4
5
6
7
8
9
@Autowired
@Qualifier("aRedisTemplate")
private StringRedisTemplate aRedisTemplate;
@Autowired
@Qualifier("bRedisTemplate")
private StringRedisTemplate bRedisTemplate;

如果想要忽略掉默认的Redis配置,那么可以将 RedisAutoConfigurationRedisReactiveAutoConfiguration 加入忽略:

1
@EnableAutoConfiguration(exclude = {RedisAutoConfiguration.class, RedisReactiveAutoConfiguration.class})