Explorar o código

分布式锁优化

dengsixing %!s(int64=2) %!d(string=hai) anos
pai
achega
79b8a84bf6

+ 4 - 2
src/main/java/com/fdkankan/scene/service/impl/SceneCleanServiceImpl.java

@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.lang.UUID;
 import cn.hutool.core.util.RandomUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -65,7 +66,8 @@ public class SceneCleanServiceImpl extends ServiceImpl<ISceneCleanMapper, SceneC
         DateTime dateTime = DateUtil.beginOfDay(DateUtil.offsetMonth(Calendar.getInstance().getTime(), -6));
 
         while (true){
-            boolean lock = redisLockUtil.lock(RedisLockKey.LOCK_SCENE_CLEAN, RedisKey.EXPIRE_TIME_1_MINUTE);
+            String uuid = UUID.randomUUID().toString();
+            boolean lock = redisLockUtil.lock(RedisLockKey.LOCK_SCENE_CLEAN, uuid, RedisKey.EXPIRE_TIME_1_MINUTE);
             if(!lock){
                 try {
                     Thread.sleep(RandomUtil.randomLong(1000L, 2000L));
@@ -82,7 +84,7 @@ public class SceneCleanServiceImpl extends ServiceImpl<ISceneCleanMapper, SceneC
             //下标增加1000
             redisUtil.incr(RedisKey.SCENE_CLEAN_INDEX, sceneCleanSize);
             //解锁
-            redisLockUtil.unlockLua(RedisLockKey.LOCK_SCENE_CLEAN);
+            redisLockUtil.unlockLua(RedisLockKey.LOCK_SCENE_CLEAN, uuid);
             //查询需要清理资源的场景
             List<SceneBean> sceneBeanList = this.selectNeadCleanScene(index, sceneCleanSize, dateTime);
             //如果查出来的场景集合是空,证明已经没有场景资源需要删除,则需要把查询下表删除,等待下一次定时任务执行

+ 21 - 15
src/main/java/com/fdkankan/scene/service/impl/SceneEditInfoServiceImpl.java

@@ -1400,8 +1400,9 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
     public ResultData sceneSync(String num, String type, String floorPlanJson, String ajkJson, String cameraJson,
         MultipartFile[] files) throws Exception {
 
+        String lockVal = cn.hutool.core.lang.UUID.randomUUID().toString();
         String lockKey = String.format(RedisLockKey.LOCK_SCENE_SYNC, num);
-        Boolean lock = redisLockUtil.lock(lockKey, RedisKey.EXPIRE_TIME_2_HOUR);
+        Boolean lock = redisLockUtil.lock(lockKey, lockVal, RedisKey.EXPIRE_TIME_2_HOUR);
         if(!lock){
             throw new BusinessException(ErrorCode.SYSTEM_BUSY);
         }
@@ -1557,7 +1558,7 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
             log.error("画墙重建模型失败...", e);
             throw new BusinessException(ErrorCode.FAILURE_CODE_5039);
         }finally {
-            redisLockUtil.unlockLua(lockKey);
+            redisLockUtil.unlockLua(lockKey, lockVal);
         }
 
         return ResultData.ok();
@@ -1699,16 +1700,16 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
             jsonArr.add(JSONObject.parseObject(mosaic));
         });
 
-
+        String lockVal = cn.hutool.core.lang.UUID.randomUUID().toString();
         String lockKey = String.format(RedisLockKey.LOCK_MOSAIC_JSON, num);
-        boolean lock = redisLockUtil.lock(lockKey, RedisKey.EXPIRE_TIME_1_MINUTE);
+        boolean lock = redisLockUtil.lock(lockKey, lockVal, RedisKey.EXPIRE_TIME_1_MINUTE);
         if(!lock){
             return;
         }
         try{
             FileUtils.writeFile(mosaicPath, jsonArr.toJSONString());
         }finally {
-            redisLockUtil.unlockLua(lockKey);
+            redisLockUtil.unlockLua(lockKey, lockVal);
         }
     }
 
@@ -2087,15 +2088,16 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
         jsonObject.put("styles", styleList);
 
         String linkScenePath = String.format(ConstantFilePath.SCENE_USER_PATH_V4, num) + "links.json";
