From 57318cc55d50f4b8a0e8742b15c06f2256443939 Mon Sep 17 00:00:00 2001 From: 疯狂的狮子Li <15040126243@163.com> Date: 星期三, 03 一月 2024 10:25:23 +0800 Subject: [PATCH] [重大更新] 新增 PlusCacheWrapper装饰器 为SpringCache增加本地缓存减少redis查询提高性能(尝试性更新问题未知 请勿轻易更新尝试) --- ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/PlusSpringCacheManager.java | 4 ruoyi-common/ruoyi-common-security/src/main/java/org/dromara/common/security/config/SecurityConfig.java | 12 --- ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/PlusCacheWrapper.java | 96 ++++++++++++++++++++++++++++++++ ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/core/dao/PlusSaTokenDao.java | 4 + ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java | 22 +------ ruoyi-common/ruoyi-common-redis/pom.xml | 5 + 6 files changed, 110 insertions(+), 33 deletions(-) diff --git a/ruoyi-common/ruoyi-common-redis/pom.xml b/ruoyi-common/ruoyi-common-redis/pom.xml index 5e5c277..1408665 100644 --- a/ruoyi-common/ruoyi-common-redis/pom.xml +++ b/ruoyi-common/ruoyi-common-redis/pom.xml @@ -32,6 +32,11 @@ <groupId>com.baomidou</groupId> <artifactId>lock4j-redisson-spring-boot-starter</artifactId> </dependency> + + <dependency> + <groupId>com.github.ben-manes.caffeine</groupId> + <artifactId>caffeine</artifactId> + </dependency> </dependencies> </project> diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/PlusCacheWrapper.java b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/PlusCacheWrapper.java new file mode 100644 index 0000000..65a3e89 --- /dev/null +++ b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/PlusCacheWrapper.java @@ -0,0 +1,96 @@ +package org.dromara.common.redis.manager; + +import cn.hutool.core.lang.Console; +import com.github.benmanes.caffeine.cache.Caffeine; +import org.springframework.cache.Cache; + +import java.util.concurrent.Callable; +import java.util.concurrent.TimeUnit; + +/** + * Cache 瑁呴グ鍣�(鐢ㄤ簬鎵╁睍涓�绾х紦瀛�) + * + * @author LionLi + */ +public class PlusCacheWrapper implements Cache { + + private static final com.github.benmanes.caffeine.cache.Cache<Object, Object> CAFFEINE = Caffeine.newBuilder() + // 璁剧疆鏈�鍚庝竴娆″啓鍏ユ垨璁块棶鍚庣粡杩囧浐瀹氭椂闂磋繃鏈� + .expireAfterWrite(30, TimeUnit.SECONDS) + // 鍒濆鐨勭紦瀛樼┖闂村ぇ灏� + .initialCapacity(100) + // 缂撳瓨鐨勬渶澶ф潯鏁� + .maximumSize(1000) + .build(); + + private final Cache cache; + + public PlusCacheWrapper(Cache cache) { + this.cache = cache; + } + + @Override + public String getName() { + return cache.getName(); + } + + @Override + public Object getNativeCache() { + return cache.getNativeCache(); + } + + @Override + public ValueWrapper get(Object key) { + Object o = CAFFEINE.get(key, k -> cache.get(key)); + Console.log("redisson caffeine -> key: " + key + ",value:" + o); + return (ValueWrapper) o; + } + + @SuppressWarnings("unchecked") + public <T> T get(Object key, Class<T> type) { + Object o = CAFFEINE.get(key, k -> cache.get(key, type)); + Console.log("redisson caffeine -> key: " + key + ",value:" + o); + return (T) o; + } + + @Override + public void put(Object key, Object value) { + cache.put(key, value); + CAFFEINE.put(key, value); + } + + public ValueWrapper putIfAbsent(Object key, Object value) { + return cache.putIfAbsent(key, value); + } + + @Override + public void evict(Object key) { + evictIfPresent(key); + } + + public boolean evictIfPresent(Object key) { + boolean b = cache.evictIfPresent(key); + if (b) { + CAFFEINE.invalidate(key); + } + return b; + } + + @Override + public void clear() { + cache.clear(); + } + + public boolean invalidate() { + return cache.invalidate(); + } + + @SuppressWarnings("unchecked") + @Override + public <T> T get(Object key, Callable<T> valueLoader) { + Object o = CAFFEINE.get(key, k -> cache.get(key, valueLoader)); + Console.log("redisson caffeine -> key: " + key + ",value:" + o); + return (T) o; + } + +} diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/PlusSpringCacheManager.java b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/PlusSpringCacheManager.java index 08ebc78..0f8121b 100644 --- a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/PlusSpringCacheManager.java +++ b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/PlusSpringCacheManager.java @@ -156,7 +156,7 @@ private Cache createMap(String name, CacheConfig config) { RMap<Object, Object> map = RedisUtils.getClient().getMap(name); - Cache cache = new RedissonCache(map, allowNullValues); + Cache cache = new PlusCacheWrapper(new RedissonCache(map, allowNullValues)); if (transactionAware) { cache = new TransactionAwareCacheDecorator(cache); } @@ -170,7 +170,7 @@ private Cache createMapCache(String name, CacheConfig config) { RMapCache<Object, Object> map = RedisUtils.getClient().getMapCache(name); - Cache cache = new RedissonCache(map, config, allowNullValues); + Cache cache = new PlusCacheWrapper(new RedissonCache(map, config, allowNullValues)); if (transactionAware) { cache = new TransactionAwareCacheDecorator(cache); } diff --git a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/core/dao/PlusSaTokenDao.java b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/core/dao/PlusSaTokenDao.java index b262d07..2cfc927 100644 --- a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/core/dao/PlusSaTokenDao.java +++ b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/core/dao/PlusSaTokenDao.java @@ -15,6 +15,8 @@ /** * Sa-Token鎸佷箙灞傛帴鍙�(浣跨敤妗嗘灦鑷甫RedisUtils瀹炵幇 鍗忚缁熶竴) + * <p> + * 閲囩敤 caffeine + redis 澶氱骇缂撳瓨 浼樺寲骞跺彂鏌ヨ鏁堢巼 * * @author Lion Li */ @@ -22,7 +24,7 @@ private static final Cache<String, Object> CAFFEINE = Caffeine.newBuilder() // 璁剧疆鏈�鍚庝竴娆″啓鍏ユ垨璁块棶鍚庣粡杩囧浐瀹氭椂闂磋繃鏈� - .expireAfterWrite(10, TimeUnit.SECONDS) + .expireAfterWrite(5, TimeUnit.SECONDS) // 鍒濆鐨勭紦瀛樼┖闂村ぇ灏� .initialCapacity(100) // 缂撳瓨鐨勬渶澶ф潯鏁� diff --git a/ruoyi-common/ruoyi-common-security/src/main/java/org/dromara/common/security/config/SecurityConfig.java b/ruoyi-common/ruoyi-common-security/src/main/java/org/dromara/common/security/config/SecurityConfig.java index 211cefa..b9283e0 100644 --- a/ruoyi-common/ruoyi-common-security/src/main/java/org/dromara/common/security/config/SecurityConfig.java +++ b/ruoyi-common/ruoyi-common-security/src/main/java/org/dromara/common/security/config/SecurityConfig.java @@ -59,9 +59,6 @@ StpUtil.getTokenValue()); } - // 淇濆瓨鐢ㄦ埛淇℃伅 -// ThreadLocalHolder.set(LoginHelper.LOGIN_USER_KEY, LoginHelper.getLoginUser()); - // 鏈夋晥鐜囧奖鍝� 鐢ㄤ簬涓存椂娴嬭瘯 // if (log.isDebugEnabled()) { // log.info("鍓╀綑鏈夋晥鏃堕棿: {}", StpUtil.getTokenTimeout()); @@ -69,14 +66,7 @@ // } }); - }) -// { -// @Override -// public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { -// ThreadLocalHolder.clear(); -// } -// } - ).addPathPatterns("/**") + })).addPathPatterns("/**") // 鎺掗櫎涓嶉渶瑕佹嫤鎴殑璺緞 .excludePathPatterns(securityProperties.getExcludes()); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java index b20bf65..bc6663f 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java @@ -6,9 +6,8 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import org.dromara.common.core.constant.CacheConstants; +import lombok.RequiredArgsConstructor; import org.dromara.common.core.constant.CacheNames; -import org.dromara.common.core.context.ThreadLocalHolder; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.service.DictService; import org.dromara.common.core.utils.MapstructUtils; @@ -26,7 +25,6 @@ import org.dromara.system.mapper.SysDictDataMapper; import org.dromara.system.mapper.SysDictTypeMapper; import org.dromara.system.service.ISysDictTypeService; -import lombok.RequiredArgsConstructor; import org.springframework.cache.annotation.CachePut; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; @@ -217,16 +215,9 @@ * @param separator 鍒嗛殧绗� * @return 瀛楀吀鏍囩 */ - @SuppressWarnings("unchecked cast") @Override public String getDictLabel(String dictType, String dictValue, String separator) { - // 浼樺厛浠庢湰鍦扮紦瀛樿幏鍙� - List<SysDictDataVo> datas = ThreadLocalHolder.get(CacheConstants.SYS_DICT_KEY + dictType); - if (ObjectUtil.isNull(datas)) { - datas = SpringUtils.getAopProxy(this).selectDictDataByType(dictType); - ThreadLocalHolder.set(CacheConstants.SYS_DICT_KEY + dictType, datas); - } - + List<SysDictDataVo> datas = SpringUtils.getAopProxy(this).selectDictDataByType(dictType); Map<String, String> map = StreamUtils.toMap(datas, SysDictDataVo::getDictValue, SysDictDataVo::getDictLabel); if (StringUtils.containsAny(dictValue, separator)) { return Arrays.stream(dictValue.split(separator)) @@ -245,16 +236,9 @@ * @param separator 鍒嗛殧绗� * @return 瀛楀吀鍊� */ - @SuppressWarnings("unchecked cast") @Override public String getDictValue(String dictType, String dictLabel, String separator) { - // 浼樺厛浠庢湰鍦扮紦瀛樿幏鍙� - List<SysDictDataVo> datas = ThreadLocalHolder.get(CacheConstants.SYS_DICT_KEY + dictType); - if (ObjectUtil.isNull(datas)) { - datas = SpringUtils.getAopProxy(this).selectDictDataByType(dictType); - ThreadLocalHolder.set(CacheConstants.SYS_DICT_KEY + dictType, datas); - } - + List<SysDictDataVo> datas = SpringUtils.getAopProxy(this).selectDictDataByType(dictType); Map<String, String> map = StreamUtils.toMap(datas, SysDictDataVo::getDictLabel, SysDictDataVo::getDictValue); if (StringUtils.containsAny(dictLabel, separator)) { return Arrays.stream(dictLabel.split(separator)) -- Gitblit v1.9.3