From 84140e94a5f807083a041be73ca8d93d5011afab Mon Sep 17 00:00:00 2001 From: Lemon Date: Wed, 7 Jan 2026 14:59:51 +0800 Subject: [PATCH] =?UTF-8?q?bugfix=20=20redis=E8=8E=B7=E5=8F=96=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jsowell/common/core/redis/RedisCache.java | 50 ++++++++++++++++--- .../impl/OrderBasicInfoServiceImpl.java | 22 ++++++-- 2 files changed, 62 insertions(+), 10 deletions(-) diff --git a/jsowell-common/src/main/java/com/jsowell/common/core/redis/RedisCache.java b/jsowell-common/src/main/java/com/jsowell/common/core/redis/RedisCache.java index f51d6f08f..700a511b3 100644 --- a/jsowell-common/src/main/java/com/jsowell/common/core/redis/RedisCache.java +++ b/jsowell-common/src/main/java/com/jsowell/common/core/redis/RedisCache.java @@ -619,10 +619,15 @@ public class RedisCache { Map result = new HashMap<>(); for (String key : keys) { if (StringUtils.isNotBlank(key)) { - // 使用 index -1 获取 List 的最后一个元素 - T lastValue = (T) redisTemplate.opsForHash().get(key, -1); - if (lastValue != null) { - result.put(key, lastValue); + try { + // 使用 index -1 获取 List 的最后一个元素 + T lastValue = (T) redisTemplate.opsForList().index(key, -1); + if (lastValue != null) { + result.put(key, lastValue); + } + } catch (Exception e) { + // 记录错误日志,方便排查问题 + logger.error("获取Redis List失败,key={}, 可能key的类型不是List", key, e); } } } @@ -640,8 +645,41 @@ public class RedisCache { if (StringUtils.isBlank(key)) { return null; } - // 使用 index -1 获取 List 的最后一个元素 - return (T) redisTemplate.opsForList().index(key, -1); + try { + // 使用 index -1 获取 List 的最后一个元素 + return (T) redisTemplate.opsForList().index(key, -1); + } catch (Exception e) { + // 记录错误日志,方便排查问题 + logger.error("获取Redis List失败,key={}, 可能key的类型不是List", key, e); + return null; + } + } + + /** + * 批量获取 Redis List 中每个 key 对应的最后一条数据 + * + * @param keys Redis 键集合 + * @return Map,key 为入参的 key 值,value 为对应 List 的最后一条数据 + */ + public Map multiGetLastListValueList(final List keys) { + if (keys == null || keys.isEmpty()) { + return new HashMap<>(); + } + + Map result = new HashMap<>(); + for (String key : keys) { + if (StringUtils.isNotBlank(key)) { + try { + // 使用 index -1 获取 List 的最后一个元素 + Object lastValue = redisTemplate.opsForList().index(key, -1); + result.put(key, lastValue); + } catch (Exception e) { + // 记录错误日志,方便排查问题 + logger.error("获取Redis List失败,key={}, 可能key的类型不是List", key, e); + } + } + } + return result; } } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java index 7dd150422..a80e054e4 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java @@ -6412,10 +6412,24 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService { redisKeys.add(CacheConstants.PILE_REAL_TIME_MONITOR_DATA + pileConnectorCode + "_" + transactionCode); } // 批量查询多个key值的数据 key: redisKey, value: 最后一条实时数据 - Map map = redisCache.multiGetLastListValue(redisKeys); - // 循环该map - for (Map.Entry entry : map.entrySet()) { - resultList.add(entry.getValue()); + // 注意:数据在Redis中以Hash类型存储,field为时间字符串,需要获取所有field后取最新的一条 + for (String redisKey : redisKeys) { + try { + Map hashData = redisCache.getCacheMap(redisKey); + if (hashData != null && !hashData.isEmpty()) { + // 按时间排序,获取最新的一条数据 + String latestJson = hashData.entrySet().stream() + .max(Map.Entry.comparingByKey()) + .map(Map.Entry::getValue) + .orElse(null); + if (latestJson != null) { + RealTimeMonitorData data = JSON.parseObject(latestJson, RealTimeMonitorData.class); + resultList.add(data); + } + } + } catch (Exception e) { + logger.error("获取实时监控数据失败,redisKey={}", redisKey, e); + } } return resultList; }