From ada54b6b979a8791e300e70721fa511f292149a3 Mon Sep 17 00:00:00 2001 From: Parker Date: Tue, 2 Feb 2021 21:17:53 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=BC=93=E5=AD=98=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/annotation/hotdata/HotDataDel.java | 3 - .../common/annotation/hotdata/HotDataPut.java | 3 - .../common/constants/CacheConstants.java | 10 +- .../org/opsli/common/enums/CacheType.java | 44 + .../core/autoconfigure/conf/WafConfig.java | 2 +- .../properties/ApiPathProperties.java | 4 +- .../properties/CacheProperties.java | 38 + .../properties/GlobalProperties.java | 4 +- .../base/controller/BaseRestController.java | 4 +- .../org/opsli/core/cache/local/CacheUtil.java | 1098 +++++------------ .../cache/pushsub/entity/CacheDataEntity.java | 5 +- .../{CacheType.java => CacheHandleType.java} | 2 +- .../core/cache/pushsub/enums/MsgArgsType.java | 2 + .../core/cache/pushsub/enums/PushSubType.java | 3 - .../cache/pushsub/handler/DictHandler.java | 32 +- .../pushsub/handler/EdenDataHandler.java | 67 - .../cache/pushsub/handler/HotDataHandler.java | 17 +- .../cache/pushsub/handler/MenuHandler.java | 6 +- .../cache/pushsub/handler/OrgHandler.java | 7 +- .../cache/pushsub/handler/TenantHandler.java | 7 +- .../cache/pushsub/handler/UserHandler.java | 28 +- .../pushsub/msgs/CacheDataMsgFactory.java | 14 +- .../cache/pushsub/msgs/DictMsgFactory.java | 10 +- .../core/filters/aspect/CacheDataAop.java | 153 +-- .../org/opsli/core/utils/CaptchaUtil.java | 27 +- .../java/org/opsli/core/utils/DictUtil.java | 42 +- .../java/org/opsli/core/utils/MenuUtil.java | 6 +- .../java/org/opsli/core/utils/OrgUtil.java | 6 +- .../org/opsli/core/utils/SearchHisUtil.java | 17 +- .../java/org/opsli/core/utils/TenantUtil.java | 6 +- .../org/opsli/core/utils/UserTokenUtil.java | 13 +- .../java/org/opsli/core/utils/UserUtil.java | 31 +- .../core/creater/enums/DataBaseType.java | 4 +- .../service/impl/DictDetailServiceImpl.java | 16 +- .../test/web/TestRestRestController.java | 4 +- .../cache/service/EhCachePluginImpl.java | 4 +- .../opsli/plugins/redis/lock/RedisLock.java | 17 +- .../src/main/resources/application-dev.yaml | 2 +- .../main/resources/config/ehcache-opsli.xml | 4 +- 39 files changed, 588 insertions(+), 1174 deletions(-) create mode 100644 opsli-base-support/opsli-common/src/main/java/org/opsli/common/enums/CacheType.java create mode 100644 opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/CacheProperties.java rename opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/enums/{CacheType.java => CacheHandleType.java} (96%) delete mode 100644 opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/handler/EdenDataHandler.java diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/hotdata/HotDataDel.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/hotdata/HotDataDel.java index 48d6e914..55834436 100644 --- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/hotdata/HotDataDel.java +++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/hotdata/HotDataDel.java @@ -15,7 +15,6 @@ */ package org.opsli.common.annotation.hotdata; -import org.opsli.common.constants.CacheConstants; import java.lang.annotation.*; @@ -41,7 +40,5 @@ import java.lang.annotation.*; @Documented public @interface HotDataDel { - /** 缓存源名字 */ - String name() default CacheConstants.HOT_DATA; } diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/hotdata/HotDataPut.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/hotdata/HotDataPut.java index 00caf82b..947cf6f7 100644 --- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/hotdata/HotDataPut.java +++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/hotdata/HotDataPut.java @@ -15,7 +15,6 @@ */ package org.opsli.common.annotation.hotdata; -import org.opsli.common.constants.CacheConstants; import java.lang.annotation.*; @@ -41,7 +40,5 @@ import java.lang.annotation.*; @Documented public @interface HotDataPut { - /** 缓存源名字 */ - String name() default CacheConstants.HOT_DATA; } diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/constants/CacheConstants.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/constants/CacheConstants.java index a968deb6..4546ffe9 100644 --- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/constants/CacheConstants.java +++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/constants/CacheConstants.java @@ -26,12 +26,10 @@ public interface CacheConstants { String PREFIX_NAME = "opsli"; - /** 热点数据 */ - String HOT_DATA = "hotData"; + /** Ehcache 缓存存放空间 */ + String EHCACHE_SPACE = "timed"; - /** 永久常量 */ - String EDEN_DATA = "edenData"; + /** 热数据前缀 */ + String HOT_DATA_PREFIX = "hot_data"; - /** 永久Hash常量 */ - String EDEN_HASH_DATA = "edenHashData"; } diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/enums/CacheType.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/enums/CacheType.java new file mode 100644 index 00000000..4cbfac68 --- /dev/null +++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/enums/CacheType.java @@ -0,0 +1,44 @@ +package org.opsli.common.enums; + +/** + * 数据库类型 + * + * @author Parker + */ +public enum CacheType { + + /** 缓存类型 */ + TIMED("timed", "时控数据"), + EDEN("eden", "永久数据"), + EDEN_HASH("edenhash", "永久Hash数据") + + ; + + private final String name; + private final String desc; + + public static CacheType getCacheType(String cacheType) { + CacheType[] var1 = values(); + for (CacheType type : var1) { + if (type.name.equalsIgnoreCase(cacheType)) { + return type; + } + } + return null; + } + + public String getName() { + return this.name; + } + + public String getDesc() { + return this.desc; + } + + // ================= + + CacheType(final String name, final String desc) { + this.name = name; + this.desc = desc; + } +} \ No newline at end of file diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/conf/WafConfig.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/conf/WafConfig.java index 2017bfc5..8707b93d 100644 --- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/conf/WafConfig.java +++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/conf/WafConfig.java @@ -40,7 +40,7 @@ public class WafConfig { private GlobalProperties globalProperties; @Bean - @ConditionalOnProperty(prefix = GlobalProperties.PREFIX +".waf", name = "enable", havingValue = "true", matchIfMissing = false) + @ConditionalOnProperty(prefix = GlobalProperties.PROP_PREFIX +".waf", name = "enable", havingValue = "true", matchIfMissing = false) public FilterRegistrationBean wafFilterRegistration() { WafFilter wafFilter = new WafFilter(); wafFilter.setUrlExclusion(globalProperties.getWaf().getUrlExclusion()); diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/ApiPathProperties.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/ApiPathProperties.java index a2de22dc..a6392ac9 100644 --- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/ApiPathProperties.java +++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/ApiPathProperties.java @@ -25,11 +25,13 @@ import org.springframework.stereotype.Component; * @author parker */ @Component -@ConfigurationProperties(prefix = "server.servlet.api.path") +@ConfigurationProperties(prefix = ApiPathProperties.PROP_PREFIX) @Data @EqualsAndHashCode(callSuper = false) public class ApiPathProperties { + public static final String PROP_PREFIX = "server.servlet.api.path"; + /** 专门针对 Controller层接口路径前缀全局配置 */ private String globalPrefix; diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/CacheProperties.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/CacheProperties.java new file mode 100644 index 00000000..ac4d4246 --- /dev/null +++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/CacheProperties.java @@ -0,0 +1,38 @@ +/** + * Copyright 2020 OPSLI 快速开发平台 https://www.opsli.com + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.opsli.core.autoconfigure.properties; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * 接口路径前缀配置 + * @author parker + */ +@Component +@ConfigurationProperties(prefix = CacheProperties.PROP_PREFIX) +@Data +@EqualsAndHashCode(callSuper = false) +public class CacheProperties { + + public static final String PROP_PREFIX = "spring.cache-conf"; + + /** 缓存前缀 */ + private String prefix; + +} diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/GlobalProperties.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/GlobalProperties.java index 39c32c51..93de1f30 100644 --- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/GlobalProperties.java +++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/GlobalProperties.java @@ -14,12 +14,12 @@ import java.util.Set; * @date 2021-01-31 5:52 下午 **/ @Configuration -@ConfigurationProperties(prefix = GlobalProperties.PREFIX) +@ConfigurationProperties(prefix = GlobalProperties.PROP_PREFIX) @Data @EqualsAndHashCode(callSuper = false) public class GlobalProperties { - public static final String PREFIX = "opsli"; + public static final String PROP_PREFIX = "opsli"; /** 系统名称 */ private String systemName; diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/base/controller/BaseRestController.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/base/controller/BaseRestController.java index 1da401b1..d3bcd301 100644 --- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/base/controller/BaseRestController.java +++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/base/controller/BaseRestController.java @@ -119,7 +119,7 @@ public abstract class BaseRestController V get(String key, Class vClass){ - return CacheUtil.get(CacheConstants.HOT_DATA,key,vClass,true); - } - /** - * 取缓存 - * Key 程序自处理 - * 比如:jksahdjh1j1hjk1 - * - * @param key 键 - * @return V - */ - public static Object get(String key){ - return CacheUtil.get(CacheConstants.HOT_DATA,key,true); - } + // ========================= GET ========================= /** - * 取缓存 - * Key 程序不处理 - * 比如:源Key opsli:hotData:ahdjksahjkd1 - * + * 获得 普通 缓存 * @param key 键 - * @param vClass 转换类型 - * @return V + * @return Object */ - public static V getByKeyOriginal(String key, Class vClass){ - return CacheUtil.get(CacheConstants.HOT_DATA,key,vClass,false); + public static Object getTimed(final String key){ + // 转换数据泛型 + return CacheUtil.get(key, false, false); } /** - * 取缓存 - * Key 程序不处理 - * 比如:源Key opsli:hotData:ahdjksahjkd1 - * + * 获得 普通 缓存 * @param key 键 - * @return V + * @param isSaveLocal 是否保存到本地 + * @return Object */ - public static Object getByKeyOriginal(String key){ - return CacheUtil.get(CacheConstants.HOT_DATA,key,false); + public static Object getTimed(final String key, final boolean isSaveLocal){ + // 转换数据泛型 + return CacheUtil.get(key, false, isSaveLocal); } - /** - * 取缓存 - 永久 - * Key 程序自处理 - * 比如:jksahdjh1j1hjk1 - * + * 获得 普通 缓存 + * @param vClass 泛型Class * @param key 键 - * @param vClass 转换类型 - * @return V + * @return 泛型 */ - public static V getEden(String key, Class vClass){ - return CacheUtil.get(CacheConstants.EDEN_DATA,key,vClass,true); + public static V getTimed(final Class vClass, final String key){ + // 转换数据泛型 + return CacheUtil.get(vClass, key, false, false); } - /** - * 取缓存 - 永久 - * Key 程序自处理 - * 比如:jksahdjh1j1hjk1 - * + * 获得 普通 缓存 + * @param vClass 泛型Class * @param key 键 - * @return V + * @param isSaveLocal 是否保存到本地 + * @return 泛型 */ - public static Object getEden(String key){ - return CacheUtil.get(CacheConstants.EDEN_DATA,key,true); + public static V getTimed(final Class vClass, final String key, final boolean isSaveLocal){ + // 转换数据泛型 + return CacheUtil.get(vClass, key, false, isSaveLocal); } /** - * 取缓存 - 永久 - * Key 程序不处理 - * 比如:源Key opsli:hotData:ahdjksahjkd1 - * + * 获得 普通 缓存 * @param key 键 - * @param vClass 转换类型 - * @return V + * @return Object */ - public static V getEdenByKeyOriginal(String key, Class vClass){ - return CacheUtil.get(CacheConstants.EDEN_DATA,key,vClass,false); + public static Object getEden(final String key){ + // 转换数据泛型 + return CacheUtil.get(key, true, false); } /** - * 取缓存 - 永久 - * Key 程序不处理 - * 比如:源Key opsli:hotData:ahdjksahjkd1 - * + * 获得 普通 缓存 * @param key 键 - * @return V + * @param isSaveLocal 是否保存到本地 + * @return Object */ - public static Object getEdenByKeyOriginal(String key){ - return CacheUtil.get(CacheConstants.EDEN_DATA,key,false); + public static Object getEden(final String key, final boolean isSaveLocal){ + // 转换数据泛型 + return CacheUtil.get(key, true, isSaveLocal); } /** - * 取Hash缓存 - * Key 程序自处理 - * 比如:jksahdjh1j1hjk1 - * + * 获得 普通 缓存 + * @param vClass 泛型Class * @param key 键 - * @param field 字段 - * @param vClass 转换类型 - * @return V + * @return 泛型 */ - public static V getHash(String key, String field, Class vClass){ - return CacheUtil.getHash(CacheConstants.EDEN_HASH_DATA,key,field,vClass,true); + public static V getEden(final String key, final Class vClass){ + // 转换数据泛型 + return CacheUtil.get(vClass, key, true, false); } /** - * 取Hash缓存 - * Key 程序自处理 - * 比如:jksahdjh1j1hjk1 - * + * 获得 普通 缓存 + * @param vClass 泛型Class * @param key 键 - * @param field 字段 - * @return V + * @param isSaveLocal 是否保存到本地 + * @return 泛型 */ - public static Object getHash(String key, String field){ - return CacheUtil.getHash(key,field,true); + public static V getEden(final String key, final boolean isSaveLocal, final Class vClass){ + // 转换数据泛型 + return CacheUtil.get(vClass, key, true, isSaveLocal); } /** - * 取Hash缓存 - * Key 程序不处理 - * 比如:源Key opsli:hotData:ahdjksahjkd1 - * + * 获得 普通 缓存 + * @param vClass 泛型Class * @param key 键 - * @param field 字段 - * @param vClass 转换类型 - * @return V + * @param isEden 是否永久层数据 + * @param isSaveLocal 是否保存到本地 + * @return 泛型 */ - public static V getHashByKeyOriginal(String key, String field, Class vClass){ - return CacheUtil.getHash(CacheConstants.EDEN_HASH_DATA,key,field,vClass,false); + private static V get(final Class vClass, final String key, final boolean isEden, final boolean isSaveLocal){ + // 获得缓存数据 + Object cacheObj = CacheUtil.get(key, isEden, isSaveLocal); + // 转换数据泛型 + return Convert.convert(vClass, cacheObj); } /** - * 取Hash缓存 - * Key 程序不处理 - * 比如:源Key opsli:hotData:ahdjksahjkd1 - * + * 获得 普通 缓存 * @param key 键 - * @param field 字段 - * @return V - */ - public static Object getHashByKeyOriginal(String key, String field){ - return CacheUtil.getHash(key,field,false); - } - - /** - * 取缓存 - 集合 - * Key 程序自处理 - * 比如:jksahdjh1j1hjk1 - * - * @param keys 键 - 集合 - * @param vClass 转换类型 - * @return V - */ - public static List getAll(List keys, Class vClass){ - return CacheUtil.getAll(CacheConstants.HOT_DATA,keys,vClass,true); - } - - /** - * 取缓存 - 集合 - * Key 程序自处理 - * 比如:jksahdjh1j1hjk1 - * - * @param keys 键 - 集合 - * @return V - */ - public static List getAll(List keys){ - return CacheUtil.getAll(CacheConstants.HOT_DATA,keys,true); - } - - /** - * 取缓存 - 集合 - * Key 程序不处理 - * 比如:源Key opsli:hotData:ahdjksahjkd1 - * - * @param keys 键 - 集合 - * @param vClass 转换类型 - * @return V + * @param isEden 是否永久层数据 + * @param isSaveLocal 是否保存到本地 + * @return Object */ - public static List getAllByKeyOriginal(List keys, Class vClass){ - return CacheUtil.getAll(CacheConstants.HOT_DATA,keys,vClass,false); - } - - /** - * 取缓存 - 集合 - * Key 程序不处理 - * 比如:源Key opsli:hotData:ahdjksahjkd1 - * - * @param keys 键 - 集合 - * @return V - */ - public static List getAllByKeyOriginal(List keys){ - return CacheUtil.getAll(CacheConstants.HOT_DATA,keys,false); - } - - /** - * 取缓存 - 永久 - 集合 - * Key 程序自处理 - * 比如:jksahdjh1j1hjk1 - * - * @param keys 键 - 集合 - * @param vClass 转换类型 - * @return V - */ - public static List getEdenAll(List keys, Class vClass){ - return CacheUtil.getAll(CacheConstants.EDEN_DATA,keys,vClass,true); - } - - /** - * 取缓存 - 永久 - 集合 - * Key 程序自处理 - * 比如:jksahdjh1j1hjk1 - * - * @param keys 键 - 集合 - * @return V - */ - public static List getEdenAll(List keys){ - return CacheUtil.getAll(CacheConstants.EDEN_DATA,keys,true); - } - - /** - * 取缓存 - 永久 -集合 - * Key 程序不处理 - * 比如:源Key opsli:hotData:ahdjksahjkd1 - * - * @param keys 键 - 集合 - * @param vClass 转换类型 - * @return V - */ - public static List getEdenAllByKeyOriginal(List keys, Class vClass){ - return CacheUtil.getAll(CacheConstants.EDEN_DATA,keys,vClass,false); - } - - /** - * 取缓存 - 永久 -集合 - * Key 程序不处理 - * 比如:源Key opsli:hotData:ahdjksahjkd1 - * - * @param keys 键 - 集合 - * @return V - */ - public static List getEdenAllByKeyOriginal(List keys){ - return CacheUtil.getAll(CacheConstants.EDEN_DATA,keys,false); - } - - /** - * 取Hash缓存 - * Key 程序自处理 - * 比如:jksahdjh1j1hjk1 - * - * @param key 键 - * @param fields 字段集合 - * @param vClass 转换类型 - * @return V - */ - public static List getHashAll(String key, List fields, Class vClass){ - return CacheUtil.getHashAll(CacheConstants.EDEN_HASH_DATA,key,fields,vClass,true); - } - - /** - * 取Hash缓存 - * Key 程序自处理 - * 比如:jksahdjh1j1hjk1 - * - * @param key 键 - * @param fields 字段集合 - * @return V - */ - public static List getHashAll(String key, List fields){ - return CacheUtil.getHashAll(CacheConstants.EDEN_HASH_DATA,key,fields,true); - } - - /** - * 取Hash缓存 - * Key 程序不处理 - * 比如:源Key opsli:hotData:ahdjksahjkd1 - * - * @param key 键 - * @param fields 字段集合 - * @param vClass 转换类型 - * @return V - */ - public static List getHashAllByKeyOriginal(String key, List fields, Class vClass){ - return CacheUtil.getHashAll(CacheConstants.EDEN_HASH_DATA,key,fields,vClass,false); - } - - /** - * 取Hash缓存 - * Key 程序不处理 - * 比如:源Key opsli:hotData:ahdjksahjkd1 - * - * @param key 键 - * @param fields 字段集合 - * @return V - */ - public static List getHashAllByKeyOriginal(String key, List fields){ - return CacheUtil.getHashAll(CacheConstants.EDEN_HASH_DATA,key,fields,false); - } - - /** - * 获得 Hash 缓存 - * @param cacheName 主缓存名 - * @param key 键 - * @param field 字段名 - * @param vClass Clazz 反射 - * @param keyFlag 是否处理key - * @param 泛型 - * @return - */ - private static V getHash(String cacheName, String key, String field, Class vClass,boolean keyFlag){ - // 自动处理 key - if(keyFlag){ - key = CacheUtil.handleKey(cacheName, key); - } - V v = null; + private static Object get(final String key, final boolean isEden, final boolean isSaveLocal){ try { - JSONObject jsonObject; - jsonObject = ehCachePlugin.get(CacheConstants.HOT_DATA, key+":"+field, JSONObject.class); - // 如果本地缓存为空 则去Redis中 再去取一次 - if(jsonObject != null){ - JSONObject dataJson = jsonObject.getJSONObject(JSON_KEY); - if(dataJson != null){ - v = dataJson.toJavaObject(vClass); + // 缓存 Key + String cacheKey = CacheUtil.handleUsualKey(key, isEden); + + // 获得缓存Json + JSONObject cacheJson; + + // 判读是否需要 先从本地缓存获取 + if(isSaveLocal){ + // 获得缓存Json + cacheJson = ehCachePlugin.get(CacheConstants.EHCACHE_SPACE, + cacheKey, JSONObject.class); + if(cacheJson != null){ + return cacheJson.get(JSON_KEY); } - }else{ - jsonObject = (JSONObject) redisPlugin.hGet(key,field); - if(jsonObject != null){ - // 存入EhCache - ehCachePlugin.put(CacheConstants.HOT_DATA, key+":"+field, jsonObject); - JSONObject dataJson = jsonObject.getJSONObject(JSON_KEY); - if(dataJson != null){ - v = dataJson.toJavaObject(vClass); - } + } + + // 如果本地缓存找不到该缓存 则去远端缓存拉去缓存 + cacheJson = (JSONObject) redisPlugin.get(cacheKey); + if(cacheJson != null){ + // 判读是否需要 存入本地EhCache + if(isSaveLocal){ + //存入EhCache + ehCachePlugin.put(CacheConstants.EHCACHE_SPACE, + cacheKey, cacheJson); } } + + return cacheJson != null ? cacheJson.get(JSON_KEY) : null; }catch (Exception e){ log.error(e.getMessage(),e); } - return v; + return null; } /** * 获得 Hash 缓存 + * @param vClass 泛型Class * @param key 键 * @param field 字段名 - * @param keyFlag 是否处理key - * @return + * @return 泛型 */ - private static Object getHash(String key, String field, boolean keyFlag){ - // 自动处理 key - if(keyFlag){ - key = CacheUtil.handleKey(CacheConstants.EDEN_HASH_DATA, key); - } - Object v = null; - try { - JSONObject jsonObject; - jsonObject = ehCachePlugin.get(CacheConstants.HOT_DATA, key+":"+field, JSONObject.class); - // 如果本地缓存为空 则去Redis中 再去取一次 - if(jsonObject != null){ - v = jsonObject.get(JSON_KEY); - }else{ - jsonObject = (JSONObject) redisPlugin.hGet(key,field); - if(jsonObject != null){ - // 存入EhCache - ehCachePlugin.put(CacheConstants.HOT_DATA, key+":"+field, jsonObject); - v = jsonObject.get(JSON_KEY); - } - } - }catch (Exception e){ - log.error(e.getMessage(),e); - } - return v; + public static V getHash(final Class vClass, final String key, final String field){ + // 获得缓存数据 + Object cacheObj = CacheUtil.getHash(key, field, false); + // 转换数据泛型 + return Convert.convert(vClass, cacheObj); } - /** * 获得 Hash 缓存 - * @param cacheName 主缓存名 * @param key 键 - * @param vClass Clazz 反射 - * @param keyFlag 是否处理key - * @param 泛型 - * @return + * @param field 字段名 + * @param isSaveLocal 是否保存到本地 + * @param vClass 泛型Class + * @return 泛型 */ - private static V get(String cacheName, String key, Class vClass,boolean keyFlag){ - // 自动处理 key - if(keyFlag){ - key = CacheUtil.handleKey(cacheName, key); - } - V v = null; - try { - JSONObject jsonObject = ehCachePlugin.get(CacheConstants.HOT_DATA, key, JSONObject.class); - // 如果本地缓存为空 则去Redis中 再去取一次 - if(jsonObject != null){ - JSONObject dataJson = jsonObject.getJSONObject(JSON_KEY); - if(dataJson != null){ - v = dataJson.toJavaObject(vClass); - } - }else{ - jsonObject = (JSONObject) redisPlugin.get(key); - if(jsonObject != null){ - // 存入EhCache - ehCachePlugin.put(CacheConstants.HOT_DATA, key, jsonObject); - JSONObject dataJson = jsonObject.getJSONObject(JSON_KEY); - if(dataJson != null){ - v = dataJson.toJavaObject(vClass); - } - } - } - }catch (Exception e){ - log.error(e.getMessage(),e); - } - return v; + public static V getHash(final Class vClass, final String key, final String field, final boolean isSaveLocal){ + // 获得缓存数据 + Object cacheObj = CacheUtil.getHash(key, field, isSaveLocal); + // 转换数据泛型 + return Convert.convert(vClass, cacheObj); } /** * 获得 Hash 缓存 - * @param cacheName 主缓存名 * @param key 键 - * @param keyFlag 是否处理key - * @return + * @param field 字段名 + * @return Object */ - private static Object get(String cacheName, String key, boolean keyFlag){ - // 自动处理 key - if(keyFlag){ - key = CacheUtil.handleKey(cacheName, key); - } - Object v = null; - try { - JSONObject jsonObject = ehCachePlugin.get(CacheConstants.HOT_DATA, key, JSONObject.class); - // 如果本地缓存为空 则去Redis中 再去取一次 - if(jsonObject != null){ - v = jsonObject.get(JSON_KEY); - }else{ - jsonObject = (JSONObject) redisPlugin.get(key); - if(jsonObject != null){ - // 存入EhCache - ehCachePlugin.put(CacheConstants.HOT_DATA, key, jsonObject); - v = jsonObject.get(JSON_KEY); - } - } - }catch (Exception e){ - log.error(e.getMessage(),e); - } - return v; + public static Object getHash(final String key, final String field){ + return CacheUtil.getHash(key, field, false); } /** - * 获得 缓存 - 集合 - * @param cacheName 主缓存名 - * @param keys 键 - * @param vClass Clazz 反射 - * @param keyFlag 是否处理key - * @param 泛型 - * @return + * 获得 Hash 缓存 + * @param key 键 + * @param field 字段名 + * @param isSaveLocal 是否保存到本地 + * @return Object */ - private static List getAll(String cacheName, List keys, Class vClass, boolean keyFlag){ - List vs = Lists.newArrayList(); + public static Object getHash(final String key, final String field, final boolean isSaveLocal){ try { - - List nokeys = Lists.newArrayList(); - for (String key : keys) { - // 自动处理 key - if(keyFlag){ - key = CacheUtil.handleKey(cacheName, key); - } - JSONObject jsonObject = ehCachePlugin.get(CacheConstants.HOT_DATA, key, JSONObject.class); - if(jsonObject != null){ - JSONObject dataJson = jsonObject.getJSONObject(JSON_KEY); - if(dataJson != null){ - vs.add(dataJson.toJavaObject(vClass)); - } - } else { - nokeys.add(key); - } - } - // 如果本地缓存为空 则去Redis中 再去取一次 - if(nokeys.size() > 0){ - List objs = redisPlugin.getAll(nokeys); - for (Object obj : objs) { - JSONObject jsonObject = (JSONObject) obj; - if(jsonObject != null){ - JSONObject dataJson = jsonObject.getJSONObject(JSON_KEY); - if(dataJson != null){ - vs.add(dataJson.toJavaObject(vClass)); - } - } + // 缓存 Key + String cacheKey = CacheUtil.handleKey(CacheType.EDEN_HASH, key); + + // 获得缓存Json + JSONObject cacheJson; + + // 判读是否需要 先从本地缓存获取 + if(isSaveLocal){ + // 获得缓存Json + cacheJson = ehCachePlugin.get(CacheConstants.EHCACHE_SPACE, + cacheKey +":"+ field, JSONObject.class); + if(cacheJson != null){ + return cacheJson.get(JSON_KEY); } } - }catch (Exception e){ - log.error(e.getMessage(),e); - } - return vs; - } - - /** - * 获得 缓存 - 集合 - * @param cacheName 主缓存名 - * @param keys 键 - * @param keyFlag 是否处理key - * @return - */ - private static List getAll(String cacheName, List keys, boolean keyFlag){ - List vs = Lists.newArrayList(); - try { - List nokeys = Lists.newArrayList(); - for (String key : keys) { - // 自动处理 key - if(keyFlag){ - key = CacheUtil.handleKey(cacheName, key); - } - JSONObject jsonObject = ehCachePlugin.get(CacheConstants.HOT_DATA, key, JSONObject.class); - if(jsonObject != null){ - vs.add(jsonObject.get(JSON_KEY)); - } else { - nokeys.add(key); - } - } - // 如果本地缓存为空 则去Redis中 再去取一次 - if(nokeys.size() > 0){ - List objs = redisPlugin.getAll(nokeys); - for (Object obj : objs) { - JSONObject jsonObject = (JSONObject) obj; - if(jsonObject != null){ - vs.add(jsonObject.get(JSON_KEY)); - } + // 如果本地缓存找不到该缓存 则去远端缓存拉去缓存 + cacheJson = (JSONObject) redisPlugin.hGet(key, field); + if(cacheJson != null){ + // 判读是否需要 存入本地EhCache + if(isSaveLocal){ + //存入EhCache + ehCachePlugin.put(CacheConstants.EHCACHE_SPACE, + cacheKey + ":" + field, cacheJson); } } - }catch (Exception e){ - log.error(e.getMessage(),e); - } - return vs; - } - /** - * 获得 Hash 缓存 - 集合 - * @param cacheName 主缓存名 - * @param key 键 - * @param fields 字段集合 - * @param vClass Clazz 反射 - * @param keyFlag 是否处理key - * @param 泛型 - * @return - */ - private static List getHashAll(String cacheName,String key,List fields, Class vClass, boolean keyFlag){ - // 自动处理 key - if(keyFlag){ - key = CacheUtil.handleKey(cacheName, key); - } - List vs = Lists.newArrayList(); - try { - List nofields = Lists.newArrayList(); - for (String field : fields) { - JSONObject jsonObject = ehCachePlugin.get(CacheConstants.HOT_DATA, key+":"+field, JSONObject.class); - if(jsonObject != null){ - JSONObject dataJson = jsonObject.getJSONObject(JSON_KEY); - if(dataJson != null){ - vs.add(dataJson.toJavaObject(vClass)); - } - } else { - nofields.add(field); - } - } - // 如果本地缓存为空 则去Redis中 再去取一次 - if(nofields.size() > 0){ - List objs = redisPlugin.hMultiGet(key, nofields); - for (Object obj : objs) { - JSONObject jsonObject = (JSONObject) obj; - if(jsonObject != null){ - JSONObject dataJson = jsonObject.getJSONObject(JSON_KEY); - if(dataJson != null){ - vs.add(dataJson.toJavaObject(vClass)); - } - } - } - } + return cacheJson != null ? cacheJson.get(JSON_KEY) : null; }catch (Exception e){ log.error(e.getMessage(),e); } - return vs; + return null; } + // ========================= PUT ========================= - /** - * 获得 Hash 缓存 - 集合 - * @param cacheName 主缓存名 - * @param key 键 - * @param fields 字段集合 - * @param keyFlag 是否处理key - * @return - */ - private static List getHashAll(String cacheName,String key,List fields, boolean keyFlag){ - // 自动处理 key - if(keyFlag){ - key = CacheUtil.handleKey(cacheName, key); - } - List vs = Lists.newArrayList(); - try { - List nofields = Lists.newArrayList(); - for (String field : fields) { - JSONObject jsonObject = ehCachePlugin.get(CacheConstants.HOT_DATA, key+":"+field, JSONObject.class); - if(jsonObject != null){ - vs.add(jsonObject.get(JSON_KEY)); - } else { - nofields.add(field); - } - } - // 如果本地缓存为空 则去Redis中 再去取一次 - if(nofields.size() > 0){ - List objs = redisPlugin.hMultiGet(key, nofields); - for (Object obj : objs) { - JSONObject jsonObject = (JSONObject) obj; - if(jsonObject != null){ - vs.add(jsonObject.get(JSON_KEY)); - } - } - } - }catch (Exception e){ - log.error(e.getMessage(),e); - } - return vs; - } - - // ========================= PUT - 热点区 ========================= /** - * 存缓存 - 热点区 - * 默认取配置文件中缓存失效时间 - * 注意:不是永久缓存 - * + * 存普通缓存 * @param key 键 * @param value 值 * @return boolean */ - public static boolean put(String key, Object value) { - return CacheUtil.put(CacheConstants.HOT_DATA, key, value, null, true, true); + public static boolean put(final String key, final Object value) { + return CacheUtil.put(key, value, false); } - /** - * 存缓存 - 热点区 - * Key 程序不处理 - * 比如:源Key opsli:hotData:ahdjksahjkd1 - * + * 存永久缓存 * @param key 键 * @param value 值 + * @param isEden 是否永久存储 * @return boolean */ - public static boolean putByKeyOriginal(String key, Object value){ - return CacheUtil.put(CacheConstants.HOT_DATA, key, value, null, true, false); - } + public static boolean put(final String key, final Object value, final boolean isEden) { + try { + // 自动处理 key - // ========================= PUT - 永久代 ========================= + // 则统一转换为 JSONObject + JSONObject cacheJson = new JSONObject(); + cacheJson.put(JSON_KEY, value); - /** - * 存缓存 - 永久代 - * 注:这里是存入Redis永久代,本地EhCache做临时缓存 - * Redis不是垃圾桶 谨用 永久缓存 - * - * @param key 键 - * @param value 值 - * @return boolean - */ - @Deprecated - public static boolean putEden(String key, Object value) { - return CacheUtil.put(CacheConstants.EDEN_DATA, key, value, null, false, true); - } + // 缓存 Key + String cacheKey = CacheUtil.handleUsualKey(key, isEden); - /** - * 存缓存 - 永久代 - * 注:这里是存入Redis永久代,本地EhCache做临时缓存 - * Redis不是垃圾桶 谨用 永久缓存 - * - * @param key 键 - * @param value 值 - * @return boolean - */ - @Deprecated - public static boolean putEdenByKeyOriginal(String key, Object value) { - return CacheUtil.put(CacheConstants.EDEN_DATA, key, value, null, false, false); - } - - // ========================= PUT - 永久代 ========================= + // 判断是否为永久存储 + if(isEden) { + // 存入Redis + return redisPlugin.put(cacheKey, cacheJson); + }else{ + // 随机缓存失效时间 防止缓存雪崩 + // 范围在当前时效的 1.2 - 2倍 - /** - * 存Hash缓存 - 永久代 - * 注:这里是存入Redis永久代,本地EhCache做临时缓存 - * Redis不是垃圾桶 谨用 永久缓存 - * - * @param key 键 - * @param value 值 - * @return boolean - */ - @Deprecated - public static boolean putEdenHash(String key, String field, Object value) { - return CacheUtil.putEdenHash(CacheConstants.EDEN_HASH_DATA, key, field, value, true); - } + // 生成随机失效时间 + int timeout = RandomUtil.randomInt( + Convert.toInt(TTL_HOT_DATA_TIME * 1.2), + Convert.toInt(TTL_HOT_DATA_TIME * 2) + ); - /** - * 存Hash缓存 - 永久代 - * 注:这里是存入Redis永久代,本地EhCache做临时缓存 - * Redis不是垃圾桶 谨用 永久缓存 - * - * @param key 键 - * @param value 值 - * @return boolean - */ - @Deprecated - public static boolean putEdenHashByKeyOriginal(String key, String field, Object value) { - return CacheUtil.putEdenHash(CacheConstants.EDEN_HASH_DATA, key, field, value, false); + // 存入Redis + return redisPlugin.put(cacheKey, cacheJson, timeout); + } + }catch (Exception e){ + log.error(e.getMessage(),e); + } + return false; } /** - * 存 Hash 缓存 - * @param cacheName 主缓存名 + * 存 永久 Hash 缓存 * @param key 键 * @param field 字段名 * @param value 值 - * @param keyFlag 处理key - * @return + * @return boolean */ - private static boolean putEdenHash(String cacheName, String key, String field, Object value, boolean keyFlag) { - boolean ret = false; + public static boolean putHash(final String key, final String field, final Object value) { try { - // 自动处理 key - if(keyFlag){ - key = CacheUtil.handleKey(cacheName, key); - } + // 处理 key + String cacheKey = CacheUtil.handleKey(CacheType.EDEN_HASH, key); // 则统一转换为 JSONObject - JSONObject jsonObject = new JSONObject(); - jsonObject.put(JSON_KEY, value); - - // 存入EhCache - ehCachePlugin.put(CacheConstants.HOT_DATA, key+":"+field, jsonObject); + JSONObject cacheJson = new JSONObject(); + cacheJson.put(JSON_KEY, value); + +// // 是否存入本地缓存 +// if(isSaveLocal) { +// // 存入EhCache +// count++; +// boolean ehcacheRet = ehCachePlugin.put(CacheConstants.EHCACHE_SPACE, +// cacheKey + ":" + field, jsonObject); +// if(ehcacheRet){ +// count--; +// } +// } // 存入Redis - redisPlugin.hPut(key, field, jsonObject); - - ret = true; + return redisPlugin.hPut(cacheKey, field, cacheJson); }catch (Exception e){ log.error(e.getMessage(),e); } - return ret; + return false; } + + // ========================= DEL ========================= + + /** - * 存普通缓存 - * @param cacheName 主缓存名 + * 删缓存 * @param key 键 - * @param value 值 - * @param timeout 有效时间 - * @param timeFlag 是否开启时间 - * @param keyFlag 处理key - * @return + * @return boolean */ - private static boolean put(String cacheName, String key, Object value,Integer timeout, boolean timeFlag, boolean keyFlag) { - boolean ret = false; + public static boolean del(final String key) { try { - // 自动处理 key - if(keyFlag){ - key = CacheUtil.handleKey(cacheName, key); - } - - // 则统一转换为 JSONObject - JSONObject jsonObject = new JSONObject(); - jsonObject.put(JSON_KEY, value); - - // 存入EhCache - ehCachePlugin.put(CacheConstants.HOT_DATA, key, jsonObject); - - if(timeFlag){ + // 计数器 + int count = 4; + + // 删除key 集合 + List cacheKeys = Lists.newArrayListWithCapacity(2); + // 处理 key - 时控数据 + cacheKeys.add( + CacheUtil.handleKey(CacheType.TIMED, key)); + // 处理 key - 永久数据 + cacheKeys.add( + CacheUtil.handleKey(CacheType.TIMED, key)); + + // 循环删除缓存数据 + for (String cacheKey : cacheKeys) { + // 删除 EhCache + boolean ehcacheRet = ehCachePlugin.delete(CacheConstants.EHCACHE_SPACE, cacheKey); + if(ehcacheRet){ + count--; + } - // 如果缓存失效时间设置为空 则默认使用系统配置时间 - // 对于Redis缓存定位,为远程缓存同步库 当EhCache缓存失效时,Redis可以起到抗一波的作用 - // 所以,为了防止缓存雪崩 让Redis的失效时间 = EhCache热数据失效时间*1.2 ~ 2 倍之间随机 - if(timeout == null){ - timeout = RandomUtils.nextInt( - Double.valueOf(String.valueOf(ttlHotData * 1.2)).intValue(), - Double.valueOf(String.valueOf(ttlHotData * 2)).intValue()); + // 删除 Redis + boolean redisRet = redisPlugin.del(cacheKey); + if(redisRet){ + count--; } - // 存入Redis - redisPlugin.put(key, jsonObject, timeout); - }else { - // 存入Redis - redisPlugin.put(key, jsonObject); } - ret = true; + return count == 0; }catch (Exception e){ log.error(e.getMessage(),e); } - return ret; - } - - - // ========================= DEL - 删除 ========================= - - /** - * 删缓存 热点数据 - * - * Key 程序自处理 - * 比如:源Key opsli:hotData:ahdjksahjkd1 - * - * @param key 键 - * @return boolean - */ - public static boolean del(String key) { - return CacheUtil.del(CacheConstants.HOT_DATA, key, true); - } - - /** - * 删缓存 热点数据 - * - * Key 程序不处理 - * 比如:源Key opsli:hotData:ahdjksahjkd1 - * - * @param key 键 - * @return boolean - */ - public static boolean delByKeyOriginal(String key) { - return CacheUtil.del(CacheConstants.HOT_DATA, key, false); - } - - /** - * 删 永久Hash 缓存 - * - * Key 程序自处理 - * 比如:源Key opsli:hotData:ahdjksahjkd1 - * - * @param key 键 - * @param field 字段名 - * @return boolean - */ - public static boolean delEdenHash(String key, String field) { - return CacheUtil.delEdenHash(CacheConstants.EDEN_HASH_DATA, key, field, true); - } - - /** - * 删 永久Hash 缓存 - * - * Key 程序不处理 - * 比如:源Key opsli:hotData:ahdjksahjkd1 - * - * @param key 键 - * @param field 字段名 - * @return boolean - */ - public static boolean delEdenHashByKeyOriginal(String key, String field) { - return CacheUtil.delEdenHash(CacheConstants.EDEN_HASH_DATA, key, field, false); + return false; } /** - * 删 永久 Hash 缓存 - * @param cacheName 主缓存名 + * 删 Hash 缓存 * @param key 键 * @param field 字段名 - * @param keyFlag 是否处理Key * @return boolean */ - private static boolean delEdenHash(String cacheName, String key, String field, boolean keyFlag) { - boolean ret = false; + public static boolean delHash(final String key, final String field) { try { + // 计数器 + int count = 2; + // 自动处理 key - if(keyFlag){ - key = CacheUtil.handleKey(cacheName, key); + String cacheKey = CacheUtil.handleKey(CacheType.EDEN_HASH, key); + + // 删除 EhCache + boolean ehcacheRet = ehCachePlugin.delete(CacheConstants.EHCACHE_SPACE,cacheKey +":"+ field); + if(ehcacheRet){ + count--; } - // 删除 EhCache 不论是什么 本地都按照热数据处理 - ehCachePlugin.delete(CacheConstants.HOT_DATA,key+":"+field); + // 删除 Redis - Long hDeleteLong = redisPlugin.hDelete(key, field); + Long hDeleteLong = redisPlugin.hDelete(cacheKey, field); if(hDeleteLong != null && hDeleteLong > 0){ - ret = true; + count--; } - }catch (Exception e){ - log.error(e.getMessage(),e); - } - return ret; - } - /** - * 删缓存 - * @param cacheName 主缓存名 - * @param key 键 - * @param keyFlag 是否处理Key - * @return boolean - */ - private static boolean del(String cacheName, String key, boolean keyFlag) { - boolean ret = false; - try { - // 自动处理 key - if(keyFlag){ - key = CacheUtil.handleKey(cacheName, key); - } - // 删除 EhCache 不论是什么 本地都按照热数据处理 - ehCachePlugin.delete(CacheConstants.HOT_DATA,key); - // 删除 Redis - ret = redisPlugin.del(key); + return count == 0; }catch (Exception e){ log.error(e.getMessage(),e); } - return ret; + return false; } // ==================================================================== @@ -1018,15 +500,15 @@ public class CacheUtil { * @return boolean */ public static boolean putNilFlag(String key) { - boolean ret = false; try { + // 处理缓存 key + String cacheKey = CacheUtil.handleKey(NIL_FLAG_PREFIX + ":" + key); // 存入Redis - redisPlugin.put(NIL_FLAG_PREFIX + key, 1, 300); - ret = true; + return redisPlugin.put(cacheKey, 1, TTL_NIL_DATA_TIME); }catch (Exception e){ log.error(e.getMessage(),e); } - return ret; + return false; } /** @@ -1037,14 +519,15 @@ public class CacheUtil { * @return boolean */ public static boolean delNilFlag(String key) { - boolean ret = false; try { + // 处理缓存 key + String cacheKey = CacheUtil.handleKey(NIL_FLAG_PREFIX + ":" + key); // 删除Redis - ret = redisPlugin.del(NIL_FLAG_PREFIX + key); + return redisPlugin.del(cacheKey); }catch (Exception e){ log.error(e.getMessage(),e); } - return ret; + return false; } @@ -1057,9 +540,10 @@ public class CacheUtil { */ public static boolean hasNilFlag(String key) { try { + // 处理缓存 key + String cacheKey = CacheUtil.handleKey(NIL_FLAG_PREFIX + ":" + key); // 判断Redis 是否 包含当前Nil值 - Object o = redisPlugin.get(NIL_FLAG_PREFIX + key); - return o != null; + return redisPlugin.get(cacheKey) != null; }catch (Exception e){ log.error(e.getMessage(),e); } @@ -1069,20 +553,42 @@ public class CacheUtil { // ==================================================================== + /** + * 处理 key 默认为临时 + * @param key 缓存Key + * @return String + */ + public static String handleKey(String key){ + return CacheUtil.handleKey(CacheType.TIMED, key); + } + /** * 处理 key - * @param cacheName - * @param key - * @return + * @param cacheType 缓存类型 + * @param key 缓存Key + * @return String + */ + public static String handleKey(CacheType cacheType, String key){ + return PREFIX_NAME + cacheType.getName() + ":" + + key; + } + + /** + * 内部处理 普通 key + * @param key 缓存Key + * @param isEden 是否永久 + * @return String */ - public static String handleKey(String cacheName, String key){ - StringBuilder keyBuf = new StringBuilder(CacheDataAop.PREFIX_NAME); - keyBuf.append(cacheName).append(":"); - keyBuf.append(key); - return keyBuf.toString(); + private static String handleUsualKey(String key, boolean isEden){ + if(isEden){ + return CacheUtil.handleKey(CacheType.EDEN, key); + } + return CacheUtil.handleKey(CacheType.TIMED, key); } /** + * TODO 待优化 XML + * * 读配置文件 */ private static void readPropertyXML() throws IOException { @@ -1110,11 +616,7 @@ public class CacheUtil { Node ttlNode = expiryNodes.item(k); Node ttlValue = ttlNode.getFirstChild(); // 默认 60000秒 6小时 - String ttl = "60000"; - if(StringUtils.isNotEmpty(ttlValue.getNodeValue())){ - ttl = ttlValue.getNodeValue(); - } - ttlHotData = Integer.parseInt(ttl); + TTL_HOT_DATA_TIME = Convert.toInt(ttlValue.getNodeValue(), 60000); break; } } @@ -1139,4 +641,16 @@ public class CacheUtil { CacheUtil.ehCachePlugin = ehCachePlugin; } + /** + * 初始化 + * @param cacheProperties 缓存配置类 + */ + @Autowired + public void init(CacheProperties cacheProperties){ + if(cacheProperties != null){ + // 获得 超级管理员 + CacheUtil.PREFIX_NAME = Convert.toStr(cacheProperties.getPrefix(), "opsli") + ":"; + } + } + } diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/entity/CacheDataEntity.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/entity/CacheDataEntity.java index b2489310..c609cdc6 100644 --- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/entity/CacheDataEntity.java +++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/entity/CacheDataEntity.java @@ -36,15 +36,12 @@ public class CacheDataEntity { /** key */ private String key; - /** 数据类型 */ - private PushSubType type; - /** 缓存名称 */ private String cacheName; public static void main(String[] args) { - CacheDataEntity ret = new CacheDataEntity("123", PushSubType.EDEN_DATA, "12aaaa"); + CacheDataEntity ret = new CacheDataEntity("123", "12aaaa"); System.out.println(ToStringBuilder.reflectionToString(ret)); } } diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/enums/CacheType.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/enums/CacheHandleType.java similarity index 96% rename from opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/enums/CacheType.java rename to opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/enums/CacheHandleType.java index 77897b14..7950f45e 100644 --- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/enums/CacheType.java +++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/enums/CacheHandleType.java @@ -22,7 +22,7 @@ package org.opsli.core.cache.pushsub.enums; * @CreateTime: 2020-09-16 22:28 * @Description: 缓存操作类型 */ -public enum CacheType { +public enum CacheHandleType { /** 更新 */ UPDATE, diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/enums/MsgArgsType.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/enums/MsgArgsType.java index d71e50ba..cf32c919 100644 --- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/enums/MsgArgsType.java +++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/enums/MsgArgsType.java @@ -59,6 +59,8 @@ public enum MsgArgsType { /** 缓存数据Key */ CACHE_DATA_KEY, + /** 缓存数据Key */ + CACHE_DATA_NAME, /** 缓存数据Value */ CACHE_DATA_VALUE, /** 缓存数据Type */ diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/enums/PushSubType.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/enums/PushSubType.java index e5b128d6..208ce9b8 100644 --- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/enums/PushSubType.java +++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/enums/PushSubType.java @@ -42,9 +42,6 @@ public enum PushSubType { /** 热点数据 */ HOT_DATA, - /** 永久数据 */ - EDEN_DATA, - ; diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/handler/DictHandler.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/handler/DictHandler.java index a412675f..ba376352 100644 --- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/handler/DictHandler.java +++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/handler/DictHandler.java @@ -22,15 +22,15 @@ import lombok.extern.slf4j.Slf4j; import org.opsli.api.wrapper.system.dict.DictWrapper; import org.opsli.common.constants.CacheConstants; import org.opsli.common.constants.DictConstants; +import org.opsli.common.enums.CacheType; import org.opsli.core.cache.local.CacheUtil; -import org.opsli.core.cache.pushsub.enums.CacheType; +import org.opsli.core.cache.pushsub.enums.CacheHandleType; import org.opsli.core.cache.pushsub.enums.DictModelType; import org.opsli.core.cache.pushsub.enums.MsgArgsType; import org.opsli.core.cache.pushsub.enums.PushSubType; import org.opsli.plugins.cache.EhCachePlugin; import org.springframework.beans.factory.annotation.Autowired; -import java.util.Collection; import java.util.List; /** @@ -54,7 +54,7 @@ public class DictHandler implements RedisPushSubHandler{ @Override public void handler(JSONObject msgJson) { DictModelType dictModelType = DictModelType.valueOf((String) msgJson.get(MsgArgsType.DICT_MODEL_TYPE.toString())); - CacheType type = CacheType.valueOf((String) msgJson.get(MsgArgsType.DICT_TYPE.toString())); + CacheHandleType type = CacheHandleType.valueOf((String) msgJson.get(MsgArgsType.DICT_TYPE.toString())); if(DictModelType.COLLECTION == dictModelType){ Object dictListObj = msgJson.get(MsgArgsType.DICT_MODELS.toString()); @@ -81,29 +81,29 @@ public class DictHandler implements RedisPushSubHandler{ * @param dictWrapperModel * @param type */ - private void handler(DictWrapper dictWrapperModel, CacheType type){ + private void handler(DictWrapper dictWrapperModel, CacheHandleType type){ // 解析 key - String ehKeyByName = CacheUtil.handleKey(CacheConstants.EDEN_HASH_DATA, - DictConstants.CACHE_PREFIX_NAME + dictWrapperModel.getTypeCode() + ":" + dictWrapperModel.getDictName()); - String ehKeyByValue = CacheUtil.handleKey(CacheConstants.EDEN_HASH_DATA, - DictConstants.CACHE_PREFIX_VALUE + dictWrapperModel.getTypeCode() + ":" + dictWrapperModel.getDictValue()); + String ehKeyByName = CacheUtil.handleKey(CacheType.EDEN_HASH, DictConstants.CACHE_PREFIX_NAME + + dictWrapperModel.getTypeCode() + ":" + dictWrapperModel.getDictName()); + String ehKeyByValue = CacheUtil.handleKey(CacheType.EDEN_HASH, DictConstants.CACHE_PREFIX_VALUE + + dictWrapperModel.getTypeCode() + ":" + dictWrapperModel.getDictValue()); // 缓存更新 - if(CacheType.UPDATE == type){ - ehCachePlugin.delete(CacheConstants.HOT_DATA, ehKeyByName); - ehCachePlugin.delete(CacheConstants.HOT_DATA, ehKeyByValue); + if(CacheHandleType.UPDATE == type){ + ehCachePlugin.delete(CacheConstants.EHCACHE_SPACE, ehKeyByName); + ehCachePlugin.delete(CacheConstants.EHCACHE_SPACE, ehKeyByValue); // 统一转换为 JSONObject String jsonStr = JSONObject.toJSONString(dictWrapperModel.getModel()); JSONObject value = JSONObject.parseObject(jsonStr); - ehCachePlugin.put(CacheConstants.HOT_DATA, ehKeyByName, value); - ehCachePlugin.put(CacheConstants.HOT_DATA, ehKeyByValue, value); + ehCachePlugin.put(CacheConstants.EHCACHE_SPACE, ehKeyByName, value); + ehCachePlugin.put(CacheConstants.EHCACHE_SPACE, ehKeyByValue, value); } // 缓存删除 - else if(CacheType.DELETE == type){ - ehCachePlugin.delete(CacheConstants.HOT_DATA, ehKeyByName); - ehCachePlugin.delete(CacheConstants.HOT_DATA, ehKeyByValue); + else if(CacheHandleType.DELETE == type){ + ehCachePlugin.delete(CacheConstants.EHCACHE_SPACE, ehKeyByName); + ehCachePlugin.delete(CacheConstants.EHCACHE_SPACE, ehKeyByValue); } } diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/handler/EdenDataHandler.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/handler/EdenDataHandler.java deleted file mode 100644 index be2c09f5..00000000 --- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/handler/EdenDataHandler.java +++ /dev/null @@ -1,67 +0,0 @@ -/** - * Copyright 2020 OPSLI 快速开发平台 https://www.opsli.com - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.opsli.core.cache.pushsub.handler; - -import com.alibaba.fastjson.JSONObject; -import lombok.extern.slf4j.Slf4j; -import org.opsli.common.constants.CacheConstants; -import org.opsli.common.constants.DictConstants; -import org.opsli.core.cache.local.CacheUtil; -import org.opsli.core.cache.pushsub.enums.CacheType; -import org.opsli.core.cache.pushsub.enums.MsgArgsType; -import org.opsli.core.cache.pushsub.enums.PushSubType; -import org.opsli.plugins.cache.EhCachePlugin; -import org.springframework.beans.factory.annotation.Autowired; - -/** - * @BelongsProject: opsli-boot - * @BelongsPackage: org.opsli.core.cache.pushsub.handler - * @Author: Parker - * @CreateTime: 2020-09-15 16:24 - * @Description: 永久数据处理 - */ -@Slf4j -public class EdenDataHandler implements RedisPushSubHandler{ - - @Autowired - private EhCachePlugin ehCachePlugin; - - @Override - public PushSubType getType() { - return PushSubType.EDEN_DATA; - } - - @Override - public void handler(JSONObject msgJson) { - String key = (String) msgJson.get(MsgArgsType.CACHE_DATA_KEY.toString()); - Object value = msgJson.get(MsgArgsType.CACHE_DATA_VALUE.toString()); - CacheType type = CacheType.valueOf((String )msgJson.get(MsgArgsType.CACHE_DATA_TYPE.toString())); - - // 解析 key - String handleKey = CacheUtil.handleKey(CacheConstants.EDEN_DATA,key); - - // 缓存更新 - if(CacheType.UPDATE == type){ - ehCachePlugin.put(CacheConstants.HOT_DATA, handleKey, value); - } - // 缓存删除 - else if(CacheType.DELETE == type){ - ehCachePlugin.delete(CacheConstants.HOT_DATA, handleKey); - } - - } - -} diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/handler/HotDataHandler.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/handler/HotDataHandler.java index 4e40090f..a40a8239 100644 --- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/handler/HotDataHandler.java +++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/handler/HotDataHandler.java @@ -18,8 +18,7 @@ package org.opsli.core.cache.pushsub.handler; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import org.opsli.common.constants.CacheConstants; -import org.opsli.core.cache.local.CacheUtil; -import org.opsli.core.cache.pushsub.enums.CacheType; +import org.opsli.core.cache.pushsub.enums.CacheHandleType; import org.opsli.core.cache.pushsub.enums.MsgArgsType; import org.opsli.core.cache.pushsub.enums.PushSubType; import org.opsli.plugins.cache.EhCachePlugin; @@ -46,18 +45,16 @@ public class HotDataHandler implements RedisPushSubHandler{ @Override public void handler(JSONObject msgJson) { String key = (String) msgJson.get(MsgArgsType.CACHE_DATA_KEY.toString()); + String cacheName = (String) msgJson.get(MsgArgsType.CACHE_DATA_NAME.toString()); Object value = msgJson.get(MsgArgsType.CACHE_DATA_VALUE.toString()); - CacheType type = CacheType.valueOf((String )msgJson.get(MsgArgsType.CACHE_DATA_TYPE.toString())); + CacheHandleType type = CacheHandleType.valueOf((String )msgJson.get(MsgArgsType.CACHE_DATA_TYPE.toString())); - // 解析 key - String handleKey = CacheUtil.handleKey(CacheConstants.HOT_DATA, key); - - if(CacheType.UPDATE == type){ - ehCachePlugin.put(CacheConstants.HOT_DATA, handleKey, value); + if(CacheHandleType.UPDATE == type){ + ehCachePlugin.put(CacheConstants.EHCACHE_SPACE, cacheName, value); } // 缓存删除 - else if(CacheType.DELETE == type){ - ehCachePlugin.delete(CacheConstants.HOT_DATA, handleKey); + else if(CacheHandleType.DELETE == type){ + ehCachePlugin.delete(CacheConstants.EHCACHE_SPACE, cacheName); } } diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/handler/MenuHandler.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/handler/MenuHandler.java index 92e247a1..9c98b62e 100644 --- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/handler/MenuHandler.java +++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/handler/MenuHandler.java @@ -67,10 +67,10 @@ public class MenuHandler implements RedisPushSubHandler{ return; } + String cacheKey = CacheUtil.handleKey(MenuUtil.PREFIX_CODE + menuCode); + // 先删除 - ehCachePlugin.delete(CacheConstants.HOT_DATA, MenuUtil.PREFIX_CODE + menuCode); - // 清除空拦截 - CacheUtil.delNilFlag(MenuUtil.PREFIX_CODE + menuCode); + ehCachePlugin.delete(CacheConstants.EHCACHE_SPACE, cacheKey); } diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/handler/OrgHandler.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/handler/OrgHandler.java index 39435d4f..6835f763 100644 --- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/handler/OrgHandler.java +++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/handler/OrgHandler.java @@ -22,7 +22,6 @@ import org.opsli.common.constants.CacheConstants; import org.opsli.core.cache.local.CacheUtil; import org.opsli.core.cache.pushsub.enums.MsgArgsType; import org.opsli.core.cache.pushsub.enums.PushSubType; -import org.opsli.core.utils.MenuUtil; import org.opsli.core.utils.OrgUtil; import org.opsli.plugins.cache.EhCachePlugin; import org.springframework.beans.factory.annotation.Autowired; @@ -68,10 +67,10 @@ public class OrgHandler implements RedisPushSubHandler{ return; } + String cacheKey = CacheUtil.handleKey(OrgUtil.PREFIX_CODE + userId); + // 先删除 - ehCachePlugin.delete(CacheConstants.HOT_DATA, OrgUtil.PREFIX_CODE + userId); - // 清除空拦截 - CacheUtil.delNilFlag(OrgUtil.PREFIX_CODE + userId); + ehCachePlugin.delete(CacheConstants.EHCACHE_SPACE, cacheKey); } diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/handler/TenantHandler.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/handler/TenantHandler.java index 2211eb66..404c8d41 100644 --- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/handler/TenantHandler.java +++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/handler/TenantHandler.java @@ -22,7 +22,6 @@ import org.opsli.common.constants.CacheConstants; import org.opsli.core.cache.local.CacheUtil; import org.opsli.core.cache.pushsub.enums.MsgArgsType; import org.opsli.core.cache.pushsub.enums.PushSubType; -import org.opsli.core.utils.OrgUtil; import org.opsli.core.utils.TenantUtil; import org.opsli.plugins.cache.EhCachePlugin; import org.springframework.beans.factory.annotation.Autowired; @@ -68,10 +67,10 @@ public class TenantHandler implements RedisPushSubHandler{ return; } + String cacheKey = CacheUtil.handleKey(TenantUtil.PREFIX_CODE + tenantId); + // 先删除 - ehCachePlugin.delete(CacheConstants.HOT_DATA, TenantUtil.PREFIX_CODE + tenantId); - // 清除空拦截 - CacheUtil.delNilFlag(TenantUtil.PREFIX_CODE + tenantId); + ehCachePlugin.delete(CacheConstants.EHCACHE_SPACE, cacheKey); } diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/handler/UserHandler.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/handler/UserHandler.java index 9cc07128..06279f03 100644 --- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/handler/UserHandler.java +++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/handler/UserHandler.java @@ -88,12 +88,12 @@ public class UserHandler implements RedisPushSubHandler{ return; } + String cacheKeyById = CacheUtil.handleKey(UserUtil.PREFIX_ID + userId); + String cacheKeyByName = CacheUtil.handleKey(UserUtil.PREFIX_USERNAME + username); + // 先删除 - ehCachePlugin.delete(CacheConstants.HOT_DATA, UserUtil.PREFIX_ID + userId); - ehCachePlugin.delete(CacheConstants.HOT_DATA, UserUtil.PREFIX_USERNAME + username); - // 清除空拦截 - CacheUtil.delNilFlag(UserUtil.PREFIX_ID + userId); - CacheUtil.delNilFlag(UserUtil.PREFIX_USERNAME + username); + ehCachePlugin.delete(CacheConstants.EHCACHE_SPACE, cacheKeyById); + ehCachePlugin.delete(CacheConstants.EHCACHE_SPACE, cacheKeyByName); } /** @@ -113,10 +113,10 @@ public class UserHandler implements RedisPushSubHandler{ return; } + String cacheKey = CacheUtil.handleKey(UserUtil.PREFIX_ID_ROLES + userId); + // 先删除 - ehCachePlugin.delete(CacheConstants.HOT_DATA, UserUtil.PREFIX_ID_ROLES + userId); - // 清除空拦截 - CacheUtil.delNilFlag(UserUtil.PREFIX_ID_ROLES + userId); + ehCachePlugin.delete(CacheConstants.EHCACHE_SPACE, cacheKey); } /** @@ -136,10 +136,10 @@ public class UserHandler implements RedisPushSubHandler{ return; } + String cacheKey = CacheUtil.handleKey(UserUtil.PREFIX_ID_PERMISSIONS + userId); + // 先删除 - ehCachePlugin.delete(CacheConstants.HOT_DATA, UserUtil.PREFIX_ID_PERMISSIONS + userId); - // 清除空拦截 - CacheUtil.delNilFlag(UserUtil.PREFIX_ID_PERMISSIONS + userId); + ehCachePlugin.delete(CacheConstants.EHCACHE_SPACE, cacheKey); } /** @@ -159,10 +159,10 @@ public class UserHandler implements RedisPushSubHandler{ return; } + String cacheKey = CacheUtil.handleKey(UserUtil.PREFIX_ID_MENUS + userId); + // 先删除 - ehCachePlugin.delete(CacheConstants.HOT_DATA, UserUtil.PREFIX_ID_MENUS + userId); - // 清除空拦截 - CacheUtil.delNilFlag(UserUtil.PREFIX_ID_MENUS + userId); + ehCachePlugin.delete(CacheConstants.EHCACHE_SPACE, cacheKey); } diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/msgs/CacheDataMsgFactory.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/msgs/CacheDataMsgFactory.java index cbabe304..9cb82ed3 100644 --- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/msgs/CacheDataMsgFactory.java +++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/msgs/CacheDataMsgFactory.java @@ -18,7 +18,8 @@ package org.opsli.core.cache.pushsub.msgs; import com.alibaba.fastjson.JSONObject; import lombok.Data; import lombok.experimental.Accessors; -import org.opsli.core.cache.pushsub.enums.CacheType; +import org.opsli.core.cache.pushsub.entity.CacheDataEntity; +import org.opsli.core.cache.pushsub.enums.CacheHandleType; import org.opsli.core.cache.pushsub.enums.MsgArgsType; import org.opsli.core.cache.pushsub.enums.PushSubType; import org.opsli.core.cache.pushsub.receiver.RedisPushSubReceiver; @@ -37,23 +38,24 @@ import org.opsli.plugins.redis.pushsub.entity.BaseSubMessage; public final class CacheDataMsgFactory extends BaseSubMessage{ /** 通道 */ - private static final String CHANNEL = RedisPushSubReceiver.BASE_CHANNEL+RedisPushSubReceiver.CHANNEL; + private static final String CHANNEL = RedisPushSubReceiver.BASE_CHANNEL + RedisPushSubReceiver.CHANNEL; private CacheDataMsgFactory(){} /** * 构建消息 */ - public static BaseSubMessage createMsg(PushSubType py,String key, Object value, CacheType cacheType){ + public static BaseSubMessage createMsg(CacheDataEntity cacheDataEntity, Object value, CacheHandleType cacheHandleType){ BaseSubMessage baseSubMessage = new BaseSubMessage(); // 数据 JSONObject jsonObj = new JSONObject(); - jsonObj.put(MsgArgsType.CACHE_DATA_KEY.toString(),key); + jsonObj.put(MsgArgsType.CACHE_DATA_KEY.toString(),cacheDataEntity.getKey()); + jsonObj.put(MsgArgsType.CACHE_DATA_NAME.toString(),cacheDataEntity.getCacheName()); jsonObj.put(MsgArgsType.CACHE_DATA_VALUE.toString(),value); - jsonObj.put(MsgArgsType.CACHE_DATA_TYPE.toString(),cacheType.toString()); + jsonObj.put(MsgArgsType.CACHE_DATA_TYPE.toString(), cacheHandleType.toString()); // 热点数据 - 系统数据 - baseSubMessage.build(CHANNEL,py.toString(),jsonObj); + baseSubMessage.build(CHANNEL,PushSubType.HOT_DATA.toString(),jsonObj); return baseSubMessage; } diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/msgs/DictMsgFactory.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/msgs/DictMsgFactory.java index 82f42d60..9626d4f7 100644 --- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/msgs/DictMsgFactory.java +++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/pushsub/msgs/DictMsgFactory.java @@ -19,7 +19,7 @@ import com.alibaba.fastjson.JSONObject; import lombok.Data; import lombok.experimental.Accessors; import org.opsli.api.wrapper.system.dict.DictWrapper; -import org.opsli.core.cache.pushsub.enums.CacheType; +import org.opsli.core.cache.pushsub.enums.CacheHandleType; import org.opsli.core.cache.pushsub.enums.DictModelType; import org.opsli.core.cache.pushsub.enums.MsgArgsType; import org.opsli.core.cache.pushsub.enums.PushSubType; @@ -48,13 +48,13 @@ public final class DictMsgFactory extends BaseSubMessage{ /** * 构建消息 */ - public static BaseSubMessage createMsg(DictWrapper dictWrapperModel, CacheType cacheType){ + public static BaseSubMessage createMsg(DictWrapper dictWrapperModel, CacheHandleType cacheHandleType){ BaseSubMessage baseSubMessage = new BaseSubMessage(); // 数据 JSONObject jsonObj = new JSONObject(); jsonObj.put(MsgArgsType.DICT_MODEL.toString(), dictWrapperModel); jsonObj.put(MsgArgsType.DICT_MODEL_TYPE.toString(), DictModelType.OBJECT); - jsonObj.put(MsgArgsType.DICT_TYPE.toString(),cacheType.toString()); + jsonObj.put(MsgArgsType.DICT_TYPE.toString(), cacheHandleType.toString()); // DICT 字典 baseSubMessage.build(CHANNEL,PushSubType.DICT.toString(),jsonObj); @@ -64,13 +64,13 @@ public final class DictMsgFactory extends BaseSubMessage{ /** * 构建消息 */ - public static BaseSubMessage createMsg(List dictWrapperModels, CacheType cacheType){ + public static BaseSubMessage createMsg(List dictWrapperModels, CacheHandleType cacheHandleType){ BaseSubMessage baseSubMessage = new BaseSubMessage(); // 数据 JSONObject jsonObj = new JSONObject(); jsonObj.put(MsgArgsType.DICT_MODELS.toString(), dictWrapperModels); jsonObj.put(MsgArgsType.DICT_MODEL_TYPE.toString(), DictModelType.COLLECTION); - jsonObj.put(MsgArgsType.DICT_TYPE.toString(),cacheType.toString()); + jsonObj.put(MsgArgsType.DICT_TYPE.toString(), cacheHandleType.toString()); // DICT 字典 baseSubMessage.build(CHANNEL,PushSubType.DICT.toString(),jsonObj); diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/aspect/CacheDataAop.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/aspect/CacheDataAop.java index 5e3df860..2598b223 100644 --- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/aspect/CacheDataAop.java +++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/aspect/CacheDataAop.java @@ -16,6 +16,7 @@ package org.opsli.core.filters.aspect; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; @@ -27,12 +28,9 @@ import org.opsli.api.base.warpper.ApiWrapper; import org.opsli.common.annotation.hotdata.EnableHotData; import org.opsli.common.annotation.hotdata.HotDataDel; import org.opsli.common.annotation.hotdata.HotDataPut; -import org.opsli.common.constants.CacheConstants; -import org.opsli.common.utils.Props; import org.opsli.core.cache.local.CacheUtil; import org.opsli.core.cache.pushsub.entity.CacheDataEntity; -import org.opsli.core.cache.pushsub.enums.CacheType; -import org.opsli.core.cache.pushsub.enums.PushSubType; +import org.opsli.core.cache.pushsub.enums.CacheHandleType; import org.opsli.core.cache.pushsub.msgs.CacheDataMsgFactory; import org.opsli.plugins.redis.RedisPlugin; import org.springframework.beans.factory.annotation.Autowired; @@ -58,15 +56,6 @@ import static org.opsli.common.constants.OrderConstants.HOT_DATA_ORDER; @Component public class CacheDataAop { - /** 热点数据前缀 */ - public static final String PREFIX_NAME; - static{ - // 缓存前缀 - Props props = new Props("application.yaml"); - PREFIX_NAME = props.getStr("spring.cache-conf.prefix",CacheConstants.PREFIX_NAME) + ":"; - } - - @Autowired private RedisPlugin redisPlugin; @@ -94,7 +83,9 @@ public class CacheDataAop { return returnValue; } - List cacheDataEntityList = this.putHandlerData(point, returnValue); + String simpleName = point.getTarget().getClass().getSimpleName(); + + List cacheDataEntityList = this.putHandlerData(point, returnValue, simpleName); // 非法判断 if(CollUtil.isEmpty(cacheDataEntityList)){ return returnValue; @@ -103,18 +94,12 @@ public class CacheDataAop { for (CacheDataEntity cacheDataEntity : cacheDataEntityList) { // 更新缓存数据 // 热点数据 - if(CacheConstants.HOT_DATA.equals(cacheDataEntity.getCacheName())){ - CacheUtil.putByKeyOriginal(cacheDataEntity.getKey(), returnValue); - } - // 永久数据 - else if(CacheConstants.EDEN_DATA.equals(cacheDataEntity.getCacheName())) { - CacheUtil.putEdenByKeyOriginal(cacheDataEntity.getKey(), returnValue); - } + CacheUtil.put(cacheDataEntity.getKey(), returnValue); // 广播缓存数据 - 通知其他服务器同步数据 redisPlugin.sendMessage( - CacheDataMsgFactory.createMsg(cacheDataEntity.getType(), - cacheDataEntity.getKey(), returnValue, CacheType.UPDATE) + CacheDataMsgFactory.createMsg( + cacheDataEntity, returnValue, CacheHandleType.UPDATE) ); } @@ -138,6 +123,8 @@ public class CacheDataAop { return returnValue; } + String simpleName = point.getTarget().getClass().getSimpleName(); + // 删除状态判断 try { Boolean ret = (Boolean) returnValue; @@ -149,7 +136,7 @@ public class CacheDataAop { return returnValue; } - List cacheDataEntityList = this.delHandlerData(point, args); + List cacheDataEntityList = this.delHandlerData(point, args, simpleName); // 非法判断 if(CollUtil.isEmpty(cacheDataEntityList)){ return returnValue; @@ -161,8 +148,8 @@ public class CacheDataAop { // 广播缓存数据 - 通知其他服务器同步数据 redisPlugin.sendMessage( - CacheDataMsgFactory.createMsg(cacheDataEntity.getType(), - cacheDataEntity.getKey(), returnValue, CacheType.DELETE) + CacheDataMsgFactory.createMsg( + cacheDataEntity, returnValue, CacheHandleType.DELETE) ); } @@ -177,7 +164,7 @@ public class CacheDataAop { * PUT 处理数据 * @param point */ - private List putHandlerData(ProceedingJoinPoint point, Object returnValue){ + private List putHandlerData(ProceedingJoinPoint point, Object returnValue, String simpleName){ // 这里 只对 继承了 ApiWrapper 的类做处理 if(!(returnValue instanceof ApiWrapper)){ return null; @@ -195,24 +182,15 @@ public class CacheDataAop { } // 获取注解参数 - HotDataPut aCache= objMethod.getAnnotation(HotDataPut.class); + HotDataPut aCache = objMethod.getAnnotation(HotDataPut.class); if(aCache != null){ - // 获得缓存类型 - PushSubType type = this.judgeCacheType(aCache.name()); - if(type == null) { - // 如果都不是 则直接退出 不走缓存 - return null; - } - // key 前缀 - StringBuilder keyBuf = this.judgeCacheKeyBuf(aCache.name()); - // 这里 只对 继承了 BaseEntity 的类做处理 ApiWrapper apiWrapper = (ApiWrapper) returnValue; - // key 存储ID - String key = keyBuf.append(apiWrapper.getId()).toString(); + // 热数据 前缀增加 方法类名称 减小ID 冲撞 + String cacheKey = CacheUtil.handleKey(simpleName +":"+ apiWrapper.getId()); - CacheDataEntity ret = new CacheDataEntity(key, type ,aCache.name()); + CacheDataEntity ret = new CacheDataEntity(apiWrapper.getId() , cacheKey); // 存放数据 this.putCacheData(cacheDataEntities, ret); @@ -229,7 +207,7 @@ public class CacheDataAop { * DEL 处理数据 * @param point */ - private List delHandlerData(ProceedingJoinPoint point, Object[] args){ + private List delHandlerData(ProceedingJoinPoint point, Object[] args, String simpleName){ if(args == null || args.length == 0){ return null; } @@ -248,54 +226,41 @@ public class CacheDataAop { // 获取注解参数 HotDataDel aCache= objMethod.getAnnotation(HotDataDel.class); if(aCache != null){ - // 获得缓存类型 - PushSubType type = this.judgeCacheType(aCache.name()); - if(type == null) { - // 如果都不是 则直接退出 不走缓存 - return null; - } - // key 前缀 - StringBuilder keyBuf = this.judgeCacheKeyBuf(aCache.name()); + + List keyList = null; // 处理数据 for (Object arg : args) { - if (arg instanceof String) { - // key 存储ID - String key = keyBuf.toString() + arg; - CacheDataEntity ret = new CacheDataEntity(key, type ,aCache.name()); - // 存放数据 - this.putCacheData(cacheDataEntities, ret); - } else if (arg instanceof String[]) { - String[] ids = (String[]) arg; - for (String id : ids) { - // key 存储ID - String key = keyBuf.toString() + id; - CacheDataEntity ret = new CacheDataEntity(key, type ,aCache.name()); - // 存放数据 - this.putCacheData(cacheDataEntities, ret); - } - } else if (arg instanceof ApiWrapper) { + if (arg instanceof ApiWrapper) { // key 存储ID - ApiWrapper apiWrapper = (ApiWrapper) arg; - String key = keyBuf.toString() + apiWrapper.getId(); - CacheDataEntity ret = new CacheDataEntity(key, type ,aCache.name()); - // 存放数据 - this.putCacheData(cacheDataEntities, ret); + ApiWrapper apiWrapper = Convert.convert(ApiWrapper.class, arg); + keyList = Convert.toList(String.class, apiWrapper.getId()); } else if (arg instanceof Collection) { try { - Collection baseEntityList = (Collection) arg; + keyList = Lists.newArrayList(); + List baseEntityList = Convert.toList(ApiWrapper.class, arg); for (ApiWrapper baseEntity : baseEntityList) { - // key 存储ID - String key = keyBuf.toString() + baseEntity.getId(); - CacheDataEntity ret = new CacheDataEntity(key, type ,aCache.name()); - // 存放数据 - this.putCacheData(cacheDataEntities, ret); + keyList.add(baseEntity.getId()); } }catch (Exception e){ log.error(e.getMessage(),e); } + }else { + keyList = Convert.toList(String.class, arg); } } + + + if(keyList != null && CollUtil.isNotEmpty(keyList)){ + for (String key : keyList) { + // 热数据 前缀增加 方法类名称 减小ID 冲撞 + String cacheKey = CacheUtil.handleKey(simpleName +":"+ key); + CacheDataEntity ret = new CacheDataEntity(key , cacheKey); + // 存放数据 + this.putCacheData(cacheDataEntities, ret); + } + } + return cacheDataEntities; } }catch (Exception e){ @@ -336,41 +301,5 @@ public class CacheDataAop { cacheDataList.add(cacheData); } - /** - * 判断缓存Key - * @param cacheName - * @return - */ - private StringBuilder judgeCacheKeyBuf(String cacheName){ - // key 前缀 - StringBuilder keyBuf = new StringBuilder(PREFIX_NAME); - // 热点数据 - if(CacheConstants.HOT_DATA.equals(cacheName)){ - keyBuf.append(CacheConstants.HOT_DATA).append(":"); - } - // 系统数据 - else if(CacheConstants.EDEN_DATA.equals(cacheName)){ - keyBuf.append(CacheConstants.EDEN_DATA).append(":"); - } - return keyBuf; - } - - /** - * 判断缓存类型 - * @param cacheName - * @return - */ - private PushSubType judgeCacheType(String cacheName){ - PushSubType type = null; - // 热点数据 - if(CacheConstants.HOT_DATA.equals(cacheName)){ - type = PushSubType.HOT_DATA; - } - // 系统数据 - else if(CacheConstants.EDEN_DATA.equals(cacheName)){ - type = PushSubType.EDEN_DATA; - } - return type; - } } diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/CaptchaUtil.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/CaptchaUtil.java index 392e38c1..e57a48c7 100644 --- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/CaptchaUtil.java +++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/CaptchaUtil.java @@ -20,6 +20,7 @@ import org.apache.commons.lang3.StringUtils; import org.opsli.common.constants.CacheConstants; import org.opsli.common.exception.TokenException; import org.opsli.common.utils.Props; +import org.opsli.core.cache.local.CacheUtil; import org.opsli.core.msg.TokenMsg; import org.opsli.plugins.redis.RedisPlugin; import org.springframework.beans.factory.annotation.Autowired; @@ -50,18 +51,11 @@ public class CaptchaUtil{ private static RedisPlugin redisPlugin; /** 谷歌验证码 */ private static Producer producer; - /** 热点数据前缀 */ - public static final String PREFIX_NAME; - static{ - // 缓存前缀 - Props props = new Props("application.yaml"); - PREFIX_NAME = props.getStr("spring.cache-conf.prefix", CacheConstants.PREFIX_NAME) + ":"; - } /** * 获得验证码 - * @param uuid - * @return + * @param uuid UUID + * @return BufferedImage */ public static BufferedImage getCaptcha(String uuid) { if(StringUtils.isBlank(uuid)){ @@ -71,7 +65,7 @@ public class CaptchaUtil{ //生成文字验证码 String code = producer.createText(); - boolean ret = redisPlugin.put(PREFIX_NAME + PREFIX + uuid, code, TIME_OUT); + boolean ret = redisPlugin.put(CacheUtil.PREFIX_NAME + PREFIX + uuid, code, TIME_OUT); if(ret){ return producer.createImage(code); @@ -81,9 +75,8 @@ public class CaptchaUtil{ /** * 校验验证码 - * @param uuid - * @param code - * @return + * @param uuid UUID + * @param code CODE */ public static void validate(String uuid, String code) { // 判断UUID 是否为空 @@ -97,7 +90,7 @@ public class CaptchaUtil{ } // 验证码 - String codeTemp = (String) redisPlugin.get(PREFIX_NAME + PREFIX + uuid); + String codeTemp = (String) redisPlugin.get(CacheUtil.PREFIX_NAME + PREFIX + uuid); if(StringUtils.isEmpty(codeTemp)){ throw new TokenException(TokenMsg.EXCEPTION_CAPTCHA_NULL); } @@ -112,8 +105,8 @@ public class CaptchaUtil{ /** * 删除验证码 - * @param uuid - * @return + * @param uuid UUID + * @return boolean */ public static boolean delCaptcha(String uuid) { if(StringUtils.isEmpty(uuid)){ @@ -121,7 +114,7 @@ public class CaptchaUtil{ } //删除验证码 - return redisPlugin.del(PREFIX_NAME + PREFIX + uuid); + return redisPlugin.del(CacheUtil.PREFIX_NAME + PREFIX + uuid); } diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/DictUtil.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/DictUtil.java index 8cac4b11..1181a3ee 100644 --- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/DictUtil.java +++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/DictUtil.java @@ -27,6 +27,7 @@ import org.opsli.api.wrapper.system.dict.DictDetailModel; import org.opsli.api.wrapper.system.dict.DictWrapper; import org.opsli.common.constants.CacheConstants; import org.opsli.common.constants.DictConstants; +import org.opsli.common.enums.CacheType; import org.opsli.core.cache.local.CacheUtil; import org.opsli.plugins.redis.RedisLockPlugins; import org.opsli.plugins.redis.RedisPlugin; @@ -75,8 +76,8 @@ public class DictUtil { public static String getDictNameByValue(String typeCode, String dictValue, String defaultVal){ String dictName = ""; - DictDetailModel cacheModel = CacheUtil.getHash(DictConstants.CACHE_PREFIX_VALUE + typeCode, - dictValue, DictDetailModel.class); + DictDetailModel cacheModel = CacheUtil.getHash(DictDetailModel.class, DictConstants.CACHE_PREFIX_VALUE + typeCode, + dictValue); if (cacheModel != null){ dictName = cacheModel.getDictName(); } @@ -108,8 +109,8 @@ public class DictUtil { } // 如果获得锁 则 再次检查缓存里有没有, 如果有则直接退出, 没有的话才发起数据库请求 - cacheModel = CacheUtil.getHash(DictConstants.CACHE_PREFIX_VALUE + typeCode, - dictValue, DictDetailModel.class); + cacheModel = CacheUtil.getHash(DictDetailModel.class, DictConstants.CACHE_PREFIX_VALUE + typeCode, + dictValue); if (cacheModel != null){ dictName = cacheModel.getDictName(); } @@ -165,8 +166,8 @@ public class DictUtil { public static String getDictValueByName(String typeCode, String dictName, String defaultVal){ String dictValue = ""; - DictDetailModel cacheModel = CacheUtil.getHash(DictConstants.CACHE_PREFIX_NAME + typeCode, - dictName, DictDetailModel.class); + DictDetailModel cacheModel = CacheUtil.getHash(DictDetailModel.class, DictConstants.CACHE_PREFIX_NAME + typeCode, + dictName); if (cacheModel != null){ dictValue = cacheModel.getDictValue(); } @@ -195,8 +196,8 @@ public class DictUtil { } // 如果获得锁 则 再次检查缓存里有没有, 如果有则直接退出, 没有的话才发起数据库请求 - cacheModel = CacheUtil.getHash(DictConstants.CACHE_PREFIX_NAME + typeCode, - dictName, DictDetailModel.class); + cacheModel = CacheUtil.getHash(DictDetailModel.class, DictConstants.CACHE_PREFIX_NAME + typeCode, + dictName); if (cacheModel != null){ dictValue = cacheModel.getDictValue(); } @@ -251,7 +252,7 @@ public class DictUtil { public static List getDictList(String typeCode){ List dictWrapperModels = Lists.newArrayList(); try { - String key = CacheUtil.handleKey(CacheConstants.EDEN_HASH_DATA, DictConstants.CACHE_PREFIX_VALUE + typeCode); + String key = CacheUtil.handleKey(CacheType.EDEN_HASH, DictConstants.CACHE_PREFIX_VALUE + typeCode); Map dictMap = redisPlugin.hGetAll(key); Set> entries = dictMap.entrySet(); for (Map.Entry entry : entries) { @@ -297,7 +298,7 @@ public class DictUtil { } // 如果获得锁 则 再次检查缓存里有没有, 如果有则直接退出, 没有的话才发起数据库请求 - key = CacheUtil.handleKey(CacheConstants.EDEN_HASH_DATA, DictConstants.CACHE_PREFIX_VALUE + typeCode); + key = CacheUtil.handleKey(CacheType.EDEN_HASH, DictConstants.CACHE_PREFIX_VALUE + typeCode); dictMap = redisPlugin.hGetAll(key); entries = dictMap.entrySet(); for (Map.Entry entry : entries) { @@ -315,6 +316,7 @@ public class DictUtil { dictWrapperModel.setTypeCode(typeCode); dictWrapperModel.setDictName(model.getDictName()); dictWrapperModel.setDictValue(model.getDictValue()); + dictWrapperModel.setModel(model); dictWrapperModels.add(dictWrapperModel); } if(!dictWrapperModels.isEmpty()){ @@ -397,9 +399,9 @@ public class DictUtil { // 清除缓存 DictUtil.del(model); - CacheUtil.putEdenHash(DictConstants.CACHE_PREFIX_NAME + model.getTypeCode(), + CacheUtil.putHash(DictConstants.CACHE_PREFIX_NAME + model.getTypeCode(), model.getDictName(), model.getModel()); - CacheUtil.putEdenHash(DictConstants.CACHE_PREFIX_VALUE + model.getTypeCode(), + CacheUtil.putHash(DictConstants.CACHE_PREFIX_VALUE + model.getTypeCode(), model.getDictValue(), model.getModel()); } @@ -418,12 +420,12 @@ public class DictUtil { boolean hasNilFlagByValue = CacheUtil.hasNilFlag(DictConstants.CACHE_PREFIX_VALUE + model.getTypeCode() + ":" + model.getDictValue()); - DictWrapper dictByName = CacheUtil.getHash(DictConstants.CACHE_PREFIX_NAME + model.getTypeCode(), - model.getDictName(), - DictWrapper.class); - DictWrapper dictByValue = CacheUtil.getHash(DictConstants.CACHE_PREFIX_VALUE + model.getTypeCode(), - model.getDictValue(), - DictWrapper.class); + DictWrapper dictByName = CacheUtil.getHash(DictWrapper.class, + DictConstants.CACHE_PREFIX_NAME + model.getTypeCode(), + model.getDictName()); + DictWrapper dictByValue = CacheUtil.getHash(DictWrapper.class, + DictConstants.CACHE_PREFIX_VALUE + model.getTypeCode(), + model.getDictValue()); // 计数器 int count = 0; @@ -450,7 +452,7 @@ public class DictUtil { if (dictByName != null){ count++; // 清除空拦截 - boolean tmp = CacheUtil.delEdenHash(DictConstants.CACHE_PREFIX_NAME + + boolean tmp = CacheUtil.delHash(DictConstants.CACHE_PREFIX_NAME + model.getTypeCode(), model.getDictName()); if(tmp){ count--; @@ -460,7 +462,7 @@ public class DictUtil { if (dictByValue != null){ count++; // 清除空拦截 - boolean tmp = CacheUtil.delEdenHash(DictConstants.CACHE_PREFIX_VALUE + + boolean tmp = CacheUtil.delHash(DictConstants.CACHE_PREFIX_VALUE + model.getTypeCode(), model.getDictValue()); if(tmp){ count--; diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/MenuUtil.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/MenuUtil.java index 2afc03ad..f4dc485f 100644 --- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/MenuUtil.java +++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/MenuUtil.java @@ -67,7 +67,7 @@ public class MenuUtil { */ public static MenuModel getMenuByCode(String menuCode){ // 先从缓存里拿 - MenuModel menuModel = CacheUtil.get(PREFIX_CODE + menuCode, MenuModel.class); + MenuModel menuModel = CacheUtil.getTimed(MenuModel.class, PREFIX_CODE + menuCode); if (menuModel != null){ return menuModel; } @@ -94,7 +94,7 @@ public class MenuUtil { } // 如果获得锁 则 再次检查缓存里有没有, 如果有则直接退出, 没有的话才发起数据库请求 - menuModel = CacheUtil.get(PREFIX_CODE + menuCode, MenuModel.class); + menuModel = CacheUtil.getTimed(MenuModel.class, PREFIX_CODE + menuCode); if (menuModel != null){ return menuModel; } @@ -138,7 +138,7 @@ public class MenuUtil { // 计数器 int count = 0; - MenuModel menuModel = CacheUtil.get(PREFIX_CODE + menu.getMenuCode(), MenuModel.class); + MenuModel menuModel = CacheUtil.getTimed(MenuModel.class, PREFIX_CODE + menu.getMenuCode()); boolean hasNilFlag = CacheUtil.hasNilFlag(PREFIX_CODE + menu.getMenuCode()); // 只要不为空 则执行刷新 diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/OrgUtil.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/OrgUtil.java index f40531a0..34184164 100644 --- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/OrgUtil.java +++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/OrgUtil.java @@ -66,7 +66,7 @@ public class OrgUtil { */ public static UserOrgRefModel getOrgByUserId(String userId){ // 先从缓存里拿 - UserOrgRefModel orgRefModel = CacheUtil.get(PREFIX_CODE + userId, UserOrgRefModel.class); + UserOrgRefModel orgRefModel = CacheUtil.getTimed(UserOrgRefModel.class, PREFIX_CODE + userId); if (orgRefModel != null){ return orgRefModel; } @@ -93,7 +93,7 @@ public class OrgUtil { } // 如果获得锁 则 再次检查缓存里有没有, 如果有则直接退出, 没有的话才发起数据库请求 - orgRefModel = CacheUtil.get(PREFIX_CODE + userId, UserOrgRefModel.class); + orgRefModel = CacheUtil.getTimed(UserOrgRefModel.class, PREFIX_CODE + userId); if (orgRefModel != null){ return orgRefModel; } @@ -137,7 +137,7 @@ public class OrgUtil { // 计数器 int count = 0; - UserOrgRefModel orgRefModel = CacheUtil.get(PREFIX_CODE + userId, UserOrgRefModel.class); + UserOrgRefModel orgRefModel = CacheUtil.getTimed(UserOrgRefModel.class, PREFIX_CODE + userId); boolean hasNilFlag = CacheUtil.hasNilFlag(PREFIX_CODE + userId); // 只要不为空 则执行刷新 diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/SearchHisUtil.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/SearchHisUtil.java index ec3f824f..c2f44a65 100644 --- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/SearchHisUtil.java +++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/SearchHisUtil.java @@ -19,9 +19,7 @@ import cn.hutool.core.collection.CollUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.opsli.api.wrapper.system.user.UserModel; -import org.opsli.common.constants.CacheConstants; -import org.opsli.common.utils.Props; -import org.opsli.plugins.redis.RedisLockPlugins; +import org.opsli.core.cache.local.CacheUtil; import org.opsli.plugins.redis.RedisPlugin; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; @@ -50,20 +48,11 @@ public class SearchHisUtil { /** 搜索历史缓存数据KEY */ private static final int DEFAULT_COUNT = 10; - /** - * 热点数据前缀 - */ - public static final String PREFIX_NAME; private static final String CACHE_PREFIX = "his:username:"; /** Redis插件 */ private static RedisPlugin redisPlugin; - static { - Props props = new Props("application.yaml"); - PREFIX_NAME = props.getStr("spring.cache-conf.prefix", CacheConstants.PREFIX_NAME) + ":"; - } - /** * 获得搜索历史记录 @@ -82,7 +71,7 @@ public class SearchHisUtil { // 获得当前用户 UserModel user = UserUtil.getUser(); - String cacheKey = PREFIX_NAME + CACHE_PREFIX + user.getUsername() + ":" + key; + String cacheKey = CacheUtil.PREFIX_NAME + CACHE_PREFIX + user.getUsername() + ":" + key; return redisPlugin.zReverseRange(cacheKey, 0, count - 1); } @@ -108,7 +97,7 @@ public class SearchHisUtil { } - String cacheKey = PREFIX_NAME + CACHE_PREFIX + user.getUsername() + ":" + key; + String cacheKey = CacheUtil.PREFIX_NAME + CACHE_PREFIX + user.getUsername() + ":" + key; String val = values[0]; // 记录 diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/TenantUtil.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/TenantUtil.java index 3ed17452..c66961bb 100644 --- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/TenantUtil.java +++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/TenantUtil.java @@ -67,7 +67,7 @@ public class TenantUtil { */ public static TenantModel getTenant(String tenantId){ // 先从缓存里拿 - TenantModel tenantModel = CacheUtil.get(PREFIX_CODE + tenantId, TenantModel.class); + TenantModel tenantModel = CacheUtil.getTimed(TenantModel.class, PREFIX_CODE + tenantId); if (tenantModel != null){ return tenantModel; } @@ -94,7 +94,7 @@ public class TenantUtil { } // 如果获得锁 则 再次检查缓存里有没有, 如果有则直接退出, 没有的话才发起数据库请求 - tenantModel = CacheUtil.get(PREFIX_CODE + tenantId, TenantModel.class); + tenantModel = CacheUtil.getTimed(TenantModel.class, PREFIX_CODE + tenantId); if (tenantModel != null){ return tenantModel; } @@ -138,7 +138,7 @@ public class TenantUtil { // 计数器 int count = 0; - TenantModel tenantModel = CacheUtil.get(PREFIX_CODE + tenantId, TenantModel.class); + TenantModel tenantModel = CacheUtil.getTimed(TenantModel.class, PREFIX_CODE + tenantId); boolean hasNilFlag = CacheUtil.hasNilFlag(PREFIX_CODE + tenantId); // 只要不为空 则执行刷新 diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/UserTokenUtil.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/UserTokenUtil.java index 6f2feec4..5586b25e 100644 --- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/UserTokenUtil.java +++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/UserTokenUtil.java @@ -33,6 +33,7 @@ import org.opsli.common.constants.TokenTypeConstants; import org.opsli.common.exception.TokenException; import org.opsli.common.utils.Props; import org.opsli.core.autoconfigure.properties.GlobalProperties; +import org.opsli.core.cache.local.CacheUtil; import org.opsli.core.msg.TokenMsg; import org.opsli.plugins.redis.RedisPlugin; import org.springframework.beans.factory.annotation.Autowired; @@ -76,18 +77,12 @@ public class UserTokenUtil { /** Redis插件 */ private static RedisPlugin redisPlugin; - /** 热点数据前缀 */ - public static final String PREFIX_NAME; static{ // 缓存前缀 - Props props = new Props("application.yaml"); - PREFIX_NAME = props.getStr("spring.cache-conf.prefix", CacheConstants.PREFIX_NAME) + ":"; - TICKET_PREFIX = PREFIX_NAME + "ticket:"; - ACCOUNT_SLIP_COUNT_PREFIX = PREFIX_NAME + "account:slip:count:"; - ACCOUNT_SLIP_LOCK_PREFIX = PREFIX_NAME + "account:slip:lock:"; - - + TICKET_PREFIX = CacheUtil.PREFIX_NAME + "ticket:"; + ACCOUNT_SLIP_COUNT_PREFIX = CacheUtil.PREFIX_NAME + "account:slip:count:"; + ACCOUNT_SLIP_LOCK_PREFIX = CacheUtil.PREFIX_NAME + "account:slip:lock:"; } diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/UserUtil.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/UserUtil.java index 16db86be..9f4d69d3 100644 --- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/UserUtil.java +++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/UserUtil.java @@ -105,7 +105,7 @@ public class UserUtil { */ public static UserModel getUser(String userId){ // 先从缓存里拿 - UserModel userModel = CacheUtil.get(PREFIX_ID + userId, UserModel.class); + UserModel userModel = CacheUtil.getTimed(UserModel.class, PREFIX_ID + userId); if (userModel != null){ return userModel; } @@ -133,7 +133,7 @@ public class UserUtil { } // 如果获得锁 则 再次检查缓存里有没有, 如果有则直接退出, 没有的话才发起数据库请求 - userModel = CacheUtil.get(PREFIX_ID + userId, UserModel.class); + userModel = CacheUtil.getTimed(UserModel.class, PREFIX_ID + userId); if (userModel != null){ return userModel; } @@ -173,7 +173,7 @@ public class UserUtil { */ public static UserModel getUserByUserName(String userName){ // 先从缓存里拿 - UserModel userModel = CacheUtil.get(PREFIX_USERNAME + userName, UserModel.class); + UserModel userModel = CacheUtil.getTimed(UserModel.class, PREFIX_USERNAME + userName); if (userModel != null){ return userModel; } @@ -200,7 +200,7 @@ public class UserUtil { } // 如果获得锁 则 再次检查缓存里有没有, 如果有则直接退出, 没有的话才发起数据库请求 - userModel = CacheUtil.get(PREFIX_USERNAME + userName, UserModel.class); + userModel = CacheUtil.getTimed(UserModel.class, PREFIX_USERNAME + userName); if (userModel != null){ return userModel; } @@ -238,7 +238,7 @@ public class UserUtil { // 先从缓存里拿 try { - Object obj = CacheUtil.get(PREFIX_ID_ROLES + userId); + Object obj = CacheUtil.getTimed(PREFIX_ID_ROLES + userId); if(obj instanceof List){ List list = Convert.toList(String.class, obj); if (!list.isEmpty()) { @@ -277,7 +277,7 @@ public class UserUtil { // 如果获得锁 则 再次检查缓存里有没有, 如果有则直接退出, 没有的话才发起数据库请求 try { - Object obj = CacheUtil.get(PREFIX_ID_ROLES + userId); + Object obj = CacheUtil.getTimed(PREFIX_ID_ROLES + userId); if(obj instanceof List){ List list = Convert.toList(String.class, obj); if (!list.isEmpty()) { @@ -325,7 +325,7 @@ public class UserUtil { // 先从缓存里拿 try { - Object obj = CacheUtil.get(PREFIX_ID_PERMISSIONS + userId); + Object obj = CacheUtil.getTimed(PREFIX_ID_PERMISSIONS + userId); if(obj instanceof List){ List list = Convert.toList(String.class, obj); if (!list.isEmpty()) { @@ -365,7 +365,7 @@ public class UserUtil { // 如果获得锁 则 再次检查缓存里有没有, 如果有则直接退出, 没有的话才发起数据库请求 try { - Object obj = CacheUtil.get(PREFIX_ID_PERMISSIONS + userId); + Object obj = CacheUtil.getTimed(PREFIX_ID_PERMISSIONS + userId); if(obj instanceof List){ List list = Convert.toList(String.class, obj); if (!list.isEmpty()) { @@ -412,7 +412,7 @@ public class UserUtil { // 先从缓存里拿 try { - Object obj = CacheUtil.get(PREFIX_ID_MENUS + userId); + Object obj = CacheUtil.getTimed(PREFIX_ID_MENUS + userId); if(obj instanceof List){ List list = Convert.toList(obj); if (!list.isEmpty()) { @@ -462,7 +462,7 @@ public class UserUtil { // 如果获得锁 则 再次检查缓存里有没有, 如果有则直接退出, 没有的话才发起数据库请求 try { - Object obj = CacheUtil.get(PREFIX_ID_MENUS + userId); + Object obj = CacheUtil.getTimed(PREFIX_ID_MENUS + userId); if(obj instanceof List){ List list = Convert.toList(obj); if (!list.isEmpty()) { @@ -521,9 +521,8 @@ public class UserUtil { return true; } - UserModel userModelById = CacheUtil.get(PREFIX_ID + user.getId(), UserModel.class); - UserModel userModelByUsername = CacheUtil.get(PREFIX_USERNAME + user.getUsername(), - UserModel.class); + UserModel userModelById = CacheUtil.getTimed(UserModel.class, PREFIX_ID + user.getId()); + UserModel userModelByUsername = CacheUtil.getTimed(UserModel.class, PREFIX_USERNAME + user.getUsername()); boolean hasNilFlagById = CacheUtil.hasNilFlag(PREFIX_ID + user.getId()); boolean hasNilFlagByName = CacheUtil.hasNilFlag(PREFIX_USERNAME + user.getUsername()); @@ -583,7 +582,7 @@ public class UserUtil { * @return boolean */ public static boolean refreshUserRoles(String userId){ - Object obj = CacheUtil.get(PREFIX_ID_ROLES + userId); + Object obj = CacheUtil.getTimed(PREFIX_ID_ROLES + userId); boolean hasNilFlag = CacheUtil.hasNilFlag(PREFIX_ID_ROLES + userId); // 计数器 @@ -622,7 +621,7 @@ public class UserUtil { * @return boolean */ public static boolean refreshUserAllPerms(String userId){ - Object obj = CacheUtil.get(PREFIX_ID_PERMISSIONS + userId); + Object obj = CacheUtil.getTimed(PREFIX_ID_PERMISSIONS + userId); boolean hasNilFlag = CacheUtil.hasNilFlag(PREFIX_ID_PERMISSIONS + userId); // 计数器 @@ -661,7 +660,7 @@ public class UserUtil { * @return boolean */ public static boolean refreshUserMenus(String userId){ - Object obj = CacheUtil.get(PREFIX_ID_MENUS + userId); + Object obj = CacheUtil.getTimed(PREFIX_ID_MENUS + userId); boolean hasNilFlag = CacheUtil.hasNilFlag(PREFIX_ID_MENUS + userId); // 计数器 diff --git a/opsli-modulars/opsli-modulars-creater/src/main/java/org/opsli/core/creater/enums/DataBaseType.java b/opsli-modulars/opsli-modulars-creater/src/main/java/org/opsli/core/creater/enums/DataBaseType.java index 452ec393..2a1c7215 100644 --- a/opsli-modulars/opsli-modulars-creater/src/main/java/org/opsli/core/creater/enums/DataBaseType.java +++ b/opsli-modulars/opsli-modulars-creater/src/main/java/org/opsli/core/creater/enums/DataBaseType.java @@ -56,7 +56,9 @@ public enum DataBaseType { return this.desc; } - private DataBaseType(final String db, final String desc) { + // ================ + + DataBaseType(final String db, final String desc) { this.db = db; this.desc = desc; } diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/dict/service/impl/DictDetailServiceImpl.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/dict/service/impl/DictDetailServiceImpl.java index a3fd5fbb..90071268 100644 --- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/dict/service/impl/DictDetailServiceImpl.java +++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/dict/service/impl/DictDetailServiceImpl.java @@ -27,7 +27,7 @@ import org.opsli.common.constants.MyBatisConstants; import org.opsli.common.exception.ServiceException; import org.opsli.common.utils.HumpUtil; import org.opsli.core.base.service.impl.CrudServiceImpl; -import org.opsli.core.cache.pushsub.enums.CacheType; +import org.opsli.core.cache.pushsub.enums.CacheHandleType; import org.opsli.core.cache.pushsub.msgs.DictMsgFactory; import org.opsli.core.msg.CoreMsg; import org.opsli.core.persistence.querybuilder.GenQueryBuilder; @@ -99,7 +99,7 @@ public class DictDetailServiceImpl extends CrudServiceImpl sendMsg(){ DictWrapper model = new DictWrapper(); - BaseSubMessage msg = DictMsgFactory.createMsg(model, CacheType.UPDATE); + BaseSubMessage msg = DictMsgFactory.createMsg(model, CacheHandleType.UPDATE); boolean ret = redisPlugin.sendMessage(msg); if(ret){ diff --git a/opsli-plugins/opsli-plugins-ehcache/src/main/java/org/opsli/plugins/cache/service/EhCachePluginImpl.java b/opsli-plugins/opsli-plugins-ehcache/src/main/java/org/opsli/plugins/cache/service/EhCachePluginImpl.java index f87217e1..401c21ea 100644 --- a/opsli-plugins/opsli-plugins-ehcache/src/main/java/org/opsli/plugins/cache/service/EhCachePluginImpl.java +++ b/opsli-plugins/opsli-plugins-ehcache/src/main/java/org/opsli/plugins/cache/service/EhCachePluginImpl.java @@ -46,7 +46,7 @@ public class EhCachePluginImpl implements EhCachePlugin { @Override public boolean put(String cacheName, String key, Object value) { if(cacheManager == null){ - return false; + return true; } boolean ret = false; try { @@ -98,7 +98,7 @@ public class EhCachePluginImpl implements EhCachePlugin { @Override public boolean delete(String cacheName, String key) { if(cacheManager == null){ - return false; + return true; } boolean ret = false; try { diff --git a/opsli-plugins/opsli-plugins-redis/src/main/java/org/opsli/plugins/redis/lock/RedisLock.java b/opsli-plugins/opsli-plugins-redis/src/main/java/org/opsli/plugins/redis/lock/RedisLock.java index 472dad54..ab13800d 100644 --- a/opsli-plugins/opsli-plugins-redis/src/main/java/org/opsli/plugins/redis/lock/RedisLock.java +++ b/opsli-plugins/opsli-plugins-redis/src/main/java/org/opsli/plugins/redis/lock/RedisLock.java @@ -16,9 +16,6 @@ package org.opsli.plugins.redis.lock; -import org.opsli.common.constants.CacheConstants; -import org.opsli.common.utils.Props; - import java.util.concurrent.atomic.AtomicInteger; /** @@ -30,17 +27,7 @@ import java.util.concurrent.atomic.AtomicInteger; */ public class RedisLock { - private static final String LOCK_PREFIX; - - /** 热点数据前缀 */ - public static final String PREFIX_NAME; - - static { - // 缓存前缀 - Props props = new Props("application.yaml"); - PREFIX_NAME = props.getStr("spring.cache-conf.prefix", CacheConstants.PREFIX_NAME) + ":"; - LOCK_PREFIX = PREFIX_NAME + "lock:"; - } + private static final String LOCK_PREFIX = "lock:"; /** 锁名称 */ private String lockName; @@ -127,4 +114,6 @@ public class RedisLock { this.identifier = identifier; return this; } + + } diff --git a/opsli-starter/src/main/resources/application-dev.yaml b/opsli-starter/src/main/resources/application-dev.yaml index e385ce6a..6bfcc75f 100644 --- a/opsli-starter/src/main/resources/application-dev.yaml +++ b/opsli-starter/src/main/resources/application-dev.yaml @@ -8,7 +8,7 @@ spring: #redis 配置 redis: database: 0 - host: 127.0.0.1 + host: 10.0.0.254 password: '123456' port: 6379 diff --git a/opsli-starter/src/main/resources/config/ehcache-opsli.xml b/opsli-starter/src/main/resources/config/ehcache-opsli.xml index 22175a8b..9b11b5df 100644 --- a/opsli-starter/src/main/resources/config/ehcache-opsli.xml +++ b/opsli-starter/src/main/resources/config/ehcache-opsli.xml @@ -19,8 +19,8 @@ - - + +