Redission是Redis客户端中比较优秀的一个。学好Redission的使用是必要的。现在的项目开发,主要使用SpringBoot框架。那么我们就介绍一下SpringBoot如何整合Redission。
1.整合方式
SpringBoot整合Redission需要关注一下SpringBoot的版本信息。作者使用的是SpringBoot2.6.2版本。于是我整合Redission的方式是:
<dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.16.7</version><exclusions><exclusion><groupId>org.redisson</groupId><artifactId>redisson-spring-data-25</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-data-26</artifactId><version>3.16.7</version></dependency>
这里作者剔除**redisson-spring-data-25**呢?
如果我使用SpringBoot2.6.x的话,最后匹配redission-spring-data-26
2.配置
这里我们只需像使用spring-boot-starter-redis那样配置一下redis位置就可以了。其他一些Bean配置都不需要我们做。Redission这个整合包中的RedissonAutoConfiguration已经帮我们配置好了。
@Configuration@ConditionalOnClass({Redisson.class, RedisOperations.class})@AutoConfigureBefore(RedisAutoConfiguration.class)@EnableConfigurationProperties({RedissonProperties.class, RedisProperties.class})public class RedissonAutoConfiguration {private static final String REDIS_PROTOCOL_PREFIX = "redis://";private static final String REDISS_PROTOCOL_PREFIX = "rediss://";@Autowired(required = false)private List<RedissonAutoConfigurationCustomizer> redissonAutoConfigurationCustomizers;@Autowiredprivate RedissonProperties redissonProperties;@Autowiredprivate RedisProperties redisProperties;@Autowiredprivate ApplicationContext ctx;/** redisTemplate注入就用*/@Bean@ConditionalOnMissingBean(name = "redisTemplate")public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<Object, Object> template = new RedisTemplate<Object, Object>();template.setConnectionFactory(redisConnectionFactory);return template;}/** stringRedisTemplate注入就用*/@Bean@ConditionalOnMissingBean(StringRedisTemplate.class)public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {StringRedisTemplate template = new StringRedisTemplate();template.setConnectionFactory(redisConnectionFactory);return template;}@Bean@ConditionalOnMissingBean(RedisConnectionFactory.class)public RedissonConnectionFactory redissonConnectionFactory(RedissonClient redisson) {return new RedissonConnectionFactory(redisson);}@Bean@Lazy@ConditionalOnMissingBean(RedissonReactiveClient.class)public RedissonReactiveClient redissonReactive(RedissonClient redisson) {return redisson.reactive();}@Bean@Lazy@ConditionalOnMissingBean(RedissonRxClient.class)public RedissonRxClient redissonRxJava(RedissonClient redisson) {return redisson.rxJava();}@Bean(destroyMethod = "shutdown")@ConditionalOnMissingBean(RedissonClient.class)public RedissonClient redisson() throws IOException {Config config = null;Method clusterMethod = ReflectionUtils.findMethod(RedisProperties.class, "getCluster");Method timeoutMethod = ReflectionUtils.findMethod(RedisProperties.class, "getTimeout");Object timeoutValue = ReflectionUtils.invokeMethod(timeoutMethod, redisProperties);int timeout;if(null == timeoutValue){timeout = 10000;}else if (!(timeoutValue instanceof Integer)) {Method millisMethod = ReflectionUtils.findMethod(timeoutValue.getClass(), "toMillis");timeout = ((Long) ReflectionUtils.invokeMethod(millisMethod, timeoutValue)).intValue();} else {timeout = (Integer)timeoutValue;}if (redissonProperties.getConfig() != null) {try {config = Config.fromYAML(redissonProperties.getConfig());} catch (IOException e) {try {config = Config.fromJSON(redissonProperties.getConfig());} catch (IOException e1) {throw new IllegalArgumentException("Can't parse config", e1);}}} else if (redissonProperties.getFile() != null) {try {InputStream is = getConfigStream();config = Config.fromYAML(is);} catch (IOException e) {// trying next formattry {InputStream is = getConfigStream();config = Config.fromJSON(is);} catch (IOException e1) {throw new IllegalArgumentException("Can't parse config", e1);}}} else if (redisProperties.getSentinel() != null) {Method nodesMethod = ReflectionUtils.findMethod(Sentinel.class, "getNodes");Object nodesValue = ReflectionUtils.invokeMethod(nodesMethod, redisProperties.getSentinel());String[] nodes;if (nodesValue instanceof String) {nodes = convert(Arrays.asList(((String)nodesValue).split(",")));} else {nodes = convert((List<String>)nodesValue);}config = new Config();config.useSentinelServers().setMasterName(redisProperties.getSentinel().getMaster()).addSentinelAddress(nodes).setDatabase(redisProperties.getDatabase()).setConnectTimeout(timeout).setPassword(redisProperties.getPassword());} else if (clusterMethod != null && ReflectionUtils.invokeMethod(clusterMethod, redisProperties) != null) {Object clusterObject = ReflectionUtils.invokeMethod(clusterMethod, redisProperties);Method nodesMethod = ReflectionUtils.findMethod(clusterObject.getClass(), "getNodes");List<String> nodesObject = (List) ReflectionUtils.invokeMethod(nodesMethod, clusterObject);String[] nodes = convert(nodesObject);config = new Config();config.useClusterServers().addNodeAddress(nodes).setConnectTimeout(timeout).setPassword(redisProperties.getPassword());} else {config = new Config();String prefix = REDIS_PROTOCOL_PREFIX;Method method = ReflectionUtils.findMethod(RedisProperties.class, "isSsl");if (method != null && (Boolean)ReflectionUtils.invokeMethod(method, redisProperties)) {prefix = REDISS_PROTOCOL_PREFIX;}config.useSingleServer().setAddress(prefix + redisProperties.getHost() + ":" + redisProperties.getPort()).setConnectTimeout(timeout).setDatabase(redisProperties.getDatabase()).setPassword(redisProperties.getPassword());}if (redissonAutoConfigurationCustomizers != null) {for (RedissonAutoConfigurationCustomizer customizer : redissonAutoConfigurationCustomizers) {customizer.customize(config);}}return Redisson.create(config);}private String[] convert(List<String> nodesObject) {List<String> nodes = new ArrayList<String>(nodesObject.size());for (String node : nodesObject) {if (!node.startsWith(REDIS_PROTOCOL_PREFIX) && !node.startsWith(REDISS_PROTOCOL_PREFIX)) {nodes.add(REDIS_PROTOCOL_PREFIX + node);} else {nodes.add(node);}}return nodes.toArray(new String[nodes.size()]);}private InputStream getConfigStream() throws IOException {Resource resource = ctx.getResource(redissonProperties.getFile());InputStream is = resource.getInputStream();return is;}}
jar包引入后,我们可以直接通过注入的方式使用一下类:
- RedissonClient
- RedissonRxClient
- RedissonReactiveClient
- RedisTemplate
- ReactiveRedisTemplate
- StringRedisTemplate(作者加,非官方提出)
3.参考资料
https://github.com/redisson/redisson/tree/master/redisson-spring-boot-starter#spring-boot-starter
https://github.com/redisson/redisson/tree/master/redisson-spring-data#spring-data-redis-integration
如果我使用SpringBoot2.6.x的话,最后匹配redission-spring-data-26