springboot系列學習筆記全部文章請移步值博主專欄**: spring boot 2.X/spring cloud Greenwich。
由於是一系列文章,所以后面的文章可能會使用到前面文章的項目。springboot系列代碼全部上傳至GitHub:https://github.com/liubenlong/springboot2_demo
本系列環境:Java11;springboot 2.1.1.RELEASE;springcloud Greenwich.RELEASE;MySQL 8.0.5;
文章目錄
多數據源配置
有時候會遇到在一個項目中訪問多個redis數據源的情況,這里就模擬一下springboot2.1+redis多數據源的配置
多數據源配置
這里采用不同的datebase模擬多數據源。
spring:
redis:
host: 127.0.0.1
port: 6379
database: 0
lettuce:
pool:
max-active: 200 #連接池最大連接數(使用負值表示沒有限制)
max-idle: 20 # 連接池中的最大空閑連接
min-idle: 5 #連接池中的最小空閑連接
# 這里在IDEA中顯示紅色錯誤,不用管,因為org.springframework.boot.autoconfigure.data.redis.RedisProperties.Pool.setMaxWait(Duration maxWait)
# 方法參數是Duration,IDEA無法識別,但是會自動注入成功
max-wait: 2000 # 當連接池耗盡時, 拋出異常之前,連接分配被阻塞的時間,也就是連接池滿后最長等待時間,負值表示無限期等待
redis2:
host: 127.0.0.1
port: 6379
database: 1
由於使用了多數據源,固不可以使用默認的springboot進行加載初始化了,這里需要使用自定義config來實現。
這里需要配置lettuce連接池–> LettuceConnectionFactory–>RedisTemplate
import com.alibaba.fastjson.support.spring.FastJsonRedisSerializer;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;
@Configuration
public class SpringbootConfig {
/**
* 配置lettuce連接池
*
* @return
*/
@Bean
@ConfigurationProperties(prefix = "spring.redis.lettuce.pool")
public GenericObjectPoolConfig redisPool() {
return new GenericObjectPoolConfig<>();
}
/**
* 配置第一個數據源的
*
* @return
*/
@Bean
@ConfigurationProperties(prefix = "spring.redis")
public RedisStandaloneConfiguration redisConfig() {
return new RedisStandaloneConfiguration();
}
/**
* 配置第二個數據源
*
* @return
*/
@Bean
@ConfigurationProperties(prefix = "spring.redis2")
public RedisStandaloneConfiguration redisConfig2() {
return new RedisStandaloneConfiguration();
}
/**
* 配置第一個數據源的連接工廠
* 這里注意:需要添加@Primary 指定bean的名稱,目的是為了創建兩個不同名稱的LettuceConnectionFactory
*
* @param config
* @param redisConfig
* @return
*/
@Bean("factory")
@Primary
public LettuceConnectionFactory factory(GenericObjectPoolConfig config, RedisStandaloneConfiguration redisConfig) {
LettuceClientConfiguration clientConfiguration = LettucePoolingClientConfiguration.builder().poolConfig(config).build();
return new LettuceConnectionFactory(redisConfig, clientConfiguration);
}
@Bean("factory2")
public LettuceConnectionFactory factory2(GenericObjectPoolConfig config, RedisStandaloneConfiguration redisConfig2) {
LettuceClientConfiguration clientConfiguration = LettucePoolingClientConfiguration.builder().poolConfig(config).build();
return new LettuceConnectionFactory(redisConfig2, clientConfiguration);
}
/**
* 配置第一個數據源的RedisTemplate
* 注意:這里指定使用名稱=factory 的 RedisConnectionFactory
* 並且標識第一個數據源是默認數據源 @Primary
*
* @param factory
* @return
*/
@Bean("redisTemplate")
@Primary
public RedisTemplate<String, String> redisTemplate(@Qualifier("factory") RedisConnectionFactory factory) {
return getStringStringRedisTemplate(factory);
}
/**
* 配置第一個數據源的RedisTemplate
* 注意:這里指定使用名稱=factory2 的 RedisConnectionFactory
*
* @param factory2
* @return
*/
@Bean("redisTemplate2")
public RedisTemplate<String, String> redisTemplate2(@Qualifier("factory2") RedisConnectionFactory factory2) {
return getStringStringRedisTemplate(factory2);
}
/**
* 設置序列化方式 (這一步不是必須的)
*
* @param factory2
* @return
*/
private RedisTemplate<String, String> getStringStringRedisTemplate(RedisConnectionFactory factory2) {
StringRedisTemplate template = new StringRedisTemplate(factory2);
template.setKeySerializer(RedisSerializer.string());
template.setValueSerializer(new FastJsonRedisSerializer<>(Object.class));
template.setHashKeySerializer(RedisSerializer.string());
template.setHashValueSerializer(new FastJsonRedisSerializer<>(Object.class));
return template;
}
}
使用也非常簡單:
/**
* 不寫默認使用帶有@Primary的RedisTemplate
*/
@Autowired
private RedisTemplate redisTemplate;
@Autowired
@Qualifier("redisTemplate2")
private RedisTemplate redisTemplate2;
原文:https://blog.csdn.net/liubenlong007/article/details/86477692