diff --git a/backend/pom.xml b/backend/pom.xml index b40ad1c7a6..3a8a62a498 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -280,6 +280,22 @@ json-path 2.4.0 + + + org.springframework.boot + spring-boot-starter-data-redis + + + redis.clients + jedis + + + + + + org.apache.commons + commons-pool2 + diff --git a/backend/src/main/java/io/dataease/commons/condition/RedisStatusCondition.java b/backend/src/main/java/io/dataease/commons/condition/RedisStatusCondition.java new file mode 100644 index 0000000000..ad23200b57 --- /dev/null +++ b/backend/src/main/java/io/dataease/commons/condition/RedisStatusCondition.java @@ -0,0 +1,23 @@ +package io.dataease.commons.condition; + +import io.dataease.commons.utils.CommonBeanFactory; +import org.apache.commons.lang3.StringUtils; +import org.springframework.context.annotation.Condition; +import org.springframework.context.annotation.ConditionContext; +import org.springframework.core.env.Environment; +import org.springframework.core.type.AnnotatedTypeMetadata; + +public class RedisStatusCondition implements Condition { + + private static final String DEFAULT_TYPE = "ehcache"; + private static final String TARGET_TYPE = "redis"; + private static final String TYPE_KEY = "spring.cache.type"; + + @Override + public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { + Environment environment = context.getEnvironment(); + String ehcacheType = environment.getProperty(TYPE_KEY, String.class, DEFAULT_TYPE); + + return StringUtils.equals(TARGET_TYPE, ehcacheType); + } +} diff --git a/backend/src/main/java/io/dataease/config/RedisConfig.java b/backend/src/main/java/io/dataease/config/RedisConfig.java new file mode 100644 index 0000000000..c3778545bc --- /dev/null +++ b/backend/src/main/java/io/dataease/config/RedisConfig.java @@ -0,0 +1,27 @@ +package io.dataease.config; + + +import io.dataease.commons.condition.RedisStatusCondition; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Conditional; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; + + + +@Configuration +public class RedisConfig { + + @Conditional({RedisStatusCondition.class}) + @Bean + public RedisTemplate redisTemplate(RedisConnectionFactory factory) { + RedisTemplate redisTemplate = new RedisTemplate<>(); + redisTemplate.setConnectionFactory(factory); + Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class); + redisTemplate.setDefaultSerializer(serializer); + return redisTemplate; + } + +} diff --git a/backend/src/main/java/io/dataease/listener/util/CacheUtils.java b/backend/src/main/java/io/dataease/listener/util/CacheUtils.java index 443a9dc3fd..913fa42bb4 100644 --- a/backend/src/main/java/io/dataease/listener/util/CacheUtils.java +++ b/backend/src/main/java/io/dataease/listener/util/CacheUtils.java @@ -1,30 +1,46 @@ package io.dataease.listener.util; +import io.dataease.commons.utils.CommonBeanFactory; import net.sf.ehcache.Cache; import net.sf.ehcache.Element; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.CacheManager; import org.springframework.cache.ehcache.EhCacheCacheManager; -import org.springframework.context.annotation.Configuration; -import java.util.Date; +import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ValueOperations; + +import java.util.Date; +import java.util.concurrent.TimeUnit; -@Configuration public class CacheUtils { - private static CacheManager manager; + private static CacheManager cacheManager; - @Autowired - public void setManager(CacheManager manager) { - CacheUtils.manager = manager; + + private static CacheManager getCacheManager() { + if (cacheManager == null) + cacheManager = CommonBeanFactory.getBean(CacheManager.class); + return cacheManager; } public static Object get(String cacheName, Object key) { + if (getCacheManager() instanceof RedisCacheManager) { + org.springframework.cache.Cache cache = getCacheManager().getCache(cacheName); + if (null == cache) return null; + return cache.get(key); + } Element element = cache(cacheName).get(key); if (null == element) return null; return element.getObjectValue(); } public static void put(String cacheName, Object key, Object value, Integer ttl, Integer tti) { + if (getCacheManager() instanceof RedisCacheManager) { + RedisTemplate redisTemplate = (RedisTemplate) CommonBeanFactory.getBean("redisTemplate"); + ValueOperations valueOperations = redisTemplate.opsForValue(); + valueOperations.setIfPresent(cacheName + "::" + key , value ); + return; + } Element e = new Element(key, value); //不设置则使用xml配置 if (ttl != null) { @@ -33,19 +49,35 @@ public class CacheUtils { } if (tti != null) e.setTimeToIdle(tti); - cache(cacheName).put(e); + Cache cache = cache(cacheName); + if (null != cache) + cache.put(e); } public static boolean remove(String cacheName, Object key) { + if (getCacheManager() instanceof RedisCacheManager) { + org.springframework.cache.Cache cache = getCacheManager().getCache(cacheName); + if (null == cache) return false; + return cache.evictIfPresent(key); + } return cache(cacheName).remove(key); } public static void removeAll(String cacheName) { + if (getCacheManager() instanceof RedisCacheManager) { + org.springframework.cache.Cache cache = getCacheManager().getCache(cacheName); + if (null == cache) return; + cache.clear(); + return; + } cache(cacheName).removeAll(); } private static Cache cache(String cacheName) { - net.sf.ehcache.CacheManager cacheManager = ((EhCacheCacheManager) manager).getCacheManager(); + if (getCacheManager() instanceof RedisCacheManager) { + return null; + } + net.sf.ehcache.CacheManager cacheManager = ((EhCacheCacheManager) getCacheManager()).getCacheManager(); if (!cacheManager.cacheExists(cacheName)) cacheManager.addCache(cacheName); Cache cacheManagerCache = cacheManager.getCache(cacheName); @@ -57,6 +89,12 @@ public class CacheUtils { long exp = (time - System.currentTimeMillis()) / 1000; int intExp = (int)exp; removeAll("lic_info"); + if (getCacheManager() instanceof RedisCacheManager) { + RedisTemplate redisTemplate = (RedisTemplate) CommonBeanFactory.getBean("redisTemplate"); + ValueOperations valueOperations = redisTemplate.opsForValue(); + valueOperations.set("lic_info::lic", "lic", exp, TimeUnit.SECONDS); + return; + } put("lic_info", "lic", "lic", intExp, intExp); } } diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties index fdb33ea352..89396ba266 100644 --- a/backend/src/main/resources/application.properties +++ b/backend/src/main/resources/application.properties @@ -67,7 +67,7 @@ management.endpoints.web.exposure.include=* #RSA非对称加密参数:私钥 rsa.private_key=MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8mp0f3FE0GYP3AYPaJF7jUd1M0XxFSE2ceK3k2kw20YvQ09NJKk+OMjWQl9WitG9pB6tSCQIDAQABAkA2SimBrWC2/wvauBuYqjCFwLvYiRYqZKThUS3MZlebXJiLB+Ue/gUifAAKIg1avttUZsHBHrop4qfJCwAI0+YRAiEA+W3NK/RaXtnRqmoUUkb59zsZUBLpvZgQPfj1MhyHDz0CIQDYhsAhPJ3mgS64NbUZmGWuuNKp5coY2GIj/zYDMJp6vQIgUueLFXv/eZ1ekgz2Oi67MNCk5jeTF2BurZqNLR3MSmUCIFT3Q6uHMtsB9Eha4u7hS31tj1UWE+D+ADzp59MGnoftAiBeHT7gDMuqeJHPL4b+kC+gzV4FGTfhR9q3tTbklZkD2A== rsa.public_key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANL378k3RiZHWx5AfJqdH9xRNBmD9wGD2iRe41HdTNF8RUhNnHit5NpMNtGL0NPTSSpPjjI1kJfVorRvaQerUgkCAwEAAQ== -spring.cache.type=ehcache +#spring.cache.type=ehcache spring.cache.ehcache.config=classpath:/ehcache/ehcache.xml #打印URL路径 #logging.level.org.springframework.web=trace @@ -85,6 +85,18 @@ server.compression.enabled=true server.compression.mime-types=application/javascript,text/css,application/json,application/xml,text/html,text/xml,text/plain server.compression.min-response-size=1024 +#下面的配置新增到/opt/dataease/conf/dataease/properties +#spring.redis.database=0 +#spring.redis.host=192.168.0.110 +#spring.redis.port=6379 +#spring.redis.password=DataEase_ZNB@REDIS +#spring.redis.timeout=10000 +#spring.redis.lettuce.pool.max-active=8 +#spring.redis.lettuce.pool.max-wait=-1 +#spring.redis.lettuce.pool.max-idle=8 +##spring.cache.type=redis +#spring.cache.type=ehcache +