From c622fa278d1d2c6d385954d6bb65cc79c9256f21 Mon Sep 17 00:00:00 2001 From: Parker Date: Sun, 22 Nov 2020 11:53:07 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E7=BC=93=E5=AD=98=E6=9E=B6?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/concroller/BaseRestController.java | 8 ++ .../java/org/opsli/core/utils/DictUtil.java | 129 ++++++++++++------ .../java/org/opsli/core/utils/MenuUtil.java | 6 + .../java/org/opsli/core/utils/UserUtil.java | 70 ++++++++++ 4 files changed, 170 insertions(+), 43 deletions(-) diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/base/concroller/BaseRestController.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/base/concroller/BaseRestController.java index affaa1a7..f1b5358c 100644 --- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/base/concroller/BaseRestController.java +++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/base/concroller/BaseRestController.java @@ -131,6 +131,14 @@ public abstract class BaseRestController > resultVo = dictDetailApi.findListByTypeCode(typeCode); if(resultVo.isSuccess()){ @@ -182,6 +190,14 @@ public class DictUtil { return defaultVal; } + // 如果获得锁 则 再次检查缓存里有没有, 如果有则直接退出, 没有的话才发起数据库请求 + cacheModel = CacheUtil.getHash(DictConstants.CACHE_PREFIX_NAME + typeCode, + dictName, DictDetailModel.class); + if (cacheModel != null){ + dictValue = cacheModel.getDictValue(); + } + if (StringUtils.isNotEmpty(dictValue)) return dictValue; + // 查询数据库 并保存到缓存内 ResultVo> resultVo = dictDetailApi.findListByTypeCode(typeCode); if(resultVo.isSuccess()){ @@ -250,62 +266,89 @@ public class DictUtil { dictWrapperModel.setDictValue(model.getDictValue()); dictWrapperModels.add(dictWrapperModel); } + if(!dictWrapperModels.isEmpty()){ + return dictWrapperModels; + } - if(dictWrapperModels.isEmpty()){ - // 防止缓存穿透判断 - boolean hasNilFlag = CacheUtil.hasNilFlag(DictConstants.CACHE_PREFIX_LIST + typeCode); - if(hasNilFlag){ + // 防止缓存穿透判断 + boolean hasNilFlag = CacheUtil.hasNilFlag(DictConstants.CACHE_PREFIX_LIST + typeCode); + if(hasNilFlag){ + return dictWrapperModels; + } + + // 锁凭证 redisLock 贯穿全程 + RedisLock redisLock = new RedisLock(); + redisLock.setLockName(DictConstants.CACHE_PREFIX_LIST + typeCode) + .setAcquireTimeOut(3000L) + .setLockTimeOut(10000L); + + try { + // 这里增加分布式锁 防止缓存击穿 + // ============ 尝试加锁 + redisLock = redisLockPlugins.tryLock(redisLock); + if(redisLock == null){ return dictWrapperModels; } - // 锁凭证 redisLock 贯穿全程 - RedisLock redisLock = new RedisLock(); - redisLock.setLockName(DictConstants.CACHE_PREFIX_LIST + typeCode) - .setAcquireTimeOut(3000L) - .setLockTimeOut(10000L); - - try { - // 这里增加分布式锁 防止缓存击穿 - // ============ 尝试加锁 - redisLock = redisLockPlugins.tryLock(redisLock); - if(redisLock == null){ - return dictWrapperModels; + // 如果获得锁 则 再次检查缓存里有没有, 如果有则直接退出, 没有的话才发起数据库请求 + key = CacheUtil.handleKey(CacheConstants.EDEN_HASH_DATA, DictConstants.CACHE_PREFIX_VALUE + typeCode); + dictMap = redisPlugin.hGetAll(key); + entries = dictMap.entrySet(); + for (Map.Entry entry : entries) { + // 赋值 + JSONObject jsonObject = (JSONObject) entry.getValue(); + if(jsonObject == null){ + continue; } - - // 查询数据库 并保存到缓存内 - ResultVo> resultVo = dictDetailApi.findListByTypeCode(typeCode); - if(resultVo.isSuccess()){ - List dictDetailModels = resultVo.getData(); - for (DictDetailModel model : dictDetailModels) { - DictWrapper dictWrapperModel = new DictWrapper(); - dictWrapperModel.setTypeCode(model.getTypeCode()); - dictWrapperModel.setDictName(model.getDictName()); - dictWrapperModel.setDictValue(model.getDictValue()); - dictWrapperModel.setModel(model); - dictWrapperModels.add(dictWrapperModel); - // 保存至缓存 - DictUtil.put(dictWrapperModel); - } + JSONObject dataJson = jsonObject.getJSONObject(CacheUtil.JSON_KEY); + if(dataJson == null){ + continue; } - - }catch (Exception e){ - log.error(e.getMessage(),e); + DictDetailModel model = dataJson.toJavaObject(DictDetailModel.class); + DictWrapper dictWrapperModel = new DictWrapper(); + dictWrapperModel.setTypeCode(typeCode); + dictWrapperModel.setDictName(model.getDictName()); + dictWrapperModel.setDictValue(model.getDictValue()); + dictWrapperModels.add(dictWrapperModel); + } + if(!dictWrapperModels.isEmpty()){ return dictWrapperModels; - }finally { - // ============ 释放锁 - redisLockPlugins.unLock(redisLock); - redisLock = null; } - // 如果值还是 为空 则赋默认值 - if(dictWrapperModels.isEmpty()){ - // 加入缓存防穿透 - // 设置空变量 用于防止穿透判断 - CacheUtil.putNilFlag(DictConstants.CACHE_PREFIX_LIST + typeCode ); + // 查询数据库 并保存到缓存内 + ResultVo> resultVo = dictDetailApi.findListByTypeCode(typeCode); + if(resultVo.isSuccess()){ + List dictDetailModels = resultVo.getData(); + for (DictDetailModel model : dictDetailModels) { + DictWrapper dictWrapperModel = new DictWrapper(); + dictWrapperModel.setTypeCode(model.getTypeCode()); + dictWrapperModel.setDictName(model.getDictName()); + dictWrapperModel.setDictValue(model.getDictValue()); + dictWrapperModel.setModel(model); + dictWrapperModels.add(dictWrapperModel); + // 保存至缓存 + DictUtil.put(dictWrapperModel); + } } + }catch (Exception e){ + log.error(e.getMessage(),e); + return dictWrapperModels; + }finally { + // ============ 释放锁 + redisLockPlugins.unLock(redisLock); + redisLock = null; + } + + + // 如果值还是 为空 则赋默认值 + if(dictWrapperModels.isEmpty()){ + // 加入缓存防穿透 + // 设置空变量 用于防止穿透判断 + CacheUtil.putNilFlag(DictConstants.CACHE_PREFIX_LIST + typeCode ); } + }catch (Exception e){ log.error(e.getMessage(),e); dictWrapperModels = Lists.newArrayList(); 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 5e461103..f958e700 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 @@ -95,6 +95,12 @@ public class MenuUtil { return null; } + // 如果获得锁 则 再次检查缓存里有没有, 如果有则直接退出, 没有的话才发起数据库请求 + menuModel = CacheUtil.get(PREFIX_CODE + menuCode, MenuModel.class); + if (menuModel != null){ + return menuModel; + } + // 查询数据库 ResultVo resultVo = menuApi.getByCode(menuCode); if(resultVo.isSuccess()){ 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 a7f49807..1d58d3a8 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 @@ -139,6 +139,12 @@ public class UserUtil { return null; } + // 如果获得锁 则 再次检查缓存里有没有, 如果有则直接退出, 没有的话才发起数据库请求 + userModel = CacheUtil.get(PREFIX_ID + userId, UserModel.class); + if (userModel != null){ + return userModel; + } + // 查询数据库 UserModel userModelTemp = new UserModel(); userModelTemp.setId(userId); @@ -201,6 +207,12 @@ public class UserUtil { return null; } + // 如果获得锁 则 再次检查缓存里有没有, 如果有则直接退出, 没有的话才发起数据库请求 + userModel = CacheUtil.get(PREFIX_USERNAME + userName, UserModel.class); + if (userModel != null){ + return userModel; + } + // 查询数据库 ResultVo resultVo = userApi.getUserByUsername(userName); if(resultVo.isSuccess()){ @@ -272,6 +284,22 @@ public class UserUtil { return null; } + // 如果获得锁 则 再次检查缓存里有没有, 如果有则直接退出, 没有的话才发起数据库请求 + try { + Object obj = CacheUtil.get(PREFIX_ID_ROLES + userId); + if(obj instanceof List){ + List list = (List) obj; + if (!list.isEmpty()) { + return list; + } + }else { + JSONArray jsonArray = (JSONArray) obj; + if (jsonArray != null && !jsonArray.isEmpty()) { + return jsonArray.toJavaList(String.class); + } + } + }catch (Exception ignored){} + // 查询数据库 ResultVo> resultVo = userApi.getRolesByUserId(userId); if(resultVo.isSuccess()){ @@ -345,6 +373,22 @@ public class UserUtil { return null; } + // 如果获得锁 则 再次检查缓存里有没有, 如果有则直接退出, 没有的话才发起数据库请求 + try { + Object obj = CacheUtil.get(PREFIX_ID_PERMISSIONS + userId); + if(obj instanceof List){ + List list = (List) obj; + if (!list.isEmpty()) { + return list; + } + }else { + JSONArray jsonArray = (JSONArray) obj; + if (jsonArray != null && !jsonArray.isEmpty()) { + return jsonArray.toJavaList(String.class); + } + } + }catch (Exception ignored){} + // 查询数据库 ResultVo> resultVo = userApi.getAllPerms(userId); if(resultVo.isSuccess()){ @@ -427,6 +471,32 @@ public class UserUtil { return null; } + // 如果获得锁 则 再次检查缓存里有没有, 如果有则直接退出, 没有的话才发起数据库请求 + try { + Object obj = CacheUtil.get(PREFIX_ID_MENUS + userId); + if(obj instanceof List){ + List list = (List) obj; + if (!list.isEmpty()) { + List menuModels = Lists.newArrayListWithCapacity(list.size()); + for (Object menuObj : list) { + if(menuObj instanceof MenuModel){ + menuModels.add((MenuModel) menuObj); + }else if(menuObj instanceof JSONObject){ + JSONObject jsonObject = (JSONObject) menuObj; + MenuModel t = JSONObject.toJavaObject(jsonObject, MenuModel.class); + menuModels.add(t); + } + } + return menuModels; + } + }else { + JSONArray jsonArray = (JSONArray) obj; + if (jsonArray != null && !jsonArray.isEmpty()) { + return jsonArray.toJavaList(MenuModel.class); + } + } + }catch (Exception ignored){} + // 查询数据库 ResultVo> resultVo = userApi.getMenuListByUserId(userId); if(resultVo.isSuccess()){