From fbb90c31d56348ec3fcc49af49c66b19992f58df Mon Sep 17 00:00:00 2001 From: zhanghl <253316343@qq.com> Date: 星期五, 16 五月 2025 17:15:32 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/dev' into dev --- aps-common/aps-common-redis/src/main/java/com/aps/common/redis/service/RedisLockUtils.java | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 45 insertions(+), 0 deletions(-) diff --git a/aps-common/aps-common-redis/src/main/java/com/aps/common/redis/service/RedisLockUtils.java b/aps-common/aps-common-redis/src/main/java/com/aps/common/redis/service/RedisLockUtils.java new file mode 100644 index 0000000..659c1fe --- /dev/null +++ b/aps-common/aps-common-redis/src/main/java/com/aps/common/redis/service/RedisLockUtils.java @@ -0,0 +1,45 @@ +package com.aps.common.redis.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.script.DefaultRedisScript; +import org.springframework.data.redis.core.script.RedisScript; +import org.springframework.stereotype.Component; + +import java.time.Duration; +import java.util.Collections; + +/** + * Redis 鍒嗗竷寮忛攣 + * + **/ +@Component +public class RedisLockUtils { + + @Autowired + private RedisTemplate redisTemplate; + + //鍒嗗竷寮忛攣杩囨湡鏃堕棿 s 鍙互鏍规嵁涓氬姟鑷繁璋冭妭 + private static final Long LOCK_REDIS_TIMEOUT = 10L; + //鍒嗗竷寮忛攣浼戠湢 鑷� 鍐嶆灏濊瘯鑾峰彇 鐨勭瓑寰呮椂闂� ms 鍙互鏍规嵁涓氬姟鑷繁璋冭妭 + public static final Long LOCK_REDIS_WAIT = 500L; + + + /** + * 鍔犻攣 + **/ + public Boolean getLock(String key,String value,Long timeoutSeconds){ + Boolean lockStatus = this.redisTemplate.opsForValue().setIfAbsent(key,value, Duration.ofSeconds(timeoutSeconds)); + return lockStatus; + } + + /** + * 閲婃斁閿� + **/ + public Long releaseLock(String key,String value){ + String luaScript = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end"; + RedisScript<Long> redisScript = new DefaultRedisScript<>(luaScript,Long.class); + Long releaseStatus = (Long)this.redisTemplate.execute(redisScript, Collections.singletonList(key),value); + return releaseStatus; + } +} \ No newline at end of file -- Gitblit v1.9.3