在springboot的项目中,大多情况下,redis都是单数据源,这种情况我们使用springboot自动的redis依赖即可。但是在业务复杂的情况下,也有可能遇到使用多数据源的情况,大部分的项目中都是手写一个Java配置类,手动配置多个RedisTemplate,这种方案没有问题,但是代码不太优雅,下面介绍一种集成第三方依赖实现的优雅的redis多数据源方案。
多数据源
集成redis多数据源需要使用第三方依赖 fastdep-redis,目前最新是1.0.3版本,它可以集成Redis多数据源并集成lettuce连接池, 只需引入依赖后在yaml文件中配置多数据源连接信息即可。下面开始实战,这里使用springboot 2.1.5.RELEASE版本,首先看一下依赖:
上面的依赖都是常用的,多加的只有一个fastdep-redis,下面看一下配置文件:
配置文件中,只是配置了两个redis数据源,使用了新的lettuce连接池,两个数据源的名字分别是redis1,redis2,注意这两个名字很重要,后面的与redis相关的bean的名字在区分的时候,都是前面加上这两个名字就可以默认区分出来。
启动类中没有任何特殊内容,这样,我们的配置就完成了!可以看到非常非常的简单,下面来看一下测试代码:
通过注入的两个RedisTemplate的名字,就可以区分使用的是哪个数据源,我们来看接口执行的结果:
和预期的一样,分别在两个数据库中新增了两个string类型的redis数据。因为是演示多数据源,这里就不再演示其它redis数据类型操作的方法。
多数据源的发布订阅
多数据源下,还有一个复杂的业务,就是对多个数据源分别进行不同的发布订阅操作,有了上面的例子,发布操作应该没有什么问题了,主要是订阅,下面来演示一下不同数据源的订阅。先定义两个参数,代表两个channel:
先来看两个订阅的处理类:
消息收到后的处理其实和单数据源没什么区别,下面来看订阅的redis配置类:
上面的逻辑其实很简单,针对不同的数据源配置不同的订阅bean,然后在方法里add各自的channel即可,这里注意,RedisConnectionFactory也是根据名字前面加redis1或者redis2来区分是哪个数据源的。下面来看一下测试结果,首先在第一个数据库里发布两条消息:
结果是只有channel1的消息进行了处理:
向第二个数据库中也发布同样的两条:
结果只多了一条channel2的消息处理:
上面就是redis多数据源下发布订阅的操作。关于fastdep的网址如下,有兴趣可以看看:
代码地址: https://gitee.com/blueses/spring-boot-demo 分支2.1.5.RELEASE下