Browse Source

机构缓存时加新增分布式锁逻辑

zhulu 1 year ago
parent
commit
d37999885e

+ 10 - 9
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/impl/SysDeptServiceImpl.java

@@ -396,15 +396,16 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> impl
         List<SysOrgVO> cacheList = null;
         Boolean isOk = RedisUtils.hasKey(CacheConstants.ORG_CACHE_LIST_KEY);
         if (!isOk) {
-            synchronized (SysDeptServiceImpl.class){
-                Boolean isOk2 = RedisUtils.hasKey(CacheConstants.ORG_CACHE_LIST_KEY);
-                if(!isOk2){
-                    cacheList = orgService.loadingOrgCache();
-                }
-                else {
-                    cacheList = RedisUtils.getCacheList(CacheConstants.ORG_CACHE_LIST_KEY);
-                }
-            }
+//            synchronized (SysDeptServiceImpl.class){
+//                Boolean isOk2 = RedisUtils.hasKey(CacheConstants.ORG_CACHE_LIST_KEY);
+//                if(!isOk2){
+//                    cacheList = orgService.loadingOrgCache();
+//                }
+//                else {
+//                    cacheList = RedisUtils.getCacheList(CacheConstants.ORG_CACHE_LIST_KEY);
+//                }
+//            }
+            cacheList = orgService.loadingOrgCache();
 
         } else {
             cacheList = RedisUtils.getCacheList(CacheConstants.ORG_CACHE_LIST_KEY);

+ 31 - 5
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/impl/SysOrgServiceImpl.java

@@ -42,6 +42,8 @@ import com.xunmei.system.service.ISysOrgService;
 import com.xunmei.system.util.*;
 import io.netty.util.internal.StringUtil;
 import org.apache.commons.lang3.StringUtils;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
@@ -53,6 +55,7 @@ import java.io.IOException;
 import java.net.URLEncoder;
 import java.time.LocalDate;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 
@@ -786,11 +789,34 @@ public class SysOrgServiceImpl extends ServiceImpl<SysOrgMapper, SysOrg> impleme
 
     @Override
     public List<SysOrgVO> loadingOrgCache() {
-        List<SysOrgVO> sysOrgVOS = baseMapper.selectSysOrgVOList();
-        List<SysOrgVO> hsOrgs = sysOrgVOS.stream().filter(x -> ObjectUtil.equal(x.getType(), 3)).collect(Collectors.toList());
-        clearOrgCache();
-        RedisUtils.setCacheList(CacheConstants.ORG_CACHE_LIST_KEY, sysOrgVOS);
-        RedisUtils.setCacheList(CacheConstants.HS_ORG_CACHE_LIST_KEY, hsOrgs);
+        RLock rLock=null;
+        boolean lockflag=false;
+        List<SysOrgVO> sysOrgVOS =new ArrayList<>();
+        try {
+
+            sysOrgVOS = baseMapper.selectSysOrgVOList();
+            List<SysOrgVO> hsOrgs = sysOrgVOS.stream().filter(x -> ObjectUtil.equal(x.getType(), 3)).collect(Collectors.toList());
+            RedissonClient redissonClient = RedisUtils.getClient();
+            rLock=  redissonClient.getLock("loadingOrgCache");
+            lockflag= rLock.tryLock(200L,5000L, TimeUnit.MILLISECONDS);
+            if(lockflag)
+            {
+                clearOrgCache();
+                RedisUtils.setCacheList(CacheConstants.ORG_CACHE_LIST_KEY, sysOrgVOS);
+                RedisUtils.setCacheList(CacheConstants.HS_ORG_CACHE_LIST_KEY, hsOrgs);
+            }
+        }
+        catch (Exception e)
+        {
+            log.error(e.getMessage());
+        }
+        finally {
+
+            if(lockflag&& rLock.isHeldByCurrentThread())
+            {
+                rLock.unlock();
+            }
+        }
         return sysOrgVOS;
     }