From 2761e97c6aac78de6b6829bb7d9881e30f208d63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=89=91=E9=9B=A8?= <2375294554@qq.com> Date: Mon, 19 May 2025 10:46:59 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=8E=B7=E5=8F=96=E5=9C=A8re?= =?UTF-8?q?dis=E6=8C=87=E5=AE=9Akey=E7=9A=84=E5=80=BC=EF=BC=8C=E5=A6=82?= =?UTF-8?q?=E6=9E=9C=E5=80=BC=E4=B8=BA=E7=A9=BA=EF=BC=8C=E7=9D=80=E8=AE=BE?= =?UTF-8?q?=E7=BD=AEkey=E7=9A=84=E9=BB=98=E8=AE=A4=E5=80=BC=E7=9A=84?= =?UTF-8?q?=E6=96=B9=E6=B3=95=20--RedisUtils.java=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=96=B0=E6=96=B9=E6=B3=95=20--getKeyOrCreate.lua=20=E6=AD=A4?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E7=9A=84lua=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/xiaozhi/common/redis/RedisUtils.java | 27 +++++++++++++++++++ .../src/main/resources/lua/getKeyOrCreate.lua | 11 ++++++++ 2 files changed, 38 insertions(+) create mode 100644 main/manager-api/src/main/resources/lua/getKeyOrCreate.lua diff --git a/main/manager-api/src/main/java/xiaozhi/common/redis/RedisUtils.java b/main/manager-api/src/main/java/xiaozhi/common/redis/RedisUtils.java index 9115e806..4bf68856 100644 --- a/main/manager-api/src/main/java/xiaozhi/common/redis/RedisUtils.java +++ b/main/manager-api/src/main/java/xiaozhi/common/redis/RedisUtils.java @@ -6,12 +6,14 @@ import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.HashOperations; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.script.DefaultRedisScript; import org.springframework.stereotype.Component; import jakarta.annotation.Resource; +import xiaozhi.common.utils.ResourcesUtils; /** * Redis工具类 @@ -23,6 +25,9 @@ public class RedisUtils { @Resource private RedisTemplate redisTemplate; + @Autowired + private ResourcesUtils resourceUtils; + /** * 默认过期时长为24小时,单位:秒 */ @@ -147,4 +152,26 @@ public class RedisUtils { } + /** + * 获取在redis指定key的值,如果值为空,着设置key的默认值 + * @param key redis的key + * @param defaultValue 默认值 + * @param expiresInSecond 过期时间 + * @return 返回key的值 + */ + public String getKeyOrCreate(String key, String defaultValue,Long expiresInSecond) { + // Lua 脚本 + String luaScript = resourceUtils.loadString("lua/getKeyOrCreate.lua"); + + DefaultRedisScript redisScript = new DefaultRedisScript<>(); + redisScript.setScriptText(luaScript); + redisScript.setResultType(String.class); + + // 执行 Lua 脚本 + List keys = Collections.singletonList(key); + return redisTemplate.execute(redisScript, keys, defaultValue,expiresInSecond); + } + + + } \ No newline at end of file diff --git a/main/manager-api/src/main/resources/lua/getKeyOrCreate.lua b/main/manager-api/src/main/resources/lua/getKeyOrCreate.lua new file mode 100644 index 00000000..bc375b12 --- /dev/null +++ b/main/manager-api/src/main/resources/lua/getKeyOrCreate.lua @@ -0,0 +1,11 @@ +local value = redis.call('GET', KEYS[1]) +-- value 如果为空着设置值 +if not value then + local result = redis.call('SET', KEYS[1], ARGV[1]) + -- 检查 ARGV[2] 是否存在且大于 0 + local expireTime = tonumber(ARGV[2]) + if expireTime and expireTime > 0 then + redis.call('EXPIRE', KEYS[1], expireTime) + end +end +return value \ No newline at end of file