springboot配置Redis基本使用
阿新 • • 發佈:2021-12-02
一、SpringBoot配置Reids
1、pom引入spring-boot-starter-data-redis包
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId>
<version>3.4.1</version> </dependency>
< !-- 設定了連線池的相關引數-->
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency>
2、application.yml配置Redis地址、埠及基本資訊
注:如果Redis開啟了密碼,在timeout前增加password:xxx
# Spring配置 spring: # redis配置 redis: # 地址 host: 127.0.0.1 # 埠,預設為6379 port: 6379 # 連線超時時間 timeout: 10s lettuce: pool: # 連線池中的最小空閒連線 min-idle: 0 # 連線池中的最大空閒連線 max-idle: 8 # 連線池的最大資料庫連線數 max-active: 8 # #連線池最大阻塞等待時間(使用負值表示沒有限制) max-wait: -1m
多redis配置
spring: redis: host: 127.0.0.1 port: 6379 password: lettuce: pool: max-active: 32 max-wait: 300 max-idle: 16 min-idle: 8 database: 0 local-redis: host: 127.0.0.1 port: 6379 database: 0 password: lettuce: pool: max-active: 16 max-wait: 100 max-idle: 8 min-idle: 4
二、增加RedisConfig.java啟動載入類
配置類,採用Lettuce,基本設定如下,套路都差不多,先讀取配置,初始化ConnectionFactory
,然後建立RedisTemplate
例項,設定連線工廠
@Configuration
public class RedisAutoConfig {
@Bean
public LettuceConnectionFactory defaultLettuceConnectionFactory(RedisStandaloneConfiguration defaultRedisConfig,
GenericObjectPoolConfig defaultPoolConfig) {
LettuceClientConfiguration clientConfig =
LettucePoolingClientConfiguration.builder().commandTimeout(Duration.ofMillis(100))
.poolConfig(defaultPoolConfig).build();
return new LettuceConnectionFactory(defaultRedisConfig, clientConfig);
}
@Bean
public RedisTemplate<String, String> defaultRedisTemplate(
LettuceConnectionFactory defaultLettuceConnectionFactory) {
RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(defaultLettuceConnectionFactory);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
@Bean
@ConditionalOnBean(name = "localRedisConfig")
public LettuceConnectionFactory localLettuceConnectionFactory(RedisStandaloneConfiguration localRedisConfig,
GenericObjectPoolConfig localPoolConfig) {
LettuceClientConfiguration clientConfig =
LettucePoolingClientConfiguration.builder().commandTimeout(Duration.ofMillis(100))
.poolConfig(localPoolConfig).build();
return new LettuceConnectionFactory(localRedisConfig, clientConfig);
}
@Bean
@ConditionalOnBean(name = "localLettuceConnectionFactory")
public RedisTemplate<String, String> localRedisTemplate(LettuceConnectionFactory localLettuceConnectionFactory) {
RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(localLettuceConnectionFactory);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
@Configuration
@ConditionalOnProperty(name = "host", prefix = "spring.local-redis")
public static class LocalRedisConfig {
@Value("${spring.local-redis.host:127.0.0.1}")
private String host;
@Value("${spring.local-redis.port:6379}")
private Integer port;
@Value("${spring.local-redis.password:}")
private String password;
@Value("${spring.local-redis.database:0}")
private Integer database;
@Value("${spring.local-redis.lettuce.pool.max-active:8}")
private Integer maxActive;
@Value("${spring.local-redis.lettuce.pool.max-idle:8}")
private Integer maxIdle;
@Value("${spring.local-redis.lettuce.pool.max-wait:-1}")
private Long maxWait;
@Value("${spring.local-redis.lettuce.pool.min-idle:0}")
private Integer minIdle;
@Bean
public GenericObjectPoolConfig localPoolConfig() {
GenericObjectPoolConfig config = new GenericObjectPoolConfig();
config.setMaxTotal(maxActive);
config.setMaxIdle(maxIdle);
config.setMinIdle(minIdle);
config.setMaxWaitMillis(maxWait);
return config;
}
@Bean
public RedisStandaloneConfiguration localRedisConfig() {
RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
config.setHostName(host);
config.setPassword(RedisPassword.of(password));
config.setPort(port);
config.setDatabase(database);
return config;
}
}
@Configuration
public static class DefaultRedisConfig {
@Value("${spring.redis.host:127.0.0.1}")
private String host;
@Value("${spring.redis.port:6379}")
private Integer port;
@Value("${spring.redis.password:}")
private String password;
@Value("${spring.redis.database:0}")
private Integer database;
@Value("${spring.redis.lettuce.pool.max-active:8}")
private Integer maxActive;
@Value("${spring.redis.lettuce.pool.max-idle:8}")
private Integer maxIdle;
@Value("${spring.redis.lettuce.pool.max-wait:-1}")
private Long maxWait;
@Value("${spring.redis.lettuce.pool.min-idle:0}")
private Integer minIdle;
@Bean
public GenericObjectPoolConfig defaultPoolConfig() {
GenericObjectPoolConfig config = new GenericObjectPoolConfig();
config.setMaxTotal(maxActive);
config.setMaxIdle(maxIdle);
config.setMinIdle(minIdle);
config.setMaxWaitMillis(maxWait);
return config;
}
@Bean
public RedisStandaloneConfiguration defaultRedisConfig() {
RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
config.setHostName(host);
config.setPassword(RedisPassword.of(password));
config.setPort(port);
config.setDatabase(database);
return config;
}
}
}
測試類如下,簡單的演示下兩個template的讀寫
@SpringBootApplication public class Application { public Application(RedisTemplate<String, String> localRedisTemplate, RedisTemplate<String, String> defaultRedisTemplate) throws InterruptedException { // 10s的有效時間 localRedisTemplate.delete("key"); localRedisTemplate.opsForValue().set("key", "value", 100, TimeUnit.MILLISECONDS); String ans = localRedisTemplate.opsForValue().get("key"); System.out.println("value".equals(ans)); TimeUnit.MILLISECONDS.sleep(200); ans = localRedisTemplate.opsForValue().get("key"); System.out.println("value".equals(ans) + " >> false ans should be null! ans=[" + ans + "]"); defaultRedisTemplate.opsForValue().set("key", "value", 100, TimeUnit.MILLISECONDS); ans = defaultRedisTemplate.opsForValue().get("key"); System.out.println(ans); } public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
上面表示說有多個ConnectionFactory存在,然後建立預設的RedisTemplate就不知道該選擇哪一個了,有兩種方法
方法一:指定預設的ConnectionFactory
藉助@Primary
來指定預設的連線工廠,然後在使用工程的時候,通過@Qualifier
註解來顯示指定,我需要的工廠是哪個(主要是localRedisTemplate
這個bean的定義,如果不加,則會根據defaultLettuceConnectionFactory
這個例項來建立Redis連線了)
@Bean @Primary public LettuceConnectionFactory defaultLettuceConnectionFactory(RedisStandaloneConfiguration defaultRedisConfig, GenericObjectPoolConfig defaultPoolConfig) { // ... } @Bean public RedisTemplate<String, String> defaultRedisTemplate( @Qualifier("defaultLettuceConnectionFactory") LettuceConnectionFactory defaultLettuceConnectionFactory) { // .... } @Bean @ConditionalOnBean(name = "localRedisConfig") public LettuceConnectionFactory localLettuceConnectionFactory(RedisStandaloneConfiguration localRedisConfig, GenericObjectPoolConfig localPoolConfig) { // ... } @Bean @ConditionalOnBean(name = "localLettuceConnectionFactory") public RedisTemplate<String, String> localRedisTemplate( @Qualifier("localLettuceConnectionFactory") LettuceConnectionFactory localLettuceConnectionFactory) { // ... }