浏览代码

fix:答题服务幂等ID生成逻辑优化

hidewnd 1 周之前
父节点
当前提交
5c74334864

+ 11 - 1
yt-question/yt-question-service/src/main/java/com/ytpm/question/controller/VisitorController.java

@@ -22,6 +22,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
+import java.util.concurrent.TimeUnit;
 
 /**
  * 游客登陆
@@ -55,7 +56,16 @@ public class VisitorController {
         }
         if (StrUtil.isEmpty(requestId)) {
             requestId = IdUtil.fastSimpleUUID();
-            redisService.setTimeOutMinutesStr(redisKey, requestId, 1);
+            boolean setSuccess = redisService.setIfAbsent(redisKey, requestId, 1, TimeUnit.MINUTES);
+            if (!setSuccess) {
+                requestId = redisService.getStr(redisKey);
+                if (StrUtil.isEmpty(requestId)) {
+                    requestId = IdUtil.fastSimpleUUID();
+                    redisService.setTimeOutMinutesStr(redisKey, requestId, 1);
+                } else {
+                    redisService.expire(redisKey, 1, TimeUnit.MINUTES);
+                }
+            }
         }
         return Result.resultObjOk(requestId);
     }

+ 8 - 0
yt-question/yt-question-service/src/main/java/com/ytpm/question/redis/RedisService.java

@@ -106,6 +106,10 @@ public class RedisService {
         stringRedisTemplate.opsForValue().set(key, val, timeOut, TimeUnit.MINUTES);
     }
 
+    public boolean setIfAbsent(String key, String val ,long timeOut, TimeUnit timeUnit){
+        return Boolean.TRUE.equals(valOpsObj.setIfAbsent(key, val, timeOut, timeUnit));
+    }
+
     /**
      * 删除指定key
      *
@@ -125,6 +129,10 @@ public class RedisService {
         stringRedisTemplate.expire(key, timeOut, timeUnit);
     }
 
+    public void expire(String key, long timeOut, TimeUnit timeUnit) {
+        stringRedisTemplate.expire(key, timeOut, timeUnit);
+    }
+
     /**
      * 根据前缀批量删除
      *