Spring boot 如何快速的配置多个 Redis 数据源 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
louislivi
V2EX    Java

Spring boot 如何快速的配置多个 Redis 数据源

  •  1
     
  •   louislivi 2019-11-26 15:20:57 +08:00 4360 次点击
    这是一个创建于 2161 天前的主题,其中的信息可能已经有所发展或是发生改变。

    简介

    redis 多数据源主要的运用场景是在需要使用多个redis服务器或者使用多个redis库,本文采用的是fastdep依赖集成框架,快速集成Redis多数据源并集成lettuce连接池,只需引入依赖后在yal文件中配置多数据源连接信息即可。

    源码地址

    希望大家可以 star 支持一下,后续还会加入其它依赖的简易整合。 https://github.com/louislivi/fastdep

    引入依赖

    • Maven
    <dependency> <groupId>com.louislivi.fastdep</groupId> <artifactId>fastdep-redis</artifactId> <version>1.0.1</version> </dependency> 
    • Gradle
    compile group: 'com.louislivi.fastdep', name: 'fastdep-redis', version: '1.0.1' 

    配置文件

    fastdep: redis: redis1: #连接名称 database: 0 host: 192.168.12.88 port: 6379 lettuce: #下面为连接池的补充设置 shutdown-timeout: 100 # 关闭超时时间 pool: max-active: 18 # 连接池最大连接数(使用负值表示没有限制) max-idle: 8 # 连接池中的最大空闲连接 max-wait: 30 # 连接池最大阻塞等待时间(使用负值表示没有限制) min-idle: 0 # 连接池中的最小空闲连接 redis2: #连接名称 database: 1 host: 192.168.12.88 port: 6379 lettuce: #下面为连接池的补充设置 shutdown-timeout: 100 # 关闭超时时间 pool: max-active: 18 # 连接池最大连接数(使用负值表示没有限制) max-idle: 8 # 连接池中的最大空闲连接 max-wait: 30 # 连接池最大阻塞等待时间(使用负值表示没有限制) min-idle: 0 # 连接池中的最小空闲连接 

    运用

    @Autowired private StringRedisTemplate redis1StringRedisTemplate; // 注入时 redis1 代表配置文件中的连接名称 StringRedisTemplate 为固定注入 redis 对象类型, // 会自动根据注入的变量名进行匹配 @Autowired private StringRedisTemplate redis2StringRedisTemplate; @GetMapping("redis") public void redis() { System.out.println(redis1StringRedisTemplate.opsForValue().get("test")); System.out.println(redis2StringRedisTemplate.opsForValue().get("test")); } 

    扩展

    有时候需要自定义redisTemplate序列化和增加一些额外的配置,这时候我们可以封装一个redis工具类来实现

    package com.louislivi.fastdep.test.utils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.serializer.StringRedisSerializer; import org.springframework.stereotype.Component; /** * RedisUtil * * @author : louislivi */ @Component public class RedisUtil { @Autowired private StringRedisTemplate redis1StringRedisTemplate; @Autowired private StringRedisTemplate redis2StringRedisTemplate; @Autowired private RedisTemplate redis2RedisTemplate; @Autowired private RedisTemplate redis1RedisTemplate; public RedisTemplate redisTemplate(String name) { RedisTemplate redisTemplate; switch (name) { case "redis2": redisTemplate = redis2RedisTemplate; break; default: redisTemplate = redis1RedisTemplate; break; } StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); redisTemplate.setKeySerializer(stringRedisSerializer); redisTemplate.setValueSerializer(stringRedisSerializer); redisTemplate.setHashKeySerializer(stringRedisSerializer); redisTemplate.setHashValueSerializer(stringRedisSerializer); return redisTemplate; } public StringRedisTemplate stringRedisTemplate(String name) { StringRedisTemplate stringRedisTemplate; switch (name) { case "redis2": stringRedisTemplate = redis2StringRedisTemplate; break; default: stringRedisTemplate = redis1StringRedisTemplate; break; } stringRedisTemplate.setEnableTransactionSupport(true); return stringRedisTemplate; } } 
    @Autowired private RedisUtil redisUtil; @GetMapping("redis") public void redis() { System.out.println(redisUtil.redisTemplate("redis1").opsForValue().get("test")); System.out.println(redisUtil.stringRedisTemplate("redis2").opsForValue().get("test")); } 

    原理

    使用ImportBeanDefinitionRegistrar BeanDefinitionBuilder.genericBeanDefinition动态注入Bean其实很简单有兴趣可以去看看源码,这样的依赖集成是不是简单了很多呢?

    希望大家能够支持开源,给个小星星,后续还会继续开发其他依赖的整合,甚至兼容其他框架使用。fastdepjava整合依赖更简单。在此也招募有志同道合的coder共同完善这个项目。

    10 条回复    2019-11-27 16:53:10 +08:00
    wpblank
        1
    wpblank  
       2019-11-26 18:13:43 +08:00
    昨天刚刚自己配好...
    optional
        2
    optional  
       2019-11-26 18:23:53 +08:00 via iPhone   1
    根据变量名有点邪门歪道。 @Qualified
    mysunshinedreams
        3
    mysunshinedrams  
       2019-11-26 20:37:50 +08:00
    我自己写 Template+bean 不可以吗?反正是放在 config 包中的?自己写 bean 可操作性不是更强一些?
    louislivi
        4
    louislivi  
    OP
       2019-11-27 09:05:59 +08:00
    @optional 这样更方便好吗 ,spring 本来就可以根据名称匹配 bean
    louislivi
        5
    louislivi  
    OP
       2019-11-27 09:07:14 +08:00
    @mysunshinedreams 自己写每次加数据源都要加代码 ,这样更方便只需要配置文件就行了。
    louislivi
        6
    louislivi  
    OP
       2019-11-27 09:08:03 +08:00
    @optional 你要用 @Qualified 一样可以 ,我是觉得这样更方便
    cweijan
        7
    cweijan  
       2019-11-27 10:27:15 +08:00
    根据变量名还是算了吧, 不敢用
    optional
        8
    optional  
       2019-11-27 14:45:55 +08:00
    @louislivi 谁敢提交根据变量名 autowire 的,我肯定怼死他。
    louislivi
        9
    louislivi  
    OP
       2019-11-27 16:41:18 +08:00
    @cweijan
    @optional
    要用 @Qualified 一样可以
    ```
    @Autowired
    @Qualified("redis2RedisTemplate")
    private RedisTemplate redisTemplate;
    ```
    怎么用看自己,Autowired 是优先查找同类型,然后是名称 都是可以的。
    louislivi
        10
    louislivi  
    OP
       2019-11-27 16:53:10 +08:00
    spring AutowireMode 四种装配模型都是可以用的

    autowire_no(0),autowire_name,autowire_type,autowire_construcor

    autowire_name 同样也能解决多个同类型注入的问题
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2550 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 15:09 PVG 23:09 LAX 08:09 JFK 11:09
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86