Bladeren bron

fix 修复 RedisUtils 并发 set ttl 错误问题

疯狂的狮子li 2 jaren geleden
bovenliggende
commit
a8d798c38a
1 gewijzigde bestanden met toevoegingen van 7 en 6 verwijderingen
  1. 7 6
      ruoyi-common/src/main/java/com/ruoyi/common/utils/redis/RedisUtils.java

+ 7 - 6
ruoyi-common/src/main/java/com/ruoyi/common/utils/redis/RedisUtils.java

@@ -110,14 +110,13 @@ public class RedisUtils {
      * @since Redis 6.X 以上使用 setAndKeepTTL 兼容 5.X 方案
      */
     public static <T> void setCacheObject(final String key, final T value, final boolean isSaveTtl) {
-        RBucket<Object> bucket = CLIENT.getBucket(key);
+        RBucket<T> bucket = CLIENT.getBucket(key);
         if (isSaveTtl) {
             try {
                 bucket.setAndKeepTTL(value);
             } catch (Exception e) {
                 long timeToLive = bucket.remainTimeToLive();
-                bucket.set(value);
-                bucket.expire(Duration.ofMillis(timeToLive));
+                setCacheObject(key, value, Duration.ofMillis(timeToLive));
             }
         } else {
             bucket.set(value);
@@ -132,9 +131,11 @@ public class RedisUtils {
      * @param duration 时间
      */
     public static <T> void setCacheObject(final String key, final T value, final Duration duration) {
-        RBucket<T> result = CLIENT.getBucket(key);
-        result.set(value);
-        result.expire(duration);
+        RBatch batch = CLIENT.createBatch();
+        RBucketAsync<T> bucket = batch.getBucket(key);
+        bucket.setAsync(value);
+        bucket.expireAsync(duration);
+        batch.execute();
     }
 
     /**