redis配置挪移位置,修复文件上传等bug
This commit is contained in:
+10
-1
@@ -111,7 +111,16 @@ public class Result<T> implements Serializable {
|
|||||||
r.setResult(data);
|
r.setResult(data);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static<T> Result<T> error(String msg, T data) {
|
||||||
|
Result<T> r = new Result<T>();
|
||||||
|
r.setSuccess(false);
|
||||||
|
r.setCode(CommonConstant.SC_INTERNAL_SERVER_ERROR_500);
|
||||||
|
r.setMessage(msg);
|
||||||
|
r.setResult(data);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
public static Result<Object> error(String msg) {
|
public static Result<Object> error(String msg) {
|
||||||
return error(CommonConstant.SC_INTERNAL_SERVER_ERROR_500, msg);
|
return error(CommonConstant.SC_INTERNAL_SERVER_ERROR_500, msg);
|
||||||
}
|
}
|
||||||
|
|||||||
+30
-6
@@ -17,6 +17,7 @@ import com.jero.common.constant.CommonConstant;
|
|||||||
import com.jero.modules.base.service.BaseCommonService;
|
import com.jero.modules.base.service.BaseCommonService;
|
||||||
import com.jero.common.util.oConvertUtils;
|
import com.jero.common.util.oConvertUtils;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.data.redis.core.RedisTemplate;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.springframework.util.StringUtils;
|
import org.springframework.util.StringUtils;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
@@ -38,6 +39,8 @@ public class DictAspect {
|
|||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private CommonAPI commonAPI;
|
private CommonAPI commonAPI;
|
||||||
|
@Autowired
|
||||||
|
public RedisTemplate redisTemplate;
|
||||||
|
|
||||||
// 定义切点Pointcut
|
// 定义切点Pointcut
|
||||||
@Pointcut("execution(public * com.jero.modules..*.*Controller.*(..))")
|
@Pointcut("execution(public * com.jero.modules..*.*Controller.*(..))")
|
||||||
@@ -133,9 +136,9 @@ public class DictAspect {
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
private String translateDictValue(String code, String text, String table, String key) {
|
private String translateDictValue(String code, String text, String table, String key) {
|
||||||
if(oConvertUtils.isEmpty(key)) {
|
if(oConvertUtils.isEmpty(key)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
StringBuffer textValue=new StringBuffer();
|
StringBuffer textValue=new StringBuffer();
|
||||||
String[] keys = key.split(",");
|
String[] keys = key.split(",");
|
||||||
for (String k : keys) {
|
for (String k : keys) {
|
||||||
@@ -144,12 +147,33 @@ public class DictAspect {
|
|||||||
if (k.trim().length() == 0) {
|
if (k.trim().length() == 0) {
|
||||||
continue; //跳过循环
|
continue; //跳过循环
|
||||||
}
|
}
|
||||||
|
//update-begin--Author:scott -- Date:20210531 ----for: !56 优化微服务应用下存在表字段需要字典翻译时加载缓慢问题-----
|
||||||
if (!StringUtils.isEmpty(table)){
|
if (!StringUtils.isEmpty(table)){
|
||||||
log.debug("--DictAspect------dicTable="+ table+" ,dicText= "+text+" ,dicCode="+code);
|
log.info("--DictAspect------dicTable="+ table+" ,dicText= "+text+" ,dicCode="+code);
|
||||||
tmpValue= commonAPI.translateDictFromTable(table,text,code,k.trim());
|
String keyString = String.format("sys:cache:dictTable::SimpleKey [%s,%s,%s,%s]",table,text,code,k.trim());
|
||||||
|
if (redisTemplate.hasKey(keyString)){
|
||||||
|
try {
|
||||||
|
tmpValue = oConvertUtils.getString(redisTemplate.opsForValue().get(keyString));
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.warn(e.getMessage());
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
tmpValue= commonAPI.translateDictFromTable(table,text,code,k.trim());
|
||||||
|
}
|
||||||
}else {
|
}else {
|
||||||
tmpValue = commonAPI.translateDict(code, k.trim());
|
String keyString = String.format("sys:cache:dict::%s:%s",code,k.trim());
|
||||||
|
if (redisTemplate.hasKey(keyString)){
|
||||||
|
try {
|
||||||
|
tmpValue = oConvertUtils.getString(redisTemplate.opsForValue().get(keyString));
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.warn(e.getMessage());
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
tmpValue = commonAPI.translateDict(code, k.trim());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
//update-end--Author:scott -- Date:20210531 ----for: !56 优化微服务应用下存在表字段需要字典翻译时加载缓慢问题-----
|
||||||
|
|
||||||
if (tmpValue != null) {
|
if (tmpValue != null) {
|
||||||
if (!"".equals(textValue.toString())) {
|
if (!"".equals(textValue.toString())) {
|
||||||
textValue.append(",");
|
textValue.append(",");
|
||||||
|
|||||||
+14
-3
@@ -221,20 +221,31 @@ public class QueryGenerator {
|
|||||||
if(parameterMap!=null&& parameterMap.containsKey(ORDER_TYPE)) {
|
if(parameterMap!=null&& parameterMap.containsKey(ORDER_TYPE)) {
|
||||||
order = parameterMap.get(ORDER_TYPE)[0];
|
order = parameterMap.get(ORDER_TYPE)[0];
|
||||||
}
|
}
|
||||||
log.debug("排序规则>>列:"+column+",排序方式:"+order);
|
log.info("排序规则>>列:" + column + ",排序方式:" + order);
|
||||||
if (oConvertUtils.isNotEmpty(column) && oConvertUtils.isNotEmpty(order)) {
|
if (oConvertUtils.isNotEmpty(column) && oConvertUtils.isNotEmpty(order)) {
|
||||||
//字典字段,去掉字典翻译文本后缀
|
//字典字段,去掉字典翻译文本后缀
|
||||||
if(column.endsWith(CommonConstant.DICT_TEXT_SUFFIX)) {
|
if(column.endsWith(CommonConstant.DICT_TEXT_SUFFIX)) {
|
||||||
column = column.substring(0, column.lastIndexOf(CommonConstant.DICT_TEXT_SUFFIX));
|
column = column.substring(0, column.lastIndexOf(CommonConstant.DICT_TEXT_SUFFIX));
|
||||||
}
|
}
|
||||||
//SQL注入check
|
//SQL注入check
|
||||||
SqlInjectionUtil.filterContent(column);
|
SqlInjectionUtil.filterContent(column);
|
||||||
|
|
||||||
|
//update-begin--Author:scott Date:20210531 for:36 多条件排序无效问题修正-------
|
||||||
|
// 排序规则修改
|
||||||
|
// 将现有排序 _ 前端传递排序条件{....,column: 'column1,column2',order: 'desc'} 翻译成sql "column1,column2 desc"
|
||||||
|
// 修改为 _ 前端传递排序条件{....,column: 'column1,column2',order: 'desc'} 翻译成sql "column1 desc,column2 desc"
|
||||||
if (order.toUpperCase().indexOf(ORDER_TYPE_ASC)>=0) {
|
if (order.toUpperCase().indexOf(ORDER_TYPE_ASC)>=0) {
|
||||||
queryWrapper.orderByAsc(oConvertUtils.camelToUnderline(column));
|
queryWrapper.orderByAsc(oConvertUtils.camelToUnderline(column));
|
||||||
|
String columnStr = oConvertUtils.camelToUnderline(column);
|
||||||
|
String[] columnArray = columnStr.split(",");
|
||||||
|
queryWrapper.orderByAsc(columnArray);
|
||||||
} else {
|
} else {
|
||||||
queryWrapper.orderByDesc(oConvertUtils.camelToUnderline(column));
|
queryWrapper.orderByDesc(oConvertUtils.camelToUnderline(column));
|
||||||
|
String columnStr = oConvertUtils.camelToUnderline(column);
|
||||||
|
String[] columnArray = columnStr.split(",");
|
||||||
|
queryWrapper.orderByDesc(columnArray);
|
||||||
}
|
}
|
||||||
|
//update-end--Author:scott Date:20210531 for:36 多条件排序无效问题修正-------
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
-3
@@ -79,7 +79,8 @@ public class CommonUtils {
|
|||||||
fileName = fileName.substring(pos + 1);
|
fileName = fileName.substring(pos + 1);
|
||||||
}
|
}
|
||||||
//替换上传文件名字的特殊字符
|
//替换上传文件名字的特殊字符
|
||||||
fileName = fileName.replace("=","").replace(",","").replace("&","").replace("#", "");
|
fileName = fileName.replace("=","").replace(",","").replace("&","")
|
||||||
|
.replace("#", "").replace("“", "").replace("”", "");
|
||||||
//替换上传文件名字中的空格
|
//替换上传文件名字中的空格
|
||||||
fileName=fileName.replaceAll("\\s","");
|
fileName=fileName.replaceAll("\\s","");
|
||||||
return fileName;
|
return fileName;
|
||||||
@@ -142,7 +143,7 @@ public class CommonUtils {
|
|||||||
String orgName = mf.getOriginalFilename();// 获取文件名
|
String orgName = mf.getOriginalFilename();// 获取文件名
|
||||||
orgName = CommonUtils.getFileName(orgName);
|
orgName = CommonUtils.getFileName(orgName);
|
||||||
if(orgName.indexOf(".")!=-1){
|
if(orgName.indexOf(".")!=-1){
|
||||||
fileName = orgName.substring(0, orgName.lastIndexOf(".")) + "_" + System.currentTimeMillis() + orgName.substring(orgName.indexOf("."));
|
fileName = orgName.substring(0, orgName.lastIndexOf(".")) + "_" + System.currentTimeMillis() + orgName.substring(orgName.lastIndexOf("."));
|
||||||
}else{
|
}else{
|
||||||
fileName = orgName+ "_" + System.currentTimeMillis();
|
fileName = orgName+ "_" + System.currentTimeMillis();
|
||||||
}
|
}
|
||||||
@@ -175,7 +176,7 @@ public class CommonUtils {
|
|||||||
return getDatabaseTypeByDataSource(dataSource);
|
return getDatabaseTypeByDataSource(dataSource);
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
//e.printStackTrace();
|
//e.printStackTrace();
|
||||||
log.warn(e.getMessage());
|
log.warn(e.getMessage(), e);
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-2
@@ -76,8 +76,11 @@ public class MinioUtil {
|
|||||||
orgName=file.getName();
|
orgName=file.getName();
|
||||||
}
|
}
|
||||||
orgName = CommonUtils.getFileName(orgName);
|
orgName = CommonUtils.getFileName(orgName);
|
||||||
String objectName = bizPath+"/"+orgName.substring(0, orgName.lastIndexOf(".")) + "_" + System.currentTimeMillis() + orgName.substring(orgName.lastIndexOf("."));
|
String objectName = bizPath+"/"
|
||||||
|
+( orgName.indexOf(".")==-1
|
||||||
|
?orgName + "_" + System.currentTimeMillis()
|
||||||
|
:orgName.substring(0, orgName.lastIndexOf(".")) + "_" + System.currentTimeMillis() + orgName.substring(orgName.lastIndexOf("."))
|
||||||
|
);
|
||||||
// 使用putObject上传一个本地文件到存储桶中。
|
// 使用putObject上传一个本地文件到存储桶中。
|
||||||
if(objectName.startsWith("/")){
|
if(objectName.startsWith("/")){
|
||||||
objectName = objectName.substring(1);
|
objectName = objectName.substring(1);
|
||||||
|
|||||||
+3
-1
@@ -111,7 +111,9 @@ public class OssBootUtil {
|
|||||||
orgName=file.getName();
|
orgName=file.getName();
|
||||||
}
|
}
|
||||||
orgName = CommonUtils.getFileName(orgName);
|
orgName = CommonUtils.getFileName(orgName);
|
||||||
String fileName = orgName.substring(0, orgName.lastIndexOf(".")) + "_" + System.currentTimeMillis() + orgName.substring(orgName.lastIndexOf("."));
|
String fileName = orgName.indexOf(".")==-1
|
||||||
|
?orgName + "_" + System.currentTimeMillis()
|
||||||
|
:orgName.substring(0, orgName.lastIndexOf(".")) + "_" + System.currentTimeMillis() + orgName.substring(orgName.lastIndexOf("."));
|
||||||
if (!fileDir.endsWith("/")) {
|
if (!fileDir.endsWith("/")) {
|
||||||
fileDir = fileDir.concat("/");
|
fileDir = fileDir.concat("/");
|
||||||
}
|
}
|
||||||
|
|||||||
+13
-4
@@ -1,6 +1,7 @@
|
|||||||
package com.jero.config.shiro;
|
package com.jero.config.shiro;
|
||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
|
||||||
import org.apache.shiro.mgt.DefaultSessionStorageEvaluator;
|
import org.apache.shiro.mgt.DefaultSessionStorageEvaluator;
|
||||||
import org.apache.shiro.mgt.DefaultSubjectDAO;
|
import org.apache.shiro.mgt.DefaultSubjectDAO;
|
||||||
import org.apache.shiro.mgt.SecurityManager;
|
import org.apache.shiro.mgt.SecurityManager;
|
||||||
@@ -128,7 +129,6 @@ public class ShiroConfig {
|
|||||||
filterChainDefinitionMap.put("/websocket/**", "anon");//系统通知和公告
|
filterChainDefinitionMap.put("/websocket/**", "anon");//系统通知和公告
|
||||||
filterChainDefinitionMap.put("/newsWebsocket/**", "anon");//CMS模块
|
filterChainDefinitionMap.put("/newsWebsocket/**", "anon");//CMS模块
|
||||||
filterChainDefinitionMap.put("/vxeSocket/**", "anon");//JVxeTable无痕刷新示例
|
filterChainDefinitionMap.put("/vxeSocket/**", "anon");//JVxeTable无痕刷新示例
|
||||||
filterChainDefinitionMap.put("/eoaSocket/**","anon");//我的聊天
|
|
||||||
|
|
||||||
//性能监控 TODO 存在安全漏洞泄露TOEKN(durid连接池也有)
|
//性能监控 TODO 存在安全漏洞泄露TOEKN(durid连接池也有)
|
||||||
filterChainDefinitionMap.put("/actuator/**", "anon");
|
filterChainDefinitionMap.put("/actuator/**", "anon");
|
||||||
@@ -238,12 +238,21 @@ public class ShiroConfig {
|
|||||||
}
|
}
|
||||||
manager = redisManager;
|
manager = redisManager;
|
||||||
}else{
|
}else{
|
||||||
// redis 集群支持,优先使用集群配置
|
// redis集群支持,优先使用集群配置
|
||||||
RedisClusterManager redisManager = new RedisClusterManager();
|
RedisClusterManager redisManager = new RedisClusterManager();
|
||||||
Set<HostAndPort> portSet = new HashSet<>();
|
Set<HostAndPort> portSet = new HashSet<>();
|
||||||
lettuceConnectionFactory.getClusterConfiguration().getClusterNodes().forEach(node -> portSet.add(new HostAndPort(node.getHost() , node.getPort())));
|
lettuceConnectionFactory.getClusterConfiguration().getClusterNodes().forEach(node -> portSet.add(new HostAndPort(node.getHost() , node.getPort())));
|
||||||
JedisCluster jedisCluster = new JedisCluster(portSet);
|
//update-begin--Author:scott Date:20210531 for:修改集群模式下未设置redis密码的bug issues/I3QNIC
|
||||||
redisManager.setJedisCluster(jedisCluster);
|
if (oConvertUtils.isNotEmpty(lettuceConnectionFactory.getPassword())) {
|
||||||
|
JedisCluster jedisCluster = new JedisCluster(portSet, 2000, 2000, 5,
|
||||||
|
lettuceConnectionFactory.getPassword(), new GenericObjectPoolConfig());
|
||||||
|
redisManager.setPassword(lettuceConnectionFactory.getPassword());
|
||||||
|
redisManager.setJedisCluster(jedisCluster);
|
||||||
|
} else {
|
||||||
|
JedisCluster jedisCluster = new JedisCluster(portSet);
|
||||||
|
redisManager.setJedisCluster(jedisCluster);
|
||||||
|
}
|
||||||
|
//update-end--Author:scott Date:20210531 for:修改集群模式下未设置redis密码的bug issues/I3QNIC
|
||||||
manager = redisManager;
|
manager = redisManager;
|
||||||
}
|
}
|
||||||
return manager;
|
return manager;
|
||||||
|
|||||||
+1
-13
@@ -6,7 +6,6 @@ import org.springframework.context.annotation.Configuration;
|
|||||||
import org.springframework.data.redis.core.RedisTemplate;
|
import org.springframework.data.redis.core.RedisTemplate;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* redis客户端
|
* redis客户端
|
||||||
@@ -14,7 +13,7 @@ import java.util.Map;
|
|||||||
@Configuration
|
@Configuration
|
||||||
public class JeroRedisClient {
|
public class JeroRedisClient {
|
||||||
|
|
||||||
@Resource(name = "starterRedisTemplate")
|
@Resource
|
||||||
private RedisTemplate<String, Object> redisTemplate;
|
private RedisTemplate<String, Object> redisTemplate;
|
||||||
|
|
||||||
|
|
||||||
@@ -30,15 +29,4 @@ public class JeroRedisClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 根据key查询缓存
|
|
||||||
*
|
|
||||||
* @param key 键
|
|
||||||
* @return 值
|
|
||||||
*/
|
|
||||||
public <T> T get(String key) {
|
|
||||||
return key == null ? null : (T) redisTemplate.opsForValue().get(key);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+69
-20
@@ -1,4 +1,4 @@
|
|||||||
package com.jero.config.redis;
|
package com.jero.common.modules.redis.config;
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
|
import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
|
||||||
import com.fasterxml.jackson.annotation.PropertyAccessor;
|
import com.fasterxml.jackson.annotation.PropertyAccessor;
|
||||||
@@ -6,6 +6,9 @@ import com.fasterxml.jackson.databind.ObjectMapper;
|
|||||||
import com.fasterxml.jackson.databind.ObjectMapper.DefaultTyping;
|
import com.fasterxml.jackson.databind.ObjectMapper.DefaultTyping;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import com.jero.common.constant.CacheConstant;
|
import com.jero.common.constant.CacheConstant;
|
||||||
|
import com.jero.common.constant.GlobalConstants;
|
||||||
|
import com.jero.common.modules.redis.receiver.RedisReceiver;
|
||||||
|
import com.jero.common.modules.redis.writer.JeroRedisCacheWriter;
|
||||||
import org.springframework.cache.CacheManager;
|
import org.springframework.cache.CacheManager;
|
||||||
import org.springframework.cache.annotation.CachingConfigurerSupport;
|
import org.springframework.cache.annotation.CachingConfigurerSupport;
|
||||||
import org.springframework.cache.annotation.EnableCaching;
|
import org.springframework.cache.annotation.EnableCaching;
|
||||||
@@ -14,9 +17,16 @@ import org.springframework.context.annotation.Configuration;
|
|||||||
import org.springframework.data.redis.cache.RedisCacheConfiguration;
|
import org.springframework.data.redis.cache.RedisCacheConfiguration;
|
||||||
import org.springframework.data.redis.cache.RedisCacheManager;
|
import org.springframework.data.redis.cache.RedisCacheManager;
|
||||||
import org.springframework.data.redis.cache.RedisCacheWriter;
|
import org.springframework.data.redis.cache.RedisCacheWriter;
|
||||||
|
import org.springframework.data.redis.connection.RedisConnectionFactory;
|
||||||
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
|
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
|
||||||
import org.springframework.data.redis.core.RedisTemplate;
|
import org.springframework.data.redis.core.RedisTemplate;
|
||||||
import org.springframework.data.redis.serializer.*;
|
import org.springframework.data.redis.listener.ChannelTopic;
|
||||||
|
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
|
||||||
|
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
|
||||||
|
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
|
||||||
|
import org.springframework.data.redis.serializer.RedisSerializationContext;
|
||||||
|
import org.springframework.data.redis.serializer.RedisSerializer;
|
||||||
|
import org.springframework.data.redis.serializer.StringRedisSerializer;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
@@ -25,7 +35,8 @@ import static java.util.Collections.singletonMap;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 开启缓存支持
|
* 开启缓存支持
|
||||||
* @Return:
|
* @author zyf
|
||||||
|
* @Return:
|
||||||
*/
|
*/
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@EnableCaching
|
@EnableCaching
|
||||||
@@ -57,27 +68,25 @@ public class RedisConfig extends CachingConfigurerSupport {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* RedisTemplate配置
|
* RedisTemplate配置
|
||||||
*
|
|
||||||
* @param lettuceConnectionFactory
|
* @param lettuceConnectionFactory
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@Bean
|
@Bean
|
||||||
public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
|
public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
|
||||||
log.info(" --- redis config init --- ");
|
log.info(" --- redis config init --- ");
|
||||||
// 设置序列化
|
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = jacksonSerializer();
|
||||||
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
|
|
||||||
ObjectMapper om = new ObjectMapper();
|
|
||||||
om.setVisibility(PropertyAccessor.ALL, Visibility.ANY);
|
|
||||||
om.enableDefaultTyping(DefaultTyping.NON_FINAL);
|
|
||||||
jackson2JsonRedisSerializer.setObjectMapper(om);
|
|
||||||
// 配置redisTemplate
|
|
||||||
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
|
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
|
||||||
redisTemplate.setConnectionFactory(lettuceConnectionFactory);
|
redisTemplate.setConnectionFactory(lettuceConnectionFactory);
|
||||||
RedisSerializer<?> stringSerializer = new StringRedisSerializer();
|
RedisSerializer<String> stringSerializer = new StringRedisSerializer();
|
||||||
redisTemplate.setKeySerializer(stringSerializer);// key序列化
|
|
||||||
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);// value序列化
|
// key序列化
|
||||||
redisTemplate.setHashKeySerializer(stringSerializer);// Hash key序列化
|
redisTemplate.setKeySerializer(stringSerializer);
|
||||||
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);// Hash value序列化
|
// value序列化
|
||||||
|
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
|
||||||
|
// Hash key序列化
|
||||||
|
redisTemplate.setHashKeySerializer(stringSerializer);
|
||||||
|
// Hash value序列化
|
||||||
|
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
|
||||||
redisTemplate.afterPropertiesSet();
|
redisTemplate.afterPropertiesSet();
|
||||||
return redisTemplate;
|
return redisTemplate;
|
||||||
}
|
}
|
||||||
@@ -90,23 +99,63 @@ public class RedisConfig extends CachingConfigurerSupport {
|
|||||||
*/
|
*/
|
||||||
@Bean
|
@Bean
|
||||||
public CacheManager cacheManager(LettuceConnectionFactory factory) {
|
public CacheManager cacheManager(LettuceConnectionFactory factory) {
|
||||||
// 配置序列化(缓存默认有效期 6小时)
|
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = jacksonSerializer();
|
||||||
|
// 配置序列化(解决乱码的问题),并且配置缓存默认有效期 6小时
|
||||||
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofHours(6));
|
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofHours(6));
|
||||||
RedisCacheConfiguration redisCacheConfiguration = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
|
RedisCacheConfiguration redisCacheConfiguration = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
|
||||||
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
|
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer));
|
||||||
|
//.disableCachingNullValues();
|
||||||
|
|
||||||
// 以锁写入的方式创建RedisCacheWriter对象
|
// 以锁写入的方式创建RedisCacheWriter对象
|
||||||
//RedisCacheWriter writer = RedisCacheWriter.lockingRedisCacheWriter(factory);
|
//update-begin-author:taoyan date:20210316 for:注解CacheEvict根据key删除redis支持通配符*
|
||||||
|
RedisCacheWriter writer = new JeroRedisCacheWriter(factory, Duration.ofMillis(50L));
|
||||||
|
//RedisCacheWriter.lockingRedisCacheWriter(factory);
|
||||||
// 创建默认缓存配置对象
|
// 创建默认缓存配置对象
|
||||||
/* 默认配置,设置缓存有效期 1小时*/
|
/* 默认配置,设置缓存有效期 1小时*/
|
||||||
//RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofHours(1));
|
//RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofHours(1));
|
||||||
/* 自定义配置test:demo 的超时时间为 5分钟*/
|
/* 自定义配置test:demo 的超时时间为 5分钟*/
|
||||||
RedisCacheManager cacheManager = RedisCacheManager.builder(RedisCacheWriter.lockingRedisCacheWriter(factory)).cacheDefaults(redisCacheConfiguration)
|
RedisCacheManager cacheManager = RedisCacheManager.builder(writer).cacheDefaults(redisCacheConfiguration)
|
||||||
|
.withInitialCacheConfigurations(singletonMap(CacheConstant.SYS_DICT_TABLE_CACHE,
|
||||||
|
RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(10)).disableCachingNullValues()
|
||||||
|
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))))
|
||||||
.withInitialCacheConfigurations(singletonMap(CacheConstant.TEST_DEMO_CACHE, RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(5)).disableCachingNullValues()))
|
.withInitialCacheConfigurations(singletonMap(CacheConstant.TEST_DEMO_CACHE, RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(5)).disableCachingNullValues()))
|
||||||
.withInitialCacheConfigurations(singletonMap(CacheConstant.PLUGIN_MALL_RANKING, RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofHours(24)).disableCachingNullValues()))
|
.withInitialCacheConfigurations(singletonMap(CacheConstant.PLUGIN_MALL_RANKING, RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofHours(24)).disableCachingNullValues()))
|
||||||
.withInitialCacheConfigurations(singletonMap(CacheConstant.PLUGIN_MALL_PAGE_LIST, RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofHours(24)).disableCachingNullValues()))
|
.withInitialCacheConfigurations(singletonMap(CacheConstant.PLUGIN_MALL_PAGE_LIST, RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofHours(24)).disableCachingNullValues()))
|
||||||
.transactionAware().build();
|
.transactionAware().build();
|
||||||
|
//update-end-author:taoyan date:20210316 for:注解CacheEvict根据key删除redis支持通配符*
|
||||||
return cacheManager;
|
return cacheManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* redis 监听配置
|
||||||
|
*
|
||||||
|
* @param redisConnectionFactory redis 配置
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Bean
|
||||||
|
public RedisMessageListenerContainer redisContainer(RedisConnectionFactory redisConnectionFactory, RedisReceiver redisReceiver, MessageListenerAdapter commonListenerAdapter) {
|
||||||
|
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
|
||||||
|
container.setConnectionFactory(redisConnectionFactory);
|
||||||
|
container.addMessageListener(commonListenerAdapter, new ChannelTopic(GlobalConstants.REDIS_TOPIC_NAME));
|
||||||
|
return container;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
MessageListenerAdapter commonListenerAdapter(RedisReceiver redisReceiver) {
|
||||||
|
MessageListenerAdapter messageListenerAdapter = new MessageListenerAdapter(redisReceiver, "onMessage");
|
||||||
|
messageListenerAdapter.setSerializer(jacksonSerializer());
|
||||||
|
return messageListenerAdapter;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Jackson2JsonRedisSerializer jacksonSerializer() {
|
||||||
|
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
|
||||||
|
ObjectMapper objectMapper = new ObjectMapper();
|
||||||
|
objectMapper.setVisibility(PropertyAccessor.ALL, Visibility.ANY);
|
||||||
|
objectMapper.enableDefaultTyping(DefaultTyping.NON_FINAL);
|
||||||
|
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
|
||||||
|
return jackson2JsonRedisSerializer;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
-93
@@ -1,93 +0,0 @@
|
|||||||
package com.jero.common.modules.redis.config;
|
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonAutoDetect;
|
|
||||||
import com.fasterxml.jackson.annotation.PropertyAccessor;
|
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
||||||
import com.jero.common.modules.redis.service.RedisReceiver;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import com.jero.common.modules.redis.prop.JeroRedisProperties;
|
|
||||||
import com.jero.common.constant.GlobalConstants;
|
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
|
||||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
|
||||||
import org.springframework.context.annotation.Bean;
|
|
||||||
import org.springframework.context.annotation.Configuration;
|
|
||||||
import org.springframework.data.redis.connection.RedisConnectionFactory;
|
|
||||||
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
|
|
||||||
import org.springframework.data.redis.core.RedisTemplate;
|
|
||||||
import org.springframework.data.redis.listener.ChannelTopic;
|
|
||||||
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
|
|
||||||
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
|
|
||||||
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
|
|
||||||
import org.springframework.data.redis.serializer.RedisSerializer;
|
|
||||||
import org.springframework.data.redis.serializer.StringRedisSerializer;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* redis配置
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
@Slf4j
|
|
||||||
@Configuration
|
|
||||||
@EnableConfigurationProperties(JeroRedisProperties.class)
|
|
||||||
@ConditionalOnProperty(value = "spring.redis.enabled", havingValue = "true", matchIfMissing = true)
|
|
||||||
public class RedisConfiguration {
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* RedisTemplate配置
|
|
||||||
*
|
|
||||||
* @param lettuceConnectionFactory
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Bean("starterRedisTemplate")
|
|
||||||
public RedisTemplate<String, Object> starterRedisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
|
|
||||||
log.info(" --- redis config init --- ");
|
|
||||||
// 设置序列化
|
|
||||||
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
|
|
||||||
ObjectMapper om = new ObjectMapper();
|
|
||||||
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
|
|
||||||
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
|
|
||||||
jackson2JsonRedisSerializer.setObjectMapper(om);
|
|
||||||
// 配置redisTemplate
|
|
||||||
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
|
|
||||||
redisTemplate.setConnectionFactory(lettuceConnectionFactory);
|
|
||||||
RedisSerializer<?> stringSerializer = new StringRedisSerializer();
|
|
||||||
redisTemplate.setKeySerializer(stringSerializer);// key序列化
|
|
||||||
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);// value序列化
|
|
||||||
redisTemplate.setHashKeySerializer(stringSerializer);// Hash key序列化
|
|
||||||
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);// Hash value序列化
|
|
||||||
redisTemplate.afterPropertiesSet();
|
|
||||||
return redisTemplate;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* redis 监听配置
|
|
||||||
*
|
|
||||||
* @param redisConnectionFactory redis 配置
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Bean
|
|
||||||
public RedisMessageListenerContainer redisContainer(RedisConnectionFactory redisConnectionFactory, RedisReceiver redisReceiver, MessageListenerAdapter commonListenerAdapter) {
|
|
||||||
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
|
|
||||||
container.setConnectionFactory(redisConnectionFactory);
|
|
||||||
container.addMessageListener(commonListenerAdapter, new ChannelTopic(GlobalConstants.REDIS_TOPIC_NAME));
|
|
||||||
return container;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Bean
|
|
||||||
MessageListenerAdapter commonListenerAdapter(RedisReceiver redisReceiver) {
|
|
||||||
MessageListenerAdapter messageListenerAdapter = new MessageListenerAdapter(redisReceiver, "onMessage");
|
|
||||||
messageListenerAdapter.setSerializer(jacksonSerializer());
|
|
||||||
return messageListenerAdapter;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Jackson2JsonRedisSerializer jacksonSerializer() {
|
|
||||||
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
|
|
||||||
ObjectMapper objectMapper = new ObjectMapper();
|
|
||||||
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
|
|
||||||
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
|
|
||||||
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
|
|
||||||
return jackson2JsonRedisSerializer;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
-24
@@ -1,24 +0,0 @@
|
|||||||
package com.jero.common.modules.redis.prop;
|
|
||||||
|
|
||||||
import lombok.Getter;
|
|
||||||
import lombok.Setter;
|
|
||||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* redis配置
|
|
||||||
*
|
|
||||||
* @author pangu
|
|
||||||
*/
|
|
||||||
@Getter
|
|
||||||
@Setter
|
|
||||||
@ConfigurationProperties(JeroRedisProperties.PREFIX)
|
|
||||||
public class JeroRedisProperties {
|
|
||||||
/**
|
|
||||||
* 前缀
|
|
||||||
*/
|
|
||||||
public static final String PREFIX = "spring.redis";
|
|
||||||
/**
|
|
||||||
* 是否开启Lettuce
|
|
||||||
*/
|
|
||||||
private Boolean enable = true;
|
|
||||||
}
|
|
||||||
+4
-1
@@ -1,4 +1,4 @@
|
|||||||
package com.jero.common.modules.redis.service;
|
package com.jero.common.modules.redis.receiver;
|
||||||
|
|
||||||
|
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
@@ -9,6 +9,9 @@ import com.jero.common.constant.GlobalConstants;
|
|||||||
import com.jero.common.util.SpringContextHolder;
|
import com.jero.common.util.SpringContextHolder;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author zyf
|
||||||
|
*/
|
||||||
@Component
|
@Component
|
||||||
@Data
|
@Data
|
||||||
public class RedisReceiver {
|
public class RedisReceiver {
|
||||||
+10
-10
@@ -1,13 +1,4 @@
|
|||||||
package com.jero.common.modules.redis.write;
|
package com.jero.common.modules.redis.writer;
|
||||||
|
|
||||||
import java.nio.charset.StandardCharsets;
|
|
||||||
import java.time.Duration;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
|
||||||
import java.util.function.Consumer;
|
|
||||||
import java.util.function.Function;
|
|
||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.dao.PessimisticLockingFailureException;
|
import org.springframework.dao.PessimisticLockingFailureException;
|
||||||
@@ -19,6 +10,15 @@ import org.springframework.data.redis.core.types.Expiration;
|
|||||||
import org.springframework.lang.Nullable;
|
import org.springframework.lang.Nullable;
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.time.Duration;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 该类参照 DefaultRedisCacheWriter 重写了 remove 方法实现通配符*删除
|
* 该类参照 DefaultRedisCacheWriter 重写了 remove 方法实现通配符*删除
|
||||||
*/
|
*/
|
||||||
Reference in New Issue
Block a user