Redis多数据源

在项目开发中我们可能会使用到多个Redis数据源,在该项目中也做了多数据源的实现,并且每个数据源都可以动态的切换db进行操作。并且完全基于springboot自动配置流程开发,生产项目中使用无风险。

源码和使用案例https://gitee.com/mr_wenpan/basis-enhance

1、应用启动类上使用注解开启多数据源使用

@SpringBootApplication
@EnableConfigurationProperties
// 开启redis多数据源使用
@EnableRedisMultiDataSource
public class EnhanceDataRedisDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(EnhanceDataRedisDemoApplication.class, args);
    }

}

2、application.yml配置配置多数据源

spring:
  application:
    name: enhance-data-redis-demo
  redis:
    # 默认数据源
    host: ${SPRING_REDIS_HOST:default-host}
    port: ${SPRING_REDIS_PORT:6379}
    password: ${SPRING_REDIS_PASSWORD:WenPan@123}
    database: ${SPRING_REDIS_DATABASE:0}
    client-type: lettuce
    lettuce:
      pool:
        max-active: ${SPRING_REDIS_POOL_MAX_ACTIVE:16}
        max-idle: ${SPRING_REDIS_POOL_MAX_IDLE:16}
        max-wait: ${SPRING_REDIS_POOL_MAX_WAIT:5000}
    datasource:
      # 第一个数据源
      source1:
        host: ${SPRING_REDIS_HOST:wenpan-host}
        port: ${SPRING_REDIS_PORT:6379}
        password: ${SPRING_REDIS_PASSWORD:WenPan@123}
        database: ${SPRING_REDIS_DATABASE:1}
      # 第二个数据源
      source2:
        host: ${SPRING_REDIS_HOST:yuanping-host}
        port: ${SPRING_REDIS_PORT:6379}
        password: ${SPRING_REDIS_PASSWORD:WenPan@123}
        database: ${SPRING_REDIS_DATABASE:2}
        
stone:
  redis:
  	# 开启多数据源动态切换redis db
    dynamic-database: true

3、使用默认的数据源

操作默认数据源,直接注入RedisHelper即可。

使用方式一
@Slf4j
@RestController("TestEncryptController.v1")
@RequestMapping("/v1/test-enhance-redis")
public class TestEnhanceDataRedisController {

    /**
     * 注入默认数据源的redisTemplate
     */
    @Autowired
    private RedisTemplate<String, String> redisTemplate;
  
  	/**
     * 默认数据源对应的redisHelper
     */
    @Autowired
    @Qualifier("redisHelper")
    private RedisHelper redisHelper;
 
  	@GetMapping("/test-default")
    public void testDefaultRedisTemplate() {
        // 使用默认数据源的redisTemplate操作默认数据源
        redisTemplate.opsForValue().set("key", "value");
      	// 使用默认数据源的redisHelper操作默认数据源
        redisHelper.lstRightPop("key");
      
      	// 使用默认数据源的redisHelper动态切换db
        try {
            redisHelper.setCurrentDatabase(2);
            redisHelper.lstRightPop("key");
        } finally {
            redisHelper.clearCurrentDatabase();
        }
    }
  
}
使用方式二(更优雅的使用)
// 多数据源情况下,操作默认数据源并动态切换db测试
@GetMapping("/test-100")
public void test100() {
    // 使用多数据源客户端操作默认数据源的指定db
    
    // 操作默认的数据源的1号db
    multisourceClient.opsDbOne(DEFAULT_SOURCE).opsForValue().set(getRandomValue(), getRandomValue());
    // 操作默认的数据源的2号db
    multisourceClient.opsDbTwo(DEFAULT_SOURCE).opsForValue().set(getRandomValue(), getRandomValue());
    // 操作默认的数据源的3号db
    multisourceClient.opsDbThree(DEFAULT_SOURCE).opsForValue().set(getRandomValue(), getRandomValue());

    // 使用redisHelper操作默认数据源的指定db
    
    // 操作默认的数据源的1号db
    redisHelper.opsDbOne().opsForValue().get("key");
    // 操作默认的数据源的2号db
    redisHelper.opsDbTwo().opsForValue().get("key");

}

4、使用指定的数据源

使用方式一

①、指定数据源名称注入指定的数据源

@Slf4j
@RestController("TestEncryptController.v1")
@RequestMapping("/v1/test-enhance-redis")
public class TestEnhanceDataRedisController {

  	/**
     * 注入第一个数据源
     */
    @Autowired
    @Qualifier("source1RedisTemplate")
    private RedisTemplate<String, String> source1RedisTemplate;
  