+        String lockVal = cn.hutool.core.lang.UUID.randomUUID().toString();
         String lockKey = String.format(RedisLockKey.LOCK_LINK_SCENE_JSON, num);
-        boolean lock = redisLockUtil.lock(lockKey, RedisKey.EXPIRE_TIME_1_MINUTE);
+        boolean lock = redisLockUtil.lock(lockKey, lockVal, RedisKey.EXPIRE_TIME_1_MINUTE);
         if(!lock){
             return;
         }
         try{
             cn.hutool.core.io.FileUtil.writeUtf8String(jsonObject.toJSONString(), linkScenePath);
         }finally {
-            redisLockUtil.unlockLua(lockKey);
+            redisLockUtil.unlockLua(lockKey, lockVal);
         }
     }
 
@@ -2136,7 +2138,8 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
             return;
         }
         String lockKey = String.format(RedisLockKey.LOCK_LINKPAN_STYLES_SYNC, num);
-        boolean lock = redisLockUtil.lock(lockKey, RedisKey.EXPIRE_TIME_1_MINUTE);
+        String lockVal = cn.hutool.core.lang.UUID.randomUUID().toString();
+        boolean lock = redisLockUtil.lock(lockKey, lockVal, RedisKey.EXPIRE_TIME_1_MINUTE);
         if(!lock){
             throw new BusinessException(ErrorCode.SYSTEM_BUSY);
         }
@@ -2163,7 +2166,7 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
             }
             redisUtil.hmset(key, styleMap);
         }finally {
-            redisLockUtil.unlockLua(lockKey);
+            redisLockUtil.unlockLua(lockKey, lockVal);
         }
 
     }
@@ -2197,7 +2200,8 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
             return;
         }
         String lockKey = String.format(RedisLockKey.LOCK_LINKPAN_DATA_SYNC, num);
-        boolean lock = redisLockUtil.lock(lockKey, RedisKey.EXPIRE_TIME_1_MINUTE);
+        String lockVal = cn.hutool.core.lang.UUID.randomUUID().toString();
+        boolean lock = redisLockUtil.lock(lockKey, lockVal, RedisKey.EXPIRE_TIME_1_MINUTE);
         if(!lock){
             throw new BusinessException(ErrorCode.SYSTEM_BUSY);
         }
@@ -2223,7 +2227,7 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
             }
             redisUtil.hmset(key, map);
         }finally {
-            redisLockUtil.unlockLua(lockKey);
+            redisLockUtil.unlockLua(lockKey, lockVal);
         }
     }
 
@@ -2582,14 +2586,15 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
         }
 
         String lockKey = String.format(RedisLockKey.LOCK_filter_JSON, num);
-        boolean lock = redisLockUtil.lock(lockKey, RedisKey.EXPIRE_TIME_1_MINUTE);
+        String lockVal = cn.hutool.core.lang.UUID.randomUUID().toString();
+        boolean lock = redisLockUtil.lock(lockKey, lockVal, RedisKey.EXPIRE_TIME_1_MINUTE);
         if(!lock){
             return;
         }
         try{
             FileUtils.writeFile(filterPath, JSON.toJSONString(filters));
         }finally {
-            redisLockUtil.unlockLua(lockKey);
+            redisLockUtil.unlockLua(lockKey, lockVal);
         }
     }
 
@@ -2601,7 +2606,8 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
             return;
         }
         String lockKey = String.format(RedisLockKey.LOCK_FILTER_DATA_SYNC, num);
-        boolean lock = redisLockUtil.lock(lockKey, RedisKey.EXPIRE_TIME_1_MINUTE);
+        String lockVal = cn.hutool.core.lang.UUID.randomUUID().toString();
+        boolean lock = redisLockUtil.lock(lockKey, lockVal, RedisKey.EXPIRE_TIME_1_MINUTE);
         if(!lock){
             throw new BusinessException(ErrorCode.SYSTEM_BUSY);
         }
@@ -2621,7 +2627,7 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
             }
             redisUtil.lRightPushAll(key, jsonArray.stream().collect(Collectors.toList()));
         }finally {
-            redisLockUtil.unlockLua(lockKey);
+            redisLockUtil.unlockLua(lockKey, lockVal);
         }
     }
 

