From 47698bfc6c1d71d1e628595762e1984d10354c9c Mon Sep 17 00:00:00 2001
From: "jlc@yoc.tech" <JiangYuChen666>
Date: Thu, 10 Aug 2023 11:50:18 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E6=8B=93=E5=B1=95=20=E6=94=AF=E6=8C=81?=
 =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E8=BF=87=E6=9C=9F=E6=97=B6=E9=97=B4?=
 =?UTF-8?q?=E7=9A=84=20RedisCacheManager=20=E4=BD=BF=E6=94=AF=E6=8C=81?=
 =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E8=BF=87=E6=9C=9F=E6=97=B6=E9=97=B4?=
 =?UTF-8?q?=E5=8D=95=E4=BD=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../redis/core/TimeoutRedisCacheManager.java  | 38 +++++++++++++++++--
 1 file changed, 35 insertions(+), 3 deletions(-)

diff --git a/yudao-framework/yudao-spring-boot-starter-redis/src/main/java/cn/iocoder/yudao/framework/redis/core/TimeoutRedisCacheManager.java b/yudao-framework/yudao-spring-boot-starter-redis/src/main/java/cn/iocoder/yudao/framework/redis/core/TimeoutRedisCacheManager.java
index cfdee653d..4de7fe57c 100644
--- a/yudao-framework/yudao-spring-boot-starter-redis/src/main/java/cn/iocoder/yudao/framework/redis/core/TimeoutRedisCacheManager.java
+++ b/yudao-framework/yudao-spring-boot-starter-redis/src/main/java/cn/iocoder/yudao/framework/redis/core/TimeoutRedisCacheManager.java
@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.framework.redis.core;
 
+import cn.hutool.core.util.NumberUtil;
 import cn.hutool.core.util.StrUtil;
 import org.springframework.boot.convert.DurationStyle;
 import org.springframework.cache.annotation.Cacheable;
@@ -13,8 +14,8 @@ import java.time.temporal.ChronoUnit;
 
 /**
  * 支持自定义过期时间的 {@link RedisCacheManager} 实现类
- *
- * 在 {@link Cacheable#cacheNames()} 格式为 "key#ttl" 时,# 后面的 ttl 为过期时间,单位为秒
+ * <p>
+ * 在 {@link Cacheable#cacheNames()} 格式为 "key#ttl" 时,# 后面的 ttl 为过期时间,单位为最后一个字母(支持的单位有:d天,h小时,m分钟,s秒),默认单位为秒
  *
  * @author 芋道源码
  */
@@ -42,10 +43,41 @@ public class TimeoutRedisCacheManager extends RedisCacheManager {
             // 移除 # 后面的 : 以及后面的内容,避免影响解析
             names[1] = StrUtil.subBefore(names[1], StrUtil.COLON, false);
             // 解析时间
-            Duration duration = DurationStyle.detectAndParse(names[1], ChronoUnit.SECONDS);
+            Duration duration = parseDuration(names[1]);
             cacheConfig = cacheConfig.entryTtl(duration);
         }
         return super.createRedisCache(names[0], cacheConfig);
     }
 
+    /**
+     * 解析 Duration
+     *
+     * @param ttlStr
+     * @return
+     */
+    private Duration parseDuration(String ttlStr) {
+        String timeUnit = StrUtil.subSuf(ttlStr, -1);
+        switch (timeUnit) {
+            case "d":
+                return Duration.ofDays(removeSuffix(ttlStr));
+            case "h":
+                return Duration.ofHours(removeSuffix(ttlStr));
+            case "m":
+                return Duration.ofMinutes(removeSuffix(ttlStr));
+            case "s":
+                return Duration.ofSeconds(removeSuffix(ttlStr));
+            default:
+                return Duration.ofSeconds(Long.parseLong(ttlStr));
+        }
+    }
+
+    /**
+     * 移除多余的后缀
+     *
+     * @param ttlStr
+     * @return
+     */
+    private Long removeSuffix(String ttlStr) {
+        return NumberUtil.parseLong(StrUtil.sub(ttlStr, 0, ttlStr.length() - 1));
+    }
 }