1. 程式人生 > 其它 >Springboot配置Redis多資料來源樣例

Springboot配置Redis多資料來源樣例

技術標籤: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