From c3b7673c16d026e57f8759b4cee99a42bf3c57f2 Mon Sep 17 00:00:00 2001
From: Pu Zhibing <393733352@qq.com>
Date: 星期三, 24 九月 2025 09:15:44 +0800
Subject: [PATCH] 修改bug

---
 DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RedisUtil.java |   93 +++++++++++++++++++++++++---------------------
 1 files changed, 50 insertions(+), 43 deletions(-)

diff --git a/DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RedisUtil.java b/DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RedisUtil.java
index 83c640b..4c0b47e 100644
--- a/DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RedisUtil.java
+++ b/DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RedisUtil.java
@@ -7,6 +7,8 @@
 import org.springframework.stereotype.Component;
 import org.springframework.util.StringUtils;
 import java.util.*;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 
 
@@ -18,6 +20,8 @@
     
     @Autowired
     private RedisTemplate redisTemplate;
+
+    private final Map<String, ScheduledExecutorService> LOCK_TASK_MAP = new HashMap<>();
     
     
     
@@ -71,64 +75,67 @@
             redisTemplate.delete(key);
         }
     }
-    
-    
-    
-    
-    
-    
-    
+
+
+
     /**
-     * redis加锁
+     * 加锁
      * @param key
-     * @param value
      * @param time
      * @return
      */
-    public boolean lock(String key, String value, int time){
-        if(!StringUtils.isEmpty(key)){
-            key += "_lock";
-            return redisTemplate.opsForValue().setIfAbsent(key, value);
+    public boolean lock(String key, long keepTime, long time){
+        ScheduledExecutorService scheduledExecutorService = LOCK_TASK_MAP.get(key);
+        if(null == scheduledExecutorService || scheduledExecutorService.isTerminated()){
+            unlock(key);
+        }
+        keepTime *= 1000;
+        Boolean ifAbsent = redisTemplate.opsForValue().setIfAbsent(key, UUIDUtil.getRandomCode());
+        if(ifAbsent){
+            return addLockMap(key, time);
+        }
+        long timeMillis = System.currentTimeMillis();
+        while (timeMillis + keepTime > System.currentTimeMillis()){
+            ifAbsent = redisTemplate.opsForValue().setIfAbsent(key, UUIDUtil.getRandomCode());
+            if(ifAbsent){
+                return addLockMap(key, time);
+            }
+            try {
+                Thread.sleep(100);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
         }
         return false;
     }
-    
-    /**
-     * 获取redis锁
-     * @param time
-     * @return
-     */
-    public boolean lock(int time){
-        String uuid = UUID.randomUUID().toString();
-        return lock("redis", uuid, time);
+
+
+    private boolean addLockMap(String key, long time){
+        ScheduledExecutorService scheduledExecutorService = LOCK_TASK_MAP.get(key);
+        if(null == scheduledExecutorService){
+            scheduledExecutorService = Executors.newScheduledThreadPool(1);
+        }
+        LOCK_TASK_MAP.put(key, scheduledExecutorService);
+        scheduledExecutorService.schedule(()->{
+            redisTemplate.delete(key);
+            LOCK_TASK_MAP.remove(key);
+        }, time, TimeUnit.SECONDS);
+        return true;
     }
-    
-    
-    public boolean lock(String key, int time){
-        String uuid = UUID.randomUUID().toString();
-        return lock(key, uuid, time);
-    }
-    
-    
+
+
     /**
      * redis释放锁
-     * @param key
      * @return
      */
     public boolean unlock(String key){
-        if(!StringUtils.isEmpty(key)){
-            key += "_lock";
-            return redisTemplate.delete(key);
+        redisTemplate.delete(key);
+        ScheduledExecutorService scheduledExecutorService = LOCK_TASK_MAP.get(key);
+        if(null != scheduledExecutorService){
+            scheduledExecutorService.shutdownNow();
         }
-        return false;
-    }
-    
-    /**
-     * 删除锁
-     * @return
-     */
-    public boolean unlock(){
-        return unlock("redis");
+        LOCK_TASK_MAP.remove(key);
+        return true;
     }
 
 

--
Gitblit v1.7.1