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; }