+ 3 - 2
src/main/java/com/fdkankan/scene/service/impl/ScenePlusServiceImpl.java

@@ -142,7 +142,8 @@ public class ScenePlusServiceImpl extends ServiceImpl<IScenePlusMapper, ScenePlu
         String key = RedisKey.SCENE_VISIT_CNT;
         if(!redisUtil.hHasKey(key, sceneNum)){
             String lockKey = String.format(RedisLockKey.LOCK_SCENE_VISIT_CNT, sceneNum);
-            boolean lock = redisLockUtil.lock(lockKey, RedisKey.EXPIRE_TIME_10_MINUTE);
+            String lockVal = cn.hutool.core.lang.UUID.randomUUID().toString();
+            boolean lock = redisLockUtil.lock(lockKey, lockVal, RedisKey.EXPIRE_TIME_10_MINUTE);
             if(!lock){
                 return ResultData.ok();
             }
@@ -157,7 +158,7 @@ public class ScenePlusServiceImpl extends ServiceImpl<IScenePlusMapper, ScenePlu
                     redisUtil.hset(key,  sceneNum, Objects.isNull(viewCount) ? "0" : String.valueOf(viewCount));
                 }
             }finally {
-                redisLockUtil.unlockLua(lockKey);
+                redisLockUtil.unlockLua(lockKey, lockVal);
             }
         }
         redisUtil.hincr(key, sceneNum, 1);

+ 9 - 6
src/main/java/com/fdkankan/scene/service/impl/SceneProServiceImpl.java

@@ -349,7 +349,8 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
             return;
         }
         String lockKey = String.format(RedisLockKey.LOCK_HOT_DATA_SYNC, num);
-        boolean lock = redisLockUtil.lock(lockKey, RedisKey.EXPIRE_TIME_1_MINUTE);
+        String lockVal = cn.hutool.core.lang.UUID.randomUUID().toString();
+        boolean lock = redisLockUtil.lock(lockKey, lockVal, RedisKey.EXPIRE_TIME_1_MINUTE);
         if(!lock){
             throw new BusinessException(ErrorCode.SYSTEM_BUSY);
         }
@@ -375,7 +376,7 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
             }
             redisUtil.hmset(key, map);
         }finally {
-            redisLockUtil.unlockLua(lockKey);
+            redisLockUtil.unlockLua(lockKey, lockVal);
         }
     }
 
@@ -394,7 +395,8 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
             return;
         }
         String lockKey = String.format(RedisLockKey.LOCK_HOT_ICONS_SYNC, num);
-        boolean lock = redisLockUtil.lock(lockKey, RedisKey.EXPIRE_TIME_1_MINUTE);
+        String lockVal = cn.hutool.core.lang.UUID.randomUUID().toString();
+        boolean lock = redisLockUtil.lock(lockKey, lockVal, RedisKey.EXPIRE_TIME_1_MINUTE);
         if(!lock){
             throw new BusinessException(ErrorCode.SYSTEM_BUSY);
         }
@@ -415,7 +417,7 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
             }
             redisUtil.sSet(key,  iconArr.toJavaList(String.class).toArray());
         }finally {
-            redisLockUtil.unlockLua(lockKey);
+            redisLockUtil.unlockLua(lockKey, lockVal);
         }
 
     }
@@ -453,14 +455,15 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
 
         String hotJsonPath = String.format(ConstantFilePath.SCENE_USER_PATH_V4, num) + "hot.json";
         String lockKey = String.format(RedisLockKey.LOCK_HOT_JSON, num);
-        boolean lock = redisLockUtil.lock(lockKey, RedisKey.EXPIRE_TIME_1_MINUTE);
+        String lockVal = cn.hutool.core.lang.UUID.randomUUID().toString();
+        boolean lock = redisLockUtil.lock(lockKey, lockVal, RedisKey.EXPIRE_TIME_1_MINUTE);
         if(!lock){
             return;
         }
         try{
             FileUtils.writeFile(hotJsonPath, jsonObject.toJSONString());
         }finally {
-            redisLockUtil.unlockLua(lockKey);
+            redisLockUtil.unlockLua(lockKey, lockVal);
         }
     }