Junjie
15 小时以前 c97c04770c17c36c554963bf8bb8d8fafc6a8d43
#地图更新刷新缓存
5个文件已修改
125 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/BasMapController.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/BasMapService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/BasMapEditorServiceImpl.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/BasMapServiceImpl.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/utils/RedisUtil.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/BasMapController.java
@@ -13,7 +13,6 @@
import com.core.common.BaseRes;
import com.core.common.Cools;
import com.core.common.R;
import com.zy.common.utils.NavigateSolution;
import com.zy.common.web.BaseController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@@ -83,7 +82,7 @@
    public R add(BasMap basMap) {
        basMapService.save(basMap);
        if (basMap != null && basMap.getLev() != null) {
            NavigateSolution.refreshMapCache(basMap.getLev());
            basMapService.refreshMapRuntimeCaches(Collections.singletonList(basMap.getLev()));
        }
        return R.ok();
    }
@@ -96,14 +95,16 @@
        }
        BasMap oldBasMap = basMapService.getById(basMap.getId());
        basMapService.updateById(basMap);
        if (oldBasMap != null && oldBasMap.getLev() != null) {
            NavigateSolution.clearMapCache(oldBasMap.getLev());
        }
        Integer refreshLev = basMap.getLev() != null
                ? basMap.getLev()
                : oldBasMap == null ? null : oldBasMap.getLev();
        if (refreshLev != null) {
            NavigateSolution.refreshMapCache(refreshLev);
            List<Integer> refreshLevList = new ArrayList<>();
            if (oldBasMap != null && oldBasMap.getLev() != null) {
                refreshLevList.add(oldBasMap.getLev());
            }
            refreshLevList.add(refreshLev);
            basMapService.refreshMapRuntimeCaches(refreshLevList);
        }
        return R.ok();
    }
@@ -115,7 +116,7 @@
            BasMap basMap = basMapService.getById(id);
            basMapService.removeById(id);
            if (basMap != null && basMap.getLev() != null) {
                NavigateSolution.clearMapCache(basMap.getLev());
                basMapService.refreshMapRuntimeCaches(Collections.singletonList(basMap.getLev()));
            }
        }
        return R.ok();