  	/**
     * source1数据源对应的redisHelper
     */
    @Autowired
    @Qualifier("source1RedisHelper")
    private RedisHelper source1RedisHelper;
  
  	@GetMapping("/test-source1-template")
    public void testSource1RedisTemplate() {
        // 使用source1数据源的redisTemplate操作source1数据源
        source1RedisTemplate.opsForValue().set("key", "value");
      	// 使用source1数据源的redisHelper操作source1数据源(切换db操作)
         EasyRedisHelper.execute(2, () -> source1RedisHelper.lstLeftPush("key", "value"));
    }
}
使用方式二(更简单的使用)

以上使用方式一使用起来都较为复杂,不是特别友好(比如:我们需要手动的使用@Qualifier注解指定容器中bean的名称进行注入),这里提供一种更加友好的使用方式RedisMultisourceClient,在RedisMultisourceClient中提供了丰富的易用的对于多数据源和动态切换db的操作。

@Slf4j
@RestController("TestMultiDataSourceController.v1")
@RequestMapping("/v1/test-multi-source")
public class TestMultiDataSourceController {

    @Autowired
    private RedisMultisourceClient multisourceClient;
  
   	@Autowired
    private RedisHelper redisHelper;
  
  	/**
  	 * 操作指定的数据源的指定db
  	 */
    @GetMapping("/test-1")
    public void test01() {
        String key = "test-" + UUID.randomUUID().toString();
        String value = "value-" + UUID.randomUUID().toString();
        log.info("key = {}, value = {}", key, value);
      	// 写入source1数据源的1号库
        multisourceClient.opsDbOne("source1").opsForValue().set(key, value);
     	  // 写入source2数据源的1号库
      	multisourceClient.opsDbOne("source2").opsForValue().set(key, value);
      
      	// 写入source1数据源的2号库
        multisourceClient.opsDbOne("source1").opsForValue().set(key, value);
     	  // 写入source2数据源的2号库
      	multisourceClient.opsDbOne("source2").opsForValue().set(key, value);
    }
  
  	/**
     * 操作默认数据源的指定db
     */
    @GetMapping("/test-01")
    public void test01() {
        // 操作1号db
        redisHelper.opsDbOne().opsForValue().set(getRandomValue(), getRandomValue());
        // 操作2号db
        redisHelper.opsDbTwo().opsForValue().set(getRandomValue(), getRandomValue());
        // 操作3号db
        redisHelper.opsDbThree().opsForValue().set(getRandomValue(), getRandomValue());
        // 操作4号db
        redisHelper.opsDbFour().opsForValue().set(getRandomValue(), getRandomValue());
    }
  
  	/**
     * 使用多数据源客户端操作默认数据源并且动态切换db
     */
  	@GetMapping("/test-100")
    public void test100() {
        // 操作默认的数据源的1号db
        multisourceClient.opsDbOne(DEFAULT_SOURCE).opsForValue().set(getRandomValue(), getRandomValue());
        // 操作默认的数据源的2号db
        multisourceClient.opsDbTwo(DEFAULT_SOURCE).opsForValue().set(getRandomValue(), getRandomValue());
        // 操作默认的数据源的3号db
        multisourceClient.opsDbThree(DEFAULT_SOURCE).opsForValue().set(getRandomValue(), getRandomValue());
    }
}

Redis中配置多个数据源可以实现不同的数据库之间的数据隔离性。通过设置不同的database编号,可以将不同的数据存储在不同的数据库中。比如,在项目中配置了databases 0后,就只能获取到该数据库中的数据,无法获取其他数据库的数据。这就意味着,如果业务需要获取其他数据库的数据,就需要配置多个Redis数据源。 在Spring中,我们可以使用Spring JPA实现多数据源的配置。通过示例代码,我们可以详细了解多数据源工程配置的过程。例如,可以使用properties文件来配置多个Redis数据源。每个数据源都有独立的配置信息,包括host、port、password等。可以为每个数据源设置不同的database编号,以实现数据隔离。 在配置Redis多数据源时,还需要对RedisTemplate进行相应的配置,以便在代码中使用不同的数据源进行数据的读取和写入操作。根据具体的业务需求,我们可以根据需求配置多个RedisTemplate。 总结起来,配置Redis多数据源需要设置不同的database编号,并在配置文件中为每个数据源提供独立的配置信息。此外,还需要配置相应的RedisTemplate来实现对不同数据源的操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Redis配置多数据源](https://blog.csdn.net/weixin_42313773/article/details/123504831)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [Spring Jpa多数据源工程配置过程解析](https://download.csdn.net/download/weixin_38690275/12720963)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值