Parcourir la source

修复锁问题bug

zhangxin il y a 1 semaine
Parent
commit
fd68db405a

+ 16 - 1
yami-shop-common/src/main/java/com/yami/shop/common/util/RedisUtil.java

@@ -29,7 +29,6 @@ public class RedisUtil {
 
     private static StringRedisTemplate stringRedisTemplate = SpringContextUtils.getBean("stringRedisTemplate",StringRedisTemplate.class);
 
-
     //=============================common============================
     /**
      * 指定缓存失效时间
@@ -118,6 +117,22 @@ public class RedisUtil {
             return false;
         }
     }
+    /**
+     * 快速获取锁(不重试)
+     */
+    public static boolean tryLockFast(String key,Object value,long time) {
+        try {
+            Boolean result = redisTemplate.opsForValue().setIfAbsent(
+                    key,
+                    value,
+                    time,
+                    TimeUnit.SECONDS
+            );
+            return Boolean.TRUE.equals(result);
+        } catch (Exception e) {
+            return false;
+        }
+    }
 
     /**
      * 递增 此时value值必须为int类型 否则报错

+ 2 - 2
yami-shop-platform/src/main/java/com/yami/shop/platform/task/OrderTask.java

@@ -67,14 +67,14 @@ public class OrderTask {
     @Autowired
     private IHBOrderService ihbOrderService;
 
+    private String lockKey = "cancel_timeout_orders_lock";
 
     public void cancelOrder() {
         Date now = new Date();
         logger.info("取消超时未支付订单。。。");
-        String lockKey = "cancel_timeout_orders_lock";
         // 使用分布式锁或数据库行锁
         try {
-            if (!RedisUtil.set(lockKey, "locked", 30)) {
+            if (!RedisUtil.tryLockFast(lockKey, "locked", 30)) {
                 logger.info("任务正在执行中,跳过本次执行");
                 return;
             }