src/main/java/com/zy/asrs/service/BasMapService.java
@@ -26,4 +26,6 @@
    void saveMapPayloadInBatches(Integer lev, String data, String originData, Date updateTime);//分批保存地图大字段
    void refreshMapRuntimeCaches(List<Integer> levList);//刷新地图运行缓存
}
src/main/java/com/zy/asrs/service/impl/BasMapEditorServiceImpl.java
@@ -19,9 +19,6 @@
import com.zy.asrs.service.BasStationService;
import com.zy.asrs.service.DeviceConfigService;
import com.zy.asrs.utils.MapExcelUtils;
import com.zy.common.utils.NavigateSolution;
import com.zy.common.utils.RedisUtil;
import com.zy.core.enums.RedisKeyType;
import com.zy.core.enums.SlaveType;
import com.zy.core.model.StationObjModel;
import org.springframework.beans.factory.annotation.Autowired;
@@ -68,8 +65,6 @@
    private BasStationService basStationService;
    @Autowired
    private MapExcelUtils mapExcelUtils;
    @Autowired
    private RedisUtil redisUtil;
    @Override
    public BasMapEditorDoc getEditorDoc(Integer lev) {
@@ -968,18 +963,7 @@
    }
    private void clearMapCaches(List<Integer> levList) {
        redisUtil.del(RedisKeyType.LOC_MAP_BASE.key);
        redisUtil.del(RedisKeyType.LOC_MAST_MAP_LIST.key);
        if (levList == null || levList.isEmpty()) {
            return;
        }
        LinkedHashSet<Integer> distinctLevSet = new LinkedHashSet<>(levList);
        for (Integer lev : distinctLevSet) {
            if (lev == null) {
                continue;
            }
            NavigateSolution.refreshMapCache(lev);
        }
        basMapService.refreshMapRuntimeCaches(levList);
    }
    private String normalizeType(String type) {
src/main/java/com/zy/asrs/service/impl/BasMapServiceImpl.java
@@ -15,15 +15,19 @@
import com.zy.asrs.service.BasMapService;
import com.zy.asrs.service.LocMastService;
import com.zy.asrs.utils.Utils;
import com.zy.common.utils.NavigateSolution;
import com.zy.common.utils.RedisUtil;
import com.zy.core.News;
import com.zy.core.enums.RedisKeyType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@@ -36,6 +40,14 @@
    @Autowired
    private RedisUtil redisUtil;
    // 地图拓扑变化后,这些可达性和站点选择结果都可能过期,必须整体失效。
    private static final String[] MAP_DERIVED_CACHE_PREFIXES = {
            RedisKeyType.STATION_REACHABLE_CACHE.key,
            RedisKeyType.PRECOMPUTE_IN_TASK_ROW_CACHE.key,
            RedisKeyType.IN_STATION_ROUTE_CACHE.key,
            RedisKeyType.OUT_STATION_ROUTE_CACHE.key
    };
    @Override
    public BasMap selectLatestMap(Integer lev) {
        return this.baseMapper.selectLatestMap(lev);
@@ -43,7 +55,9 @@
    @Override
    public boolean deleteByLev(Integer lev) {
        return this.baseMapper.deleteByLev(lev);
        boolean deleted = this.baseMapper.deleteByLev(lev);
        refreshMapRuntimeCaches(Collections.singletonList(lev));
        return deleted;
    }
    @Override
@@ -123,6 +137,50 @@
    }
    @Override
    public void refreshMapRuntimeCaches(List<Integer> levList) {
        redisUtil.del(RedisKeyType.LOC_MAP_BASE.key);
        redisUtil.del(RedisKeyType.LOC_MAST_MAP_LIST.key);
        clearMapDerivedRedisCaches();
        if (levList == null || levList.isEmpty()) {
            return;
        }
        LinkedHashSet<Integer> distinctLevSet = new LinkedHashSet<>(levList);
        for (Integer lev : distinctLevSet) {
            if (lev == null) {
                continue;
            }
            NavigateSolution.clearMapCache(lev);
            if (!hasMapLev(lev)) {
                continue;
            }
            refreshNavigateMapCache(lev);
        }
    }
    private void clearMapDerivedRedisCaches() {
        for (String keyPrefix : MAP_DERIVED_CACHE_PREFIXES) {
            redisUtil.deleteByPrefix(keyPrefix);
        }
    }
    private boolean hasMapLev(Integer lev) {
        if (lev == null) {
            return false;
        }
        return this.count(new QueryWrapper<BasMap>().eq("lev", lev)) > 0;
    }
    private void refreshNavigateMapCache(Integer lev) {
        try {
            NavigateSolution.refreshMapCache(lev);
        } catch (Exception e) {
            News.error("地图运行缓存刷新失败,lev={}", lev, e);
            throw e;
        }
    }
    @Override
    @Transactional
    public int syncLocMastByMap(Integer lev) {
        if (lev == null || lev <= 0) {
src/main/java/com/zy/common/utils/RedisUtil.java
@@ -118,6 +118,36 @@
        });
    }
    public int deleteByPrefix(String keyPrefix) {
        if (keyPrefix == null || keyPrefix.trim().isEmpty()) {
            return 0;
        }
        Integer deletedCount = (Integer) redisTemplate.execute((org.springframework.data.redis.core.RedisCallback<Integer>) connection -> {
            org.springframework.data.redis.core.ScanOptions options = org.springframework.data.redis.core.ScanOptions.scanOptions()
                    .match(keyPrefix + "*")
                    .count(1000)
                    .build();
            org.springframework.data.redis.core.Cursor<byte[]> cursor = connection.scan(options);
            int count = 0;
            try {
                while (cursor.hasNext()) {
                    byte[] key = cursor.next();
                    Long deleted = connection.keyCommands().del(key);
                    if (deleted != null) {
                        count += deleted.intValue();
                    }
                }
            } finally {
                try {
                    cursor.close();
                } catch (Exception e) {
                }
            }
            return count;
        });
        return deletedCount == null ? 0 : deletedCount;
    }
    public java.util.List<Object> multiGet(java.util.Collection<String> keys) {
        return redisTemplate.opsForValue().multiGet(keys);
    }