From c97c04770c17c36c554963bf8bb8d8fafc6a8d43 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期四, 07 五月 2026 09:43:35 +0800
Subject: [PATCH] #地图更新刷新缓存
---
src/main/java/com/zy/asrs/service/impl/BasMapEditorServiceImpl.java | 18 -----
src/main/java/com/zy/common/utils/RedisUtil.java | 30 ++++++++++
src/main/java/com/zy/asrs/service/impl/BasMapServiceImpl.java | 60 +++++++++++++++++++
src/main/java/com/zy/asrs/controller/BasMapController.java | 15 ++--
src/main/java/com/zy/asrs/service/BasMapService.java | 2
5 files changed, 100 insertions(+), 25 deletions(-)
diff --git a/src/main/java/com/zy/asrs/controller/BasMapController.java b/src/main/java/com/zy/asrs/controller/BasMapController.java
index 062ce52..cb02ccb 100644
--- a/src/main/java/com/zy/asrs/controller/BasMapController.java
+++ b/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();
diff --git a/src/main/java/com/zy/asrs/service/BasMapService.java b/src/main/java/com/zy/asrs/service/BasMapService.java
index ad74835..1cb74b0 100644
--- a/src/main/java/com/zy/asrs/service/BasMapService.java
+++ b/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);//鍒锋柊鍦板浘杩愯缂撳瓨
+
}
diff --git a/src/main/java/com/zy/asrs/service/impl/BasMapEditorServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/BasMapEditorServiceImpl.java
index 3d1181d..063b684 100644
--- a/src/main/java/com/zy/asrs/service/impl/BasMapEditorServiceImpl.java
+++ b/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) {
diff --git a/src/main/java/com/zy/asrs/service/impl/BasMapServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/BasMapServiceImpl.java
index 1e3b7b6..7f3cb64 100644
--- a/src/main/java/com/zy/asrs/service/impl/BasMapServiceImpl.java
+++ b/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("鍦板浘杩愯缂撳瓨鍒锋柊澶辫触锛宭ev={}", lev, e);
+ throw e;
+ }
+ }
+
+ @Override
@Transactional
public int syncLocMastByMap(Integer lev) {
if (lev == null || lev <= 0) {
diff --git a/src/main/java/com/zy/common/utils/RedisUtil.java b/src/main/java/com/zy/common/utils/RedisUtil.java
index 2c27c76..6a28925 100644
--- a/src/main/java/com/zy/common/utils/RedisUtil.java
+++ b/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);
}
--
Gitblit v1.9.1