1. 程式人生 > 其它 >Redis-實現SpringBoot整合Redis多資料來源

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;
學習時的痛苦是暫時的 未學到的痛苦是終生的