spring boot redis 多數據源配置 spring boot data redis


此文參考自  微笑點燃希望    spring boot redis多數據源

 原文好像是這個

 

我的代碼地址    github代碼示例   覺得有用的可以點個star

 

第一步添加依賴

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <!-- redis序列化使用 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.68</version>
        </dependency>

        <!-- letture連接池 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
            <version>2.8.0</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>



    </dependencies>

spring boot web必須跟redis依賴 再加上 redis驅動 lettuce 連接池  `commons-pool2`

 第二步 配置文件 配置多個數據源

spring:
  redis:
    hostName: reids地址
    port: 6379
    database: 0
    password: redis密碼
    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:
    hostName: reids地址
    port: 6379
    database: 1
    password: redis密碼

配置多個數據源原文微笑點燃希望中是host我沒成功  改成了hostName 源碼是這個

第三步 java讀取配置文件

package com.example.redis.config;


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.StringRedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;

/**
 * @author ccubee
 * @since 20-4-4 7:15
 */
@Configuration
public class SpringBootRedisConfig {


    @Bean
    @ConfigurationProperties(prefix = "spring.redis.lettuce.pool")
    public GenericObjectPoolConfig config(){
        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("stringRedisTemplate")
    @Primary
    public StringRedisTemplate redisTemplate(@Qualifier("factory") RedisConnectionFactory factory) {
        return getStringStringRedisTemplate(factory);
    }

    /**
     * 配置第一個數據源的RedisTemplate
     * 注意:這里指定使用名稱=factory2 的 RedisConnectionFactory
     *
     * @param factory2
     * @return
     */
    @Bean("stringRedisTemplate2")
    public StringRedisTemplate redisTemplate2(@Qualifier("factory2") RedisConnectionFactory factory2) {
        return getStringStringRedisTemplate(factory2);
    }

    /**
     * 設置序列化方式 (這一步不是必須的)
     *
     * @param factory2
     * @return
     */
    private StringRedisTemplate 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;
    }

}

 最后測試一下

package com.example.redis.rest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author ccubee
 * @since 20-4-2 22:15
 */
@RestController
public class RedisRest {

    @Autowired
    @Qualifier("stringRedisTemplate2")
    StringRedisTemplate stringRedisTemplate;

    @GetMapping("redis")
    public String redis(){
        stringRedisTemplate.opsForValue().set("key","123");
        return stringRedisTemplate.opsForValue().get("key");
    }
}

啟動后 調用輸入  可以安裝idea插件 restfultoolkit 進行測試

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM