From bf6b3f9b86507cb93688cf3121ab88cd1e98b48b Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Fri, 9 Aug 2024 10:50:01 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E5=88=86=E5=B8=83=E5=BC=8F=E7=BC=93=E5=AD=98=EF=BC=8C=E4=BB=A5?= =?UTF-8?q?=E5=8F=8A=E5=88=86=E5=B8=83=E5=BC=8F=E9=94=81=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow}/utils/WorkDaysUtils.java | 48 +++++++++++-------- 1 file changed, 27 insertions(+), 21 deletions(-) rename {ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core => ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow}/utils/WorkDaysUtils.java (84%) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/WorkDaysUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkDaysUtils.java similarity index 84% rename from ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/WorkDaysUtils.java rename to ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkDaysUtils.java index 49c0d30eb..7addf873c 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/WorkDaysUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkDaysUtils.java @@ -1,12 +1,19 @@ -package org.dromara.common.core.utils; +package org.dromara.workflow.utils; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ArrayUtil; +import com.baomidou.lock.LockInfo; +import com.baomidou.lock.LockTemplate; import lombok.AccessLevel; import lombok.NoArgsConstructor; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.redis.utils.RedisUtils; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.locks.ReentrantLock; +import java.util.Calendar; +import java.util.Collections; +import java.util.Date; +import java.util.List; /** * 工作日工具类 @@ -16,8 +23,8 @@ import java.util.concurrent.locks.ReentrantLock; @NoArgsConstructor(access = AccessLevel.PRIVATE) public class WorkDaysUtils { - private static final Map DAYS_IN_YEARS = new ConcurrentHashMap<>(); - private static final ReentrantLock LOCK = new ReentrantLock(); + private static final String DAYS_IN_YEARS_KEY = GlobalConstants.GLOBAL_REDIS_KEY + "DAYS_IN_YEARS:"; + private static final LockTemplate LOCK_TEMPLATE = SpringUtils.getBean(LockTemplate.class); //工作日 public static final int WORKDAY = 0; //休息日 @@ -124,10 +131,10 @@ public class WorkDaysUtils { } /** - * 清空所有年份的数据 + * 删除指定年份的数据 */ - public static void clearAllData() { - DAYS_IN_YEARS.clear(); + public static void clearData(Integer year) { + RedisUtils.deleteObject(DAYS_IN_YEARS_KEY + year); } /** @@ -137,25 +144,24 @@ public class WorkDaysUtils { * @return 表示一年中每一天的状态数组,0 表示工作日,1 表示周末 */ private static Integer[] daysInYear(Integer year) { - // 先检查缓存 - if (DAYS_IN_YEARS.containsKey(year)) { - return DAYS_IN_YEARS.get(year); + String key = DAYS_IN_YEARS_KEY + year; + Integer[] daysInYears = RedisUtils.getCacheObject(key); + if (ArrayUtil.isNotEmpty(daysInYears)) { + return daysInYears; } - - // 如果缓存中不存在,则进行加锁 - LOCK.lock(); + LockInfo lock = LOCK_TEMPLATE.lock(key); try { - // 再次检查缓存,防止在等待锁期间其他线程已经生成了数据 - if (DAYS_IN_YEARS.containsKey(year)) { - return DAYS_IN_YEARS.get(year); + // 再次检查缓存,防止缓存穿透 + daysInYears = RedisUtils.getCacheObject(key); + if (ArrayUtil.isNotEmpty(daysInYears)) { + return daysInYears; } - // 如果年份数据不存在,则生成指定年份的数据 Integer[] daysArray = generateDaysArray(year); - DAYS_IN_YEARS.put(year, daysArray); + RedisUtils.setCacheObject(key, daysArray); return daysArray; } finally { - LOCK.unlock(); + LOCK_TEMPLATE.releaseLock(lock); } }