Springboot配置Redis多資料來源樣例
阿新 • • 發佈:2021-01-23
技術標籤:Springboot
有時候我們需要連線多個不同的redis來進行讀寫,下面是一個Springboot的多資料來源配置demo;配置比較簡單,我使用的Springboot的版本是:2.1.0.RELEASE,Springboot預設使用的連線池是:Lettuce
程式碼清單:
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
配置檔案:RedisConfig.java
@Configuration
public class RedisConfig {
@Bean(name = "redisTemplate")
@Primary
public RedisTemplate<String, Object> redisTemplate(@Value("${spring.redis.host}") String host,
@Value ("${spring.redis.port}") int port,
@Value("${spring.redis.password}") String password,
@Value("${spring.redis.database}") int database,
@Value("${spring.redis.timeout}") long timeout,
@Value("${spring.redis.lettuce.pool.max-active}") int maxActive,
@Value("${spring.redis.lettuce.pool.max-wait}") int maxWait,
@Value("${spring.redis.lettuce.pool.max-idle}") int maxIdle,
@Value("${spring.redis.lettuce.pool.min-idle}") int minIdle) {
LettuceConnectionFactory connectionFactory = this.lettuceConnectionFactory(host, port, password, database,
timeout, maxActive, maxWait, maxIdle, minIdle);
return this.createRedisTemplate(connectionFactory);
}
@Bean(name = "redisTemplate2")
public RedisTemplate<String, Object> redisTemplate2(@Value("${spring.redis.host2}") String host,
@Value("${spring.redis.port2}") int port,
@Value("${spring.redis.password2}") String password,
@Value("${spring.redis.database2}") int database,
@Value("${spring.redis.timeout2}") long timeout,
@Value("${spring.redis.lettuce.pool.max-active}") int maxActive,
@Value("${spring.redis.lettuce.pool.max-wait}") int maxWait,
@Value("${spring.redis.lettuce.pool.max-idle}") int maxIdle,
@Value("${spring.redis.lettuce.pool.min-idle}") int minIdle) {
LettuceConnectionFactory connectionFactory = this.lettuceConnectionFactory(host, port, password, database,
timeout, maxActive, maxWait, maxIdle, minIdle);
return this.createRedisTemplate(connectionFactory);
}
/**
* 建立RedisTemplate並設定序列號
*
* @param redisConnectionFactory redis連線池
*/
private RedisTemplate<String, Object> createRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
//序列號
redisTemplate.setValueSerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new StringRedisSerializer());
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
/**
* lettuce 連線池工廠
*
* @param host 地址
* @param port 埠
* @param password 密碼
* @param database 資料庫
* @param timeout 連線超時時間(毫秒)
* @param maxActive 連線池最大連線數(使用負值表示沒有限制) 預設 8
* @param maxWait 連線池最大阻塞等待時間(使用負值表示沒有限制),當連線池資源耗盡時,呼叫者最大阻塞的時間,超時將跑出異常。單位,毫秒數;預設為-1.表示永不超時.
* @param maxIdle 連線池中的最大空閒的連線數,預設為8
* @param minIdle 連線池中的最少空閒的連線數,預設為0
*/
public LettuceConnectionFactory lettuceConnectionFactory(String host, int port, String password, int database,
long timeout, int maxActive, int maxWait, int maxIdle,
int minIdle) {
//基礎設定
RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration();
configuration.setHostName(host);
configuration.setDatabase(database);
if (!ObjectUtils.isEmpty(password)) {
configuration.setPassword(password);
}
configuration.setPort(port);
//執行緒池設定
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
poolConfig.setMaxIdle(maxIdle);
poolConfig.setMaxTotal(maxActive);
poolConfig.setMinIdle(minIdle);
poolConfig.setMaxWaitMillis(maxWait);
LettuceClientConfiguration clientConfiguration = LettucePoolingClientConfiguration.builder().
commandTimeout(Duration.ofSeconds(timeout)).
poolConfig(poolConfig).build();
LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(configuration, clientConfiguration);
lettuceConnectionFactory.setShareNativeConnection(true);
lettuceConnectionFactory.afterPropertiesSet();
return lettuceConnectionFactory;
}
}
配置檔案:
#redis1配置
#地址
spring.redis.host=localhost
#埠
spring.redis.port=6379
#密碼
spring.redis.password=
#資料庫
spring.redis.database=1
#連線超時時間(毫秒)
spring.redis.timeout=3000
#連線池最大連線數(使用負值表示沒有限制) 預設 8
spring.redis.lettuce.pool.max-active=500
#連線池最大阻塞等待時間(使用負值表示沒有限制),當連線池資源耗盡時,呼叫者最大阻塞的時間,超時將跑出異常。單位,毫秒數;預設為-1.表示永不超時.
spring.redis.lettuce.pool.max-wait=3000
#連線池中的最大空閒的連線數,預設為8
spring.redis.lettuce.pool.max-idle=500
#連線池中的最少空閒的連線數,預設為0
spring.redis.lettuce.pool.min-idle=20
#redis2配置
#地址
spring.redis.host2=localhost
#埠
spring.redis.port2=6379
#密碼
spring.redis.password2=
#資料庫
spring.redis.database2=2
#連線超時時間(毫秒)
spring.redis.timeout2=3000
測試配置的多資料來源redis:
@Service
public class TestRedis {
@Resource(name = "redisTemplate")
private RedisTemplate redisTemplate;
@Resource(name = "redisTemplate2")
private RedisTemplate redisTemplate2;
@PostConstruct
public void test(){
redisTemplate.opsForValue().set("redis1","hello redis1");
Object redis1 = redisTemplate.opsForValue().get("redis1");
System.out.println(redis1);
redisTemplate2.opsForValue().set("redis2","hello redis2");
Object redis2 = redisTemplate2.opsForValue().get("redis2");
System.out.println(redis2);
}
}
輸出:
Github程式碼示例:https://github.com/qinming99/tugos-demo