fix redis

This commit is contained in:
ran.shang
2025-12-29 17:19:31 +08:00
parent ee95dfa2c2
commit d8cecbe135
4 changed files with 178 additions and 168 deletions

25
pom.xml
View File

@@ -162,6 +162,12 @@
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
@@ -203,20 +209,27 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<!--<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.15.6</version>
</dependency>
</dependency>-->
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
</dependency>
<!-- <dependency> <groupId>org.redisson</groupId> <artifactId>redisson-spring-data-21</artifactId>
<version>3.11.0</version> </dependency> <dependency> <groupId>org.redisson</groupId>
<artifactId>redisson</artifactId> <version>3.11.0</version> </dependency> -->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-data-21</artifactId>
<version>3.11.0</version>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.11.0</version>
</dependency>
<dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.16</version>

View File

@@ -46,9 +46,5 @@ public class RedisConfig {
return redisTemplate;
}
@Bean
public RedissonUtils redissonUtils(RedissonClient redissonClient) {
return new RedissonUtils(redissonClient);
}
}

View File

@@ -1,158 +1,158 @@
//package com.newyetai.frame.redis.redisson;
//
//import com.newyetai.frame.redis.property.RedissonProperties;
//import java.lang.reflect.Method;
//import java.util.ArrayList;
//import java.util.Arrays;
//import java.util.List;
//
//import org.apache.commons.lang3.StringUtils;
//import org.redisson.Redisson;
//import org.redisson.api.RedissonClient;
//import org.redisson.config.Config;
package com.senmesh.frame.redis.redisson;
import com.senmesh.frame.redis.property.RedissonProperties;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.redisson.spring.data.connection.RedissonConnectionFactory;
//import org.redisson.spring.data.connection.RedissonConnectionFactory;
////import org.redisson.spring.data.connection.RedissonConnectionFactory;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.boot.autoconfigure.AutoConfigureAfter;
//import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
//import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
//import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
//import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
//import org.springframework.boot.autoconfigure.data.redis.RedisProperties.Sentinel;
//import org.springframework.boot.context.properties.EnableConfigurationProperties;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.context.annotation.Import;
//import org.springframework.data.redis.connection.RedisConnectionFactory;
//import org.springframework.data.redis.core.RedisOperations;
//import org.springframework.data.redis.core.RedisTemplate;
//import org.springframework.data.redis.core.StringRedisTemplate;
//import org.springframework.util.ReflectionUtils;
//
///**
// * 参考redisson-spring-boot-starter的RedissonAutoConfiguration,沿用redis配置,移除自定义配置文件解析配置
// *
// * @author sr on 2020-05-26
// */
//@Configuration
//@ConditionalOnClass({Redisson.class, RedisOperations.class})
//@AutoConfigureAfter({RedisAutoConfiguration.class})
//@EnableConfigurationProperties({RedisProperties.class, RedissonProperties.class})
//@Import({RedisAutoConfiguration.class})
//public class RedissonConfig {
//
// @Autowired
// private RedisProperties redisProperties;
//
// @Autowired
// private RedissonProperties redissonProperties;
//
// @Bean
// @ConditionalOnMissingBean(name = "redisTemplate")
// public RedisTemplate<Object, Object> redisTemplate(
// RedisConnectionFactory redisConnectionFactory) {
// RedisTemplate<Object, Object> template = new RedisTemplate<Object, Object>();
// template.setConnectionFactory(redisConnectionFactory);
// return template;
// }
//
// @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);
// }
//
// @SuppressWarnings("unchecked")
// @Bean(destroyMethod = "shutdown")
// @ConditionalOnMissingBean(RedissonClient.class)
// public RedissonClient redisson() {
// 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 = 0;
// } else if (!(timeoutValue instanceof Integer)) {
// Method millisMethod = ReflectionUtils.findMethod(timeoutValue.getClass(), "toMillis");
// timeout = ((Long) ReflectionUtils.invokeMethod(millisMethod, timeoutValue)).intValue();
// } else {
// timeout = (Integer) timeoutValue;
// }
//
// // 修复不设置密码,传入空字符串,置为空
// String password = redisProperties.getPassword();
// password = StringUtils.isBlank(password) ? null : password;
// 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()
// .setPingConnectionInterval(redissonProperties.getPingConnectionInterval())
// .setMasterName(redisProperties.getSentinel().getMaster())
// .addSentinelAddress(nodes).setDatabase(redisProperties.getDatabase())
// .setConnectTimeout(timeout).setPassword(password);
// } 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<String>) ReflectionUtils.invokeMethod(nodesMethod, clusterObject);
//
// String[] nodes = convert(nodesObject);
//
// config = new Config();
// config.useClusterServers()
// .setPingConnectionInterval(redissonProperties.getPingConnectionInterval())
// .addNodeAddress(nodes).setConnectTimeout(timeout)
// .setPassword(password);
// } else {
// config = new Config();
// String prefix = "redis://";
// Method method = ReflectionUtils.findMethod(RedisProperties.class, "isSsl");
// if (method != null && (Boolean) ReflectionUtils.invokeMethod(method, redisProperties)) {
// prefix = "rediss://";
// }
//
// config.useSingleServer()
// .setPingConnectionInterval(redissonProperties.getPingConnectionInterval())
// .setAddress(prefix + redisProperties.getHost() + ":" + redisProperties.getPort())
// .setConnectTimeout(timeout).setDatabase(redisProperties.getDatabase())
// .setPassword(password);
// }
// 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://") && !node.startsWith("rediss://")) {
// nodes.add("redis://" + node);
// } else {
// nodes.add(node);
// }
// }
// return nodes.toArray(new String[nodes.size()]);
// }
//
// @Bean
// public RedissonUtils redissonUtils() {
// return new RedissonUtils(redisson());
// }
//
//}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties.Sentinel;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.util.ReflectionUtils;
/**
* 参考redisson-spring-boot-starter的RedissonAutoConfiguration,沿用redis配置,移除自定义配置文件解析配置
*
* @author sr on 2020-05-26
*/
@Configuration
@ConditionalOnClass({Redisson.class, RedisOperations.class})
@AutoConfigureAfter({RedisAutoConfiguration.class})
@EnableConfigurationProperties({RedisProperties.class, RedissonProperties.class})
@Import({RedisAutoConfiguration.class})
public class RedissonConfig {
@Autowired
private RedisProperties redisProperties;
@Autowired
private RedissonProperties redissonProperties;
@Bean
@ConditionalOnMissingBean(name = "redisTemplate")
public RedisTemplate<Object, Object> redisTemplate(
RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> template = new RedisTemplate<Object, Object>();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
@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);
}
@SuppressWarnings("unchecked")
@Bean(destroyMethod = "shutdown")
@ConditionalOnMissingBean(RedissonClient.class)
public RedissonClient redisson() {
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 = 0;
} else if (!(timeoutValue instanceof Integer)) {
Method millisMethod = ReflectionUtils.findMethod(timeoutValue.getClass(), "toMillis");
timeout = ((Long) ReflectionUtils.invokeMethod(millisMethod, timeoutValue)).intValue();
} else {
timeout = (Integer) timeoutValue;
}
// 修复不设置密码,传入空字符串,置为空
String password = redisProperties.getPassword();
password = StringUtils.isBlank(password) ? null : password;
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()
.setPingConnectionInterval(redissonProperties.getPingConnectionInterval())
.setMasterName(redisProperties.getSentinel().getMaster())
.addSentinelAddress(nodes).setDatabase(redisProperties.getDatabase())
.setConnectTimeout(timeout).setPassword(password);
} 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<String>) ReflectionUtils.invokeMethod(nodesMethod, clusterObject);
String[] nodes = convert(nodesObject);
config = new Config();
config.useClusterServers()
.setPingConnectionInterval(redissonProperties.getPingConnectionInterval())
.addNodeAddress(nodes).setConnectTimeout(timeout)
.setPassword(password);
} else {
config = new Config();
String prefix = "redis://";
Method method = ReflectionUtils.findMethod(RedisProperties.class, "isSsl");
if (method != null && (Boolean) ReflectionUtils.invokeMethod(method, redisProperties)) {
prefix = "rediss://";
}
config.useSingleServer()
.setPingConnectionInterval(redissonProperties.getPingConnectionInterval())
.setAddress(prefix + redisProperties.getHost() + ":" + redisProperties.getPort())
.setConnectTimeout(timeout).setDatabase(redisProperties.getDatabase())
.setPassword(password);
}
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://") && !node.startsWith("rediss://")) {
nodes.add("redis://" + node);
} else {
nodes.add(node);
}
}
return nodes.toArray(new String[nodes.size()]);
}
@Bean
public RedissonUtils redissonUtils() {
return new RedissonUtils(redisson());
}
}

View File

@@ -2,4 +2,5 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.senmesh.common.CommonConfiguration,\
com.senmesh.codegenerator.config.CodeConfiguration,\
com.senmesh.frame.redis.config.RedisCacheConfig,\
com.senmesh.frame.redis.redisson.RedissonConfig,\
com.senmesh.mq.config.RabbitMqConfiguration