• Redis实现SpringBoot集成Redis多数据源


    背景
    ​ 有些时候在一个项目里,由于业务问题,可能仅仅操作一个Redis数据源已经不能满足,比如某个运营系统,对接着多个不同的服务,处理数据时又不想通过远程调用,那只能增加一个数据源来解决问题,像MySQL的多数据源一样。

    yml配置示例
    这里连接池选用的是lettuce。

     1 redis:
     2 host: localhost
     3 port: 6379
     4 password: 123456
     5 timeout: 60000
     6 database: 10
     7 lettuce:
     8 pool:
     9 min-idle: 0
    10 max-idle: 10
    11 max-wait: -1
    12 max-active: 200
    13 time-between-eviction-runs: -1
    14 redis-live:
    15 host: localhost
    16 port: 6379
    17 password: 123456
    18 database: 0



    实现代码
    关于序列化使用的是jackson。

    以下提供了创建RedisTemplate以及StringRedisTemplate。

    关于二者的区别:

    两者的关系是StringRedisTemplate继承RedisTemplate。

    两者的数据是不共通的;也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。

    SDR默认采用的序列化策略有两种,一种是String的序列化策略,一种是JDK的序列化策略。

    StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。
    RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。

      1 /**
      2 * <p>
      3 * RedisLettuce 连接实例配置
      4 * </p>
      5 *
      6 * @author zhengshangjin
      7 * @version 1.0.0
      8 * @since 1.0.0
      9 * created on 2020-04-23
     10 */
     11 @Configuration
     12 @EnableCaching
     13 public class RedisLettuceConfig {
     14 
     15 /**
     16 * live数据源
     17 */
     18 @Value("${spring.redis-live.host}")
     19 private String redisLiveHost;
     20 
     21 @Value("${spring.redis-live.port}")
     22 private int redisLivePort;
     23 
     24 @Value("${spring.redis-live.password}")
     25 private String redisLivePass;
     26 
     27 @Value("${spring.redis-live.database}")
     28 private int redisLiveDb;
     29 
     30 /**
     31 * 公共配置
     32 */
     33 @Value("${spring.redis.timeout}")
     34 private long timeout;
     35 
     36 @Value("${spring.redis.lettuce.pool.min-idle}")
     37 private int minIdle;
     38 
     39 @Value("${spring.redis.lettuce.pool.max-idle}")
     40 private int maxIdle;
     41 
     42 @Value("${spring.redis.lettuce.pool.max-active}")
     43 private int maxActive;
     44 
     45 @Value("${spring.redis.lettuce.pool.max-wait}")
     46 private int maxWait;
     47 
     48 /**
     49 * 装配 RedisTemplate
     50 * <p>
     51 * 这里根据默认连接配置 装配实例
     52 * </>
     53 *
     54 * @param redisConnectionFactory 默认
     55 * @return redisTemplate
     56 * @author zhengshangjin
     57 * created on 2020-04-23
     58 */
     59 @Bean(name = "redisTemplate")
     60 public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
     61 return createRedisTemplate(redisConnectionFactory);
     62 }
     63 
     64 /**
     65 * 装配 StringRedisTemplate
     66 * <p>
     67 * 这里根据默认连接配置 装配实例
     68 * </>
     69 * @param redisConnectionFactory 默认
     70 * @return StringRedisTemplate
     71 * @author zhengshangjin
     72 * created on 2020-04-23
     73 */
     74 @Bean(name = "stringRedisTemplate")
     75 public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
     76 return createStringRedisTemplate(redisConnectionFactory);
     77 }
     78 
     79 /**
     80 * 装配 Live数据源
     81 *
     82 * @return liveStringRedisTemplate
     83 * @author zhengshangjin
     84 * created on 2020-04-23
     85 */
     86 @Bean(name = "liveStringRedisTemplate")
     87 public StringRedisTemplate liveStringRedisTemplate() {
     88 return createStringRedisTemplate(redisLiveHost, redisLivePort, redisLivePass, redisLiveDb);
     89 }
     90 
     91 /**
     92 * 创建 RedisTemplate
     93 *
     94 * @param redisConnectionFactory redisConnectionFactory
     95 * @return RedisTemplate
     96 * @author zhengshangjin
     97 * created on 2020-04-23
     98 */
     99 public RedisTemplate<Object, Object> createRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
    100 ObjectMapper objectMapper = new ObjectMapper();
    101 objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    102 objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
    103 
    104 Jackson2JsonRedisSerializer<?> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
    105 serializer.setObjectMapper(objectMapper);
    106 
    107 RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
    108 redisTemplate.setConnectionFactory(redisConnectionFactory);
    109 redisTemplate.setKeySerializer(new StringRedisSerializer());
    110 redisTemplate.setValueSerializer(serializer);
    111 redisTemplate.setHashKeySerializer(new StringRedisSerializer());
    112 redisTemplate.setHashValueSerializer(serializer);
    113 redisTemplate.afterPropertiesSet();
    114 return redisTemplate;
    115 }
    116 
    117 /**
    118 * 创建 StringRedisTemplate
    119 *
    120 * @param redisConnectionFactory redisConnectionFactory
    121 * @return StringRedisTemplate
    122 * @author zhengshangjin
    123 * created on 2020-04-23
    124 */
    125 public StringRedisTemplate createStringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
    126 StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
    127 stringRedisTemplate.setConnectionFactory(redisConnectionFactory);
    128 return stringRedisTemplate;
    129 }
    130 
    131 /**
    132 * 创建 StringRedisTemplate
    133 *
    134 * @param host 主机
    135 * @param port 端口
    136 * @param password 密码
    137 * @param database 库
    138 * @return StringRedisTemplate
    139 * @author zhengshangjin
    140 * created on 2020-04-23
    141 */
    142 public StringRedisTemplate createStringRedisTemplate(String host, int port, String password, int database) {
    143 // 基本配置
    144 RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration();
    145 configuration.setHostName(host);
    146 configuration.setPort(port);
    147 configuration.setDatabase(database);
    148 if (ObjectUtils.isNotEmpty(password)) {
    149 RedisPassword redisPassword = RedisPassword.of(password);
    150 configuration.setPassword(redisPassword);
    151 }
    152 
    153 // 连接池通用配置
    154 GenericObjectPoolConfig<?> genericObjectPoolConfig = new GenericObjectPoolConfig<>();
    155 genericObjectPoolConfig.setMaxTotal(maxActive);
    156 genericObjectPoolConfig.setMinIdle(minIdle);
    157 genericObjectPoolConfig.setMaxIdle(maxIdle);
    158 genericObjectPoolConfig.setMaxWaitMillis(maxWait);
    159 
    160 // Lettuce Pool
    161 LettucePoolingClientConfiguration.LettucePoolingClientConfigurationBuilder builder = LettucePoolingClientConfiguration.builder();
    162 builder.poolConfig(genericObjectPoolConfig);
    163 builder.commandTimeout(Duration.ofSeconds(timeout));
    164 LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(configuration, builder.build());
    165 connectionFactory.afterPropertiesSet();
    166 
    167 StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
    168 stringRedisTemplate.setConnectionFactory(connectionFactory);
    169 return stringRedisTemplate;
    170 }
    171 
    172 }


    注入使用
    根据@Qualifier指定beanname来获取

    @Autowired
    @Qualifier("liveStringRedisTemplate")
    public StringRedisTemplate stringRedisTemplate;
  • 相关阅读:
    条件概率融合
    径向函数,随机映射,SVM, 或者特征提取都是一类策略
    神经网络结构搜索
    NetCDF
    你应该看到更多
    Focal Loss for Dense Object Detection
    胶囊网络
    seq2seq模型
    编译lua解析器和lua动态库
    JavaScript Json数组的简单使用
  • 原文地址:https://www.cnblogs.com/grimm/p/15810734.html
Copyright © 2020-2023  润新知