优化 伪穿透过滤器,防止一次直接锁死,给予3次 穿透nil机会

v1.4.1
Parker 4 years ago
parent ce5ccc99d8
commit 28d8571d08

@ -77,6 +77,8 @@ public class CacheUtil {
public static final String JSON_KEY = "data";
/** 空状态 key 前缀 */
private static final String NIL_FLAG_PREFIX = "nil";
/** 空状态 生效阈值 */
private final static long NIL_FLAG_THRESHOLD = 3;
/** 热点数据前缀 */
private static String PREFIX_NAME;
@ -642,12 +644,15 @@ public class CacheUtil {
// 判断 工具类是否初始化完成
ThrowExceptionUtil.isThrowException(!IS_INIT,
CoreMsg.OTHER_EXCEPTION_UTILS_INIT);
// 处理缓存 key
String cacheKey = CacheUtil.handleKey(NIL_FLAG_PREFIX + ":" + key);
try {
// 处理缓存 key
String cacheKey = CacheUtil.handleKey(NIL_FLAG_PREFIX + ":" + key);
// 存入Redis
return redisPlugin.put(cacheKey, 1, TTL_NIL_DATA_TIME);
Long increment = redisPlugin.increment(cacheKey);
// 设置失效时间
redisPlugin.expire(cacheKey, TTL_NIL_DATA_TIME);
return increment != null;
}catch (Exception e){
log.error(e.getMessage(),e);
}
@ -666,9 +671,9 @@ public class CacheUtil {
ThrowExceptionUtil.isThrowException(!IS_INIT,
CoreMsg.OTHER_EXCEPTION_UTILS_INIT);
// 处理缓存 key
String cacheKey = CacheUtil.handleKey(NIL_FLAG_PREFIX + ":" + key);
try {
// 处理缓存 key
String cacheKey = CacheUtil.handleKey(NIL_FLAG_PREFIX + ":" + key);
// 删除Redis
return redisPlugin.del(cacheKey);
}catch (Exception e){
@ -689,12 +694,17 @@ public class CacheUtil {
// 判断 工具类是否初始化完成
ThrowExceptionUtil.isThrowException(!IS_INIT,
CoreMsg.OTHER_EXCEPTION_UTILS_INIT);
// 处理缓存 key
String cacheKey = CacheUtil.handleKey(NIL_FLAG_PREFIX + ":" + key);
try {
// 处理缓存 key
String cacheKey = CacheUtil.handleKey(NIL_FLAG_PREFIX + ":" + key);
// 判断Redis 是否 包含当前Nil值
return redisPlugin.get(cacheKey) != null;
Object nilObj = redisPlugin.get(cacheKey);
if(nilObj == null){
return false;
}
Long nilNum = Convert.toLong(nilObj, 0L);
return NIL_FLAG_THRESHOLD < nilNum;
}catch (Exception e){
log.error(e.getMessage(),e);
}

@ -16,6 +16,7 @@
package org.opsli.core.utils;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.convert.Convert;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
@ -255,7 +256,7 @@ public class UserUtil {
// 防止缓存穿透判断
boolean hasNilFlag = CacheUtil.hasNilFlag(cacheKey);
if(hasNilFlag){
return null;
return ListUtil.empty();
}
try {
@ -263,7 +264,7 @@ public class UserUtil {
if(!DistributedLockUtil.lock(cacheKey)){
// 无法申领分布式锁
log.error(CoreMsg.REDIS_EXCEPTION_LOCK.getMessage());
return null;
return ListUtil.empty();
}
// 如果获得锁 则 再次检查缓存里有没有, 如果有则直接退出, 没有的话才发起数据库请求
@ -290,7 +291,7 @@ public class UserUtil {
if(CollUtil.isEmpty(roles)){
// 设置空变量 用于防止穿透判断
CacheUtil.putNilFlag(cacheKey);
return null;
return ListUtil.empty();
}
return roles;
@ -323,7 +324,7 @@ public class UserUtil {
// 防止缓存穿透判断
boolean hasNilFlag = CacheUtil.hasNilFlag(cacheKey);
if(hasNilFlag){
return null;
return ListUtil.empty();
}
try {
@ -331,7 +332,7 @@ public class UserUtil {
if(!DistributedLockUtil.lock(cacheKey)){
// 无法申领分布式锁
log.error(CoreMsg.REDIS_EXCEPTION_LOCK.getMessage());
return null;
return ListUtil.empty();
}
// 如果获得锁 则 再次检查缓存里有没有, 如果有则直接退出, 没有的话才发起数据库请求
@ -358,7 +359,7 @@ public class UserUtil {
if(CollUtil.isEmpty(permissions)){
// 设置空变量 用于防止穿透判断
CacheUtil.putNilFlag(cacheKey);
return null;
return ListUtil.empty();
}
return permissions;
@ -390,7 +391,7 @@ public class UserUtil {
// 防止缓存穿透判断
boolean hasNilFlag = CacheUtil.hasNilFlag(cacheKey);
if(hasNilFlag){
return null;
return ListUtil.empty();
}
@ -399,7 +400,7 @@ public class UserUtil {
if(!DistributedLockUtil.lock(cacheKey)){
// 无法申领分布式锁
log.error(CoreMsg.REDIS_EXCEPTION_LOCK.getMessage());
return null;
return ListUtil.empty();
}
// 如果获得锁 则 再次检查缓存里有没有, 如果有则直接退出, 没有的话才发起数据库请求
@ -426,7 +427,7 @@ public class UserUtil {
if(CollUtil.isEmpty(menus)){
// 设置空变量 用于防止穿透判断
CacheUtil.putNilFlag(cacheKey);
return null;
return ListUtil.empty();
}
return menus;

Loading…
Cancel
Save