From 09f28fa6e51671974d61877a991300b6a0b8a7f0 Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Mon, 11 Nov 2024 10:19:35 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=87=AA=E5=AE=9A=E4=B9=89re?= =?UTF-8?q?dis=E9=94=81=E5=B7=A5=E5=85=B7=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ChenfengCacheAutoConfiguration.java | 6 ++ .../redis/config/ChenfengCacheProperties.java | 11 +++ .../framework/redis/util/RedisLockUtil.java | 77 +++++++++++++++++++ .../service/config/ConfigServiceImpl.java | 1 - .../src/main/resources/application.yaml | 3 + 5 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 cf-framework/cf-spring-boot-starter-redis/src/main/java/com/cf/imes/framework/redis/util/RedisLockUtil.java diff --git a/cf-framework/cf-spring-boot-starter-redis/src/main/java/com/cf/imes/framework/redis/config/ChenfengCacheAutoConfiguration.java b/cf-framework/cf-spring-boot-starter-redis/src/main/java/com/cf/imes/framework/redis/config/ChenfengCacheAutoConfiguration.java index 7a20c7a78..9980e3891 100644 --- a/cf-framework/cf-spring-boot-starter-redis/src/main/java/com/cf/imes/framework/redis/config/ChenfengCacheAutoConfiguration.java +++ b/cf-framework/cf-spring-boot-starter-redis/src/main/java/com/cf/imes/framework/redis/config/ChenfengCacheAutoConfiguration.java @@ -2,6 +2,8 @@ package com.cf.imes.framework.redis.config; import cn.hutool.core.text.StrPool; import com.cf.imes.framework.redis.core.TimeoutRedisCacheManager; +import com.cf.imes.framework.redis.util.RedisLockUtil; +import org.redisson.api.RedissonClient; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.cache.CacheProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; @@ -79,4 +81,8 @@ public class ChenfengCacheAutoConfiguration { return new TimeoutRedisCacheManager(cacheWriter, redisCacheConfiguration); } + @Bean + public RedisLockUtil lockUtil(ChenfengCacheProperties chenfengCacheProperties, RedissonClient client) { + return new RedisLockUtil(chenfengCacheProperties, client); + } } diff --git a/cf-framework/cf-spring-boot-starter-redis/src/main/java/com/cf/imes/framework/redis/config/ChenfengCacheProperties.java b/cf-framework/cf-spring-boot-starter-redis/src/main/java/com/cf/imes/framework/redis/config/ChenfengCacheProperties.java index 78906c3c3..f5539a74f 100644 --- a/cf-framework/cf-spring-boot-starter-redis/src/main/java/com/cf/imes/framework/redis/config/ChenfengCacheProperties.java +++ b/cf-framework/cf-spring-boot-starter-redis/src/main/java/com/cf/imes/framework/redis/config/ChenfengCacheProperties.java @@ -24,4 +24,15 @@ public class ChenfengCacheProperties { */ private Integer redisScanBatchSize = REDIS_SCAN_BATCH_SIZE_DEFAULT; + /** + * 超时时间,单位:毫秒(ms) + * 默认5分钟 + */ + private int lockTimeout = 300000; + + /** + * 等待获取锁的时间,单位:毫秒(ms) + * 默认0.5秒 + */ + private int lockWaitTime = 500; } diff --git a/cf-framework/cf-spring-boot-starter-redis/src/main/java/com/cf/imes/framework/redis/util/RedisLockUtil.java b/cf-framework/cf-spring-boot-starter-redis/src/main/java/com/cf/imes/framework/redis/util/RedisLockUtil.java new file mode 100644 index 000000000..636f7d8ea --- /dev/null +++ b/cf-framework/cf-spring-boot-starter-redis/src/main/java/com/cf/imes/framework/redis/util/RedisLockUtil.java @@ -0,0 +1,77 @@ +package com.cf.imes.framework.redis.util; + +import cn.hutool.core.util.ObjectUtil; +import com.cf.imes.framework.redis.config.ChenfengCacheProperties; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; + +import java.util.concurrent.TimeUnit; + +/** + * redis锁工具类 + * + * @author Gqr + * @since 2024/11/8 18:43 + */ +@AllArgsConstructor +@Slf4j +public class RedisLockUtil { + + private ChenfengCacheProperties chenfengCacheProperties; + + private RedissonClient redissonClient; + + /** + * 加锁 + * + * @param key rediskey + * @return true拿到锁,反之没有做对应的业务提醒 + */ + public boolean lock(String key) { + boolean getLock = false; + try { + RLock lock = redissonClient.getLock(key); + return lock.tryLock(chenfengCacheProperties.getLockWaitTime(), chenfengCacheProperties.getLockTimeout(), TimeUnit.MILLISECONDS); + } catch (Exception e) { + log.error("[RedisLockUtil][lock]加锁失败", e); + return getLock; + } + } + + /** + * 加锁 + * + * @param key rediskey + * @param timeout 锁的超时时间,传空则按照默认配置 + * @param waitTime 等待获取锁的时间,传空则按照默认配置 + * @return true拿到锁,反之没有做对应的业务提醒 + */ + public boolean lock(String key, Integer waitTime, Integer timeout) { + boolean getLock = false; + try { + RLock lock = redissonClient.getLock(key); + int wt = ObjectUtil.isNull(waitTime) ? chenfengCacheProperties.getLockWaitTime() : waitTime; + int to = ObjectUtil.isNull(timeout) ? chenfengCacheProperties.getLockTimeout() : timeout; + return lock.tryLock(wt, to, TimeUnit.MILLISECONDS); + } catch (Exception e) { + log.error("[RedisLockUtil][lock]加锁失败", e); + return getLock; + } + } + + /** + * 解锁 + * + * @param key rediskey + */ + public void unlock(String key) { + try { + RLock lock = redissonClient.getLock(key); + lock.unlock(); + } catch (Exception e) { + log.error("[RedisLockUtil][unlock]解锁失败", e); + } + } +} diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/config/ConfigServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/config/ConfigServiceImpl.java index 1bdb5eb6b..283d11c8b 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/config/ConfigServiceImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/config/ConfigServiceImpl.java @@ -6,7 +6,6 @@ import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.framework.common.util.object.BeanUtils; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; import com.cf.imes.framework.organ.core.context.OrganContextHolder; -import com.cf.imes.module.system.controller.admin.baseconfig.ConfigController; import com.cf.imes.module.system.controller.admin.baseconfig.vo.ConfigPageReqVO; import com.cf.imes.module.system.controller.admin.baseconfig.vo.ConfigSaveReqVO; import com.cf.imes.module.system.controller.admin.baseconfig.vo.ConfigUpdateStatusReqVO; diff --git a/cf-module-system/cf-module-system-biz/src/main/resources/application.yaml b/cf-module-system/cf-module-system-biz/src/main/resources/application.yaml index 8199cff3a..afe5d2f15 100644 --- a/cf-module-system/cf-module-system-biz/src/main/resources/application.yaml +++ b/cf-module-system/cf-module-system-biz/src/main/resources/application.yaml @@ -217,4 +217,7 @@ chenfeng: enable: true apiUrl: https://ipquery.market.alicloudapi.com/query appCode: hBeRhmOnCR8f/XiD8zJ3lDaBSjbBA5ZZA2OEGswEOYQOK/hXVaT8E+AUOnEBcgFiw0R+39BvQ6TOVe2k + cache: + lock-timeout: 300000 + lock-wait-time: 500 debug: false