From 1e925a2e61e16730cc524b33dc8b15a948a8677e Mon Sep 17 00:00:00 2001 From: lilin Date: Mon, 26 May 2025 08:52:51 +0800 Subject: [PATCH] =?UTF-8?q?Redis=E4=BB=A3=E7=A0=81=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- java/pom.xml | 11 ++ .../modules/config/redis/RedisConfig.java | 70 +++++++++-- .../controller/TsFilesController.java | 23 ++-- .../service/ITsFilesService.java | 3 + .../service/impl/TsFilesServiceImpl.java | 103 ++++++++++------- .../controller/FilesController.java | 9 ++ .../service/IFilesService.java | 4 + .../service/impl/FilesServiceImpl.java | 109 +++++++++++------- 8 files changed, 230 insertions(+), 102 deletions(-) diff --git a/java/pom.xml b/java/pom.xml index 4735b95..8d6c87c 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -41,6 +41,17 @@ pdfbox 2.0.21 + + org.springframework.boot + spring-boot-starter-data-redis + + + com.fasterxml.jackson.core + jackson-databind + 2.13.3 + + + diff --git a/java/src/main/java/com/yfd/platform/modules/config/redis/RedisConfig.java b/java/src/main/java/com/yfd/platform/modules/config/redis/RedisConfig.java index 0c4ce4c..773d328 100644 --- a/java/src/main/java/com/yfd/platform/modules/config/redis/RedisConfig.java +++ b/java/src/main/java/com/yfd/platform/modules/config/redis/RedisConfig.java @@ -1,29 +1,79 @@ package com.yfd.platform.modules.config.redis; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import com.yfd.platform.modules.experimentalData.domain.TsFiles; +import com.yfd.platform.modules.specialDocument.domain.Files; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; + @Configuration public class RedisConfig { +// @Bean +// public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) { +// RedisTemplate template = new RedisTemplate<>(); +// template.setConnectionFactory(connectionFactory); +// +// // 使用 String 序列化器作为 Key 的序列化器 +// template.setKeySerializer(new StringRedisSerializer()); +// template.setHashKeySerializer(new StringRedisSerializer()); +// +// // 使用 GenericJackson2JsonRedisSerializer 作为 Value 的序列化器,并配置 ObjectMapper +// ObjectMapper objectMapper = new ObjectMapper(); +// // 启用类型信息,用于反序列化时识别对象类型 +// objectMapper.activateDefaultTyping( +// BasicPolymorphicTypeValidator.builder() +// .allowIfBaseType(Object.class) +// .build(), +// ObjectMapper.DefaultTyping.NON_FINAL, +// JsonTypeInfo.As.PROPERTY); +// // 注册 Java 8 时间支持模块 +// objectMapper.registerModule(new JavaTimeModule()); +// objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); +// +// GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer(objectMapper); +// template.setValueSerializer(serializer); +// template.setHashValueSerializer(serializer); +// +// template.afterPropertiesSet(); +// return template; +// } + @Bean - public RedisTemplate redisTemplate(RedisConnectionFactory factory) { + public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) { RedisTemplate template = new RedisTemplate<>(); - template.setConnectionFactory(factory); - - // Key使用String序列化 + template.setConnectionFactory(connectionFactory); template.setKeySerializer(new StringRedisSerializer()); - // Value使用JSON序列化(需引入Jackson依赖) - template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); - // Hash Key/Value序列化同理 - template.setHashKeySerializer(new StringRedisSerializer()); - template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); + ObjectMapper objectMapper = new ObjectMapper(); + // 启用完整的泛型类型支持,并强制记录嵌套类型 + objectMapper.activateDefaultTyping( + objectMapper.getPolymorphicTypeValidator(), + ObjectMapper.DefaultTyping.EVERYTHING, + JsonTypeInfo.As.PROPERTY + ); + // 注册 Java 8 时间模块 + objectMapper.registerModule(new JavaTimeModule()); + // 禁用日期序列化为时间戳 + objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + // 注册实体类 + objectMapper.registerSubtypes(TsFiles.class, Files.class); + // 启用二进制字段 Base64 编码(若存在二进制字段) + objectMapper.enable(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN); + + GenericJackson2JsonRedisSerializer serializer = + new GenericJackson2JsonRedisSerializer(objectMapper); + template.setValueSerializer(serializer); template.afterPropertiesSet(); return template; } -} +} \ No newline at end of file diff --git a/java/src/main/java/com/yfd/platform/modules/experimentalData/controller/TsFilesController.java b/java/src/main/java/com/yfd/platform/modules/experimentalData/controller/TsFilesController.java index 1b9d38d..ae08f07 100644 --- a/java/src/main/java/com/yfd/platform/modules/experimentalData/controller/TsFilesController.java +++ b/java/src/main/java/com/yfd/platform/modules/experimentalData/controller/TsFilesController.java @@ -3,6 +3,7 @@ package com.yfd.platform.modules.experimentalData.controller; import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yfd.platform.annotation.Log; import com.yfd.platform.component.TaskStatusHolder; @@ -62,6 +63,13 @@ public class TsFilesController { @PreAuthorize("@el.check('select:tsfiles')") public ResponseResult getTsFilesPage(String id, String fileName, String startDate, String endDate, String keywords, String nodeId, String taskId, String childNode, Page page) throws Exception { //分页查询 + int currentPage = (int) page.getCurrent(); + // 先尝试从缓存获取 + IPage cachedPage = tsFilesService.getCachedTsFilesPage(taskId, nodeId, currentPage); + if (cachedPage != null) { + return ResponseResult.successData(cachedPage); + } + Page tsfilesPage = tsFilesService.getTsFilesPage(id, fileName, startDate, endDate, keywords, nodeId, taskId, fileName, childNode, page); return ResponseResult.successData(tsfilesPage); } @@ -199,13 +207,13 @@ public class TsFilesController { @Log(module = "实验数据管理", value = "压缩文件夹接口!") @PostMapping("/compress") @ApiOperation("压缩文件夹接口") - public ResponseResult compressFolder(String ids, String compressedFormat, String compressedName, String compressedPath, String covered, String parentId,String path) { + public ResponseResult compressFolder(String ids, String compressedFormat, String compressedName, String compressedPath, String covered, String parentId, String path) { try { - if (StrUtil.isBlank(ids) && StrUtil.isBlank(compressedFormat) && StrUtil.isBlank(compressedName) && StrUtil.isBlank(compressedPath)&& StrUtil.isBlank(path)) { + if (StrUtil.isBlank(ids) && StrUtil.isBlank(compressedFormat) && StrUtil.isBlank(compressedName) && StrUtil.isBlank(compressedPath) && StrUtil.isBlank(path)) { return ResponseResult.error("参数为空"); } - return ResponseResult.success(tsFilesService.compressFolder(ids, compressedFormat, compressedName, compressedPath, covered, parentId, path)); + return ResponseResult.success(tsFilesService.compressFolder(ids, compressedFormat, compressedName, compressedPath, covered, parentId, path)); } catch (Exception e) { System.out.print("压缩异常原因" + e); return ResponseResult.error("压缩失败"); @@ -223,13 +231,14 @@ public class TsFilesController { @Log(module = "实验数据管理", value = "解压缩接口!") @PostMapping("/decompression") @ApiOperation("解压缩接口") - public ResponseResult decompressionFolder(String id, String decompressionPath, String parentId,String path) { + public ResponseResult decompressionFolder(String id, String decompressionPath, String parentId, String path) { try { if (StrUtil.isBlank(id)) { return ResponseResult.error("参数为空"); } - return ResponseResult.success(tsFilesService.decompressionFolder(id, decompressionPath, parentId,path)); + + return ResponseResult.success(tsFilesService.decompressionFolder(id, decompressionPath, parentId, path)); } catch (Exception e) { System.out.print("解压缩异常原因" + e); return ResponseResult.error("解压缩失败"); @@ -564,6 +573,7 @@ public class TsFilesController { return ResponseResult.success("任务已由其他请求启动"); } } + /********************************** * 用途说明: 获取异步信息 * 参数说明 taskId 所属项目ID @@ -605,7 +615,7 @@ public class TsFilesController { @PostMapping("/automaticFileBackupByIds") @ApiOperation("自动备份本地文件到备份空间通过ID") public ResponseResult automaticFileBackupByIds(String id) throws IOException { - if (StrUtil.isEmpty(id) ) { + if (StrUtil.isEmpty(id)) { return ResponseResult.error("参数为空"); } List dataset = StrUtil.split(id, ","); @@ -631,7 +641,6 @@ public class TsFilesController { } - /********************************** * 用途说明: 实时获取轨迹数据 * 参数说明 id 文件的ID diff --git a/java/src/main/java/com/yfd/platform/modules/experimentalData/service/ITsFilesService.java b/java/src/main/java/com/yfd/platform/modules/experimentalData/service/ITsFilesService.java index 51bdacc..60d8d75 100644 --- a/java/src/main/java/com/yfd/platform/modules/experimentalData/service/ITsFilesService.java +++ b/java/src/main/java/com/yfd/platform/modules/experimentalData/service/ITsFilesService.java @@ -1,5 +1,6 @@ package com.yfd.platform.modules.experimentalData.service; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.modules.experimentalData.domain.*; @@ -247,4 +248,6 @@ public interface ITsFilesService extends IService { Object compareMd5List(List dataset, String nodeId, String taskId); void automaticFileBackupAsyncByIds(List dataset); + + IPage getCachedTsFilesPage(String taskId, String nodeId, int currentPage); } diff --git a/java/src/main/java/com/yfd/platform/modules/experimentalData/service/impl/TsFilesServiceImpl.java b/java/src/main/java/com/yfd/platform/modules/experimentalData/service/impl/TsFilesServiceImpl.java index a65cace..11f95fa 100644 --- a/java/src/main/java/com/yfd/platform/modules/experimentalData/service/impl/TsFilesServiceImpl.java +++ b/java/src/main/java/com/yfd/platform/modules/experimentalData/service/impl/TsFilesServiceImpl.java @@ -23,6 +23,7 @@ import com.amazonaws.services.s3.model.S3Object; import com.amazonaws.services.s3.model.S3ObjectInputStream; import com.amazonaws.util.IOUtils; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.opencsv.CSVReader; @@ -78,7 +79,7 @@ import java.io.*; import java.sql.Timestamp; import java.time.LocalDateTime; import java.util.zip.*; - +import com.fasterxml.jackson.core.type.TypeReference; import org.apache.commons.codec.binary.Hex; @@ -131,8 +132,8 @@ public class TsFilesServiceImpl extends ServiceImpl impl private TaskStatusHolder taskStatusHolder; + @Autowired - @Qualifier("myCustomRedisTemplate") // 指定自定义的 Bean 名称 private RedisTemplate redisTemplate; /********************************** @@ -151,20 +152,6 @@ public class TsFilesServiceImpl extends ServiceImpl impl ***********************************/ @Override public Page getTsFilesPage(String id, String fileName, String startDate, String endDate, String keywords, String nodeId, String taskId, String fileName1, String childNode, Page page) throws Exception { - -// int currentPage = (int) page.getCurrent(); // 获取当前页码 -// // 判断是否是前五页 -// if (currentPage >= 1 && currentPage <= 5) { -// // 生成带页码的完整RedisKey -// String redisKey = "tsfiles_" + taskId + "_" + nodeId + "_page_" + currentPage; -// -// // 尝试从Redis获取缓存 -// Page cachedPage = (Page) redisTemplate.opsForValue().get(redisKey); -// if (cachedPage != null) { -// return cachedPage; // 直接返回缓存数据 -// } -// } - //查询字典表获取压缩文件后缀 QueryWrapper queryWrapperSysDictionary = new QueryWrapper<>(); queryWrapperSysDictionary.eq("parentcode", "compressType"); @@ -275,18 +262,48 @@ public class TsFilesServiceImpl extends ServiceImpl impl tsFilesPage.setRecords(records); // 同步到 tsFilesPage - - - System.out.println("Updated records: " + records); -// // 如果是前五页,将结果存入Redis(有效期建议30分钟) -// if (currentPage >= 1 && currentPage <= 5) { -// String redisKey = "tsfiles_" + taskId + "_" + nodeId + "_page_" + currentPage; -// redisTemplate.opsForValue().set(redisKey, tsFilesPage, 2 * 60 * 60); -// } + int currentPage = (int) page.getCurrent(); + // 如果是前五页,将结果存入Redis(有效期建议30分钟) + if (currentPage >= 1 && currentPage <= 5) { + String redisKey = "tsfiles_" + taskId + "_" + nodeId + "_page_" + currentPage; + redisTemplate.opsForValue().set(redisKey, tsFilesPage, 2, TimeUnit.HOURS); + } return tsFilesPage; } + /** + * Redis缓存获取 + * @param taskId + * @param nodeId + * @param currentPage + * @return + */ + @Override + public IPage getCachedTsFilesPage(String taskId, String nodeId, int currentPage) { + String redisKey = "tsfiles_" + taskId + "_" + nodeId + "_page_" + currentPage; + Object data = redisTemplate.opsForValue().get(redisKey); + + if (data instanceof IPage) { + // 由于启用了类型信息,可以直接强制转换 + @SuppressWarnings("unchecked") + IPage page = (IPage) data; + // 检查 records 是否已正确反序列化 + if (page.getRecords() != null && !page.getRecords().isEmpty() + && page.getRecords().get(0) instanceof TsFiles) { + return page; + } else { + // 处理可能的反序列化异常 + throw new IllegalStateException("反序列化失败,records 类型不正确"); + } + } + return null; + } + public void cachePageData(String taskId, String nodeId, int currentPage, Page pageData) { + String redisKey = "tsfiles_" + taskId + "_" + nodeId + "_page_" + currentPage; + redisTemplate.opsForValue().set(redisKey, pageData, 2, TimeUnit.HOURS); + } + public boolean hasValidExtension(String name, List sysDictionaryItems) { // 如果传入的文件名为空,返回 false if (name == null) { @@ -388,12 +405,12 @@ public class TsFilesServiceImpl extends ServiceImpl impl @Override public ResponseResult addTsFiles(TsFiles tsFiles) { -// //todo 新增成功以后 删除redis -// for (int page = 1; page <= 5; page++) { -// String redisKey = "tsfiles_" + tsFiles.getTaskId() + "_" + tsFiles.getNodeId() + "_page_" + page; -// redisTemplate.delete(redisKey); -// } -// LOGGER.info("已清理缓存:taskid={}, node={}, pages=1-5", tsFiles.getTaskId(), tsFiles.getNodeId()); + //todo 新增成功以后 删除redis + for (int page = 1; page <= 5; page++) { + String redisKey = "tsfiles_" + tsFiles.getTaskId() + "_" + tsFiles.getNodeId() + "_page_" + page; + redisTemplate.delete(redisKey); + } + LOGGER.info("已清理缓存:taskid={}, node={}, pages=1-5", tsFiles.getTaskId(), tsFiles.getNodeId()); Boolean value = true; //文件名称和大小 因为支持多个上传所以用,分隔 @@ -520,12 +537,12 @@ public class TsFilesServiceImpl extends ServiceImpl impl @Transactional(rollbackFor = Exception.class)// 添加事务注解,遇到异常时回滚 public ResponseResult addTsFile(TsFiles tsFiles) throws IOException { -// //todo 新增成功以后 删除redis -// for (int page = 1; page <= 5; page++) { -// String redisKey = "tsfiles_" + tsFiles.getTaskId() + "_" + tsFiles.getNodeId() + "_page_" + page; -// redisTemplate.delete(redisKey); -// } -// LOGGER.info("已清理缓存:taskid={}, node={}, pages=1-5", tsFiles.getTaskId(), tsFiles.getNodeId()); + //todo 新增成功以后 删除redis + for (int page = 1; page <= 5; page++) { + String redisKey = "tsfiles_" + tsFiles.getTaskId() + "_" + tsFiles.getNodeId() + "_page_" + page; + redisTemplate.delete(redisKey); + } + LOGGER.info("已清理缓存:taskid={}, node={}, pages=1-5", tsFiles.getTaskId(), tsFiles.getNodeId()); if (tsFiles.getIsFile().equals("FILE")) { StorageSourceConfig config = getStorageConfig("filePath", "local"); @@ -630,12 +647,12 @@ public class TsFilesServiceImpl extends ServiceImpl impl @Transactional(rollbackFor = Exception.class)// 添加事务注解,遇到异常时回滚 public ResponseResult updateTsFiles(TsFiles tsFiles) { -// //todo 新增成功以后 删除redis -// for (int page = 1; page <= 5; page++) { -// String redisKey = "tsfiles_" + tsFiles.getTaskId() + "_" + tsFiles.getNodeId() + "_page_" + page; -// redisTemplate.delete(redisKey); -// } -// LOGGER.info("已清理缓存:taskid={}, node={}, pages=1-5", tsFiles.getTaskId(), tsFiles.getNodeId()); + //todo 新增成功以后 删除redis + for (int page = 1; page <= 5; page++) { + String redisKey = "tsfiles_" + tsFiles.getTaskId() + "_" + tsFiles.getNodeId() + "_page_" + page; + redisTemplate.delete(redisKey); + } + LOGGER.info("已清理缓存:taskid={}, node={}, pages=1-5", tsFiles.getTaskId(), tsFiles.getNodeId()); // 校验文件名是否包含非法字符 String fileName = tsFiles.getFileName(); if (containsInvalidCharacters(fileName)) { @@ -3373,6 +3390,8 @@ public class TsFilesServiceImpl extends ServiceImpl impl } + + /********************************** * 用途说明: 文件自动备份通过节点和任务 * 参数说明 taskId 节点ID diff --git a/java/src/main/java/com/yfd/platform/modules/specialDocument/controller/FilesController.java b/java/src/main/java/com/yfd/platform/modules/specialDocument/controller/FilesController.java index aff232f..639b1fa 100644 --- a/java/src/main/java/com/yfd/platform/modules/specialDocument/controller/FilesController.java +++ b/java/src/main/java/com/yfd/platform/modules/specialDocument/controller/FilesController.java @@ -3,9 +3,11 @@ package com.yfd.platform.modules.specialDocument.controller; import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yfd.platform.annotation.Log; import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.modules.experimentalData.domain.TsFiles; import com.yfd.platform.modules.specialDocument.domain.Files; import com.yfd.platform.modules.specialDocument.service.IFilesService; import io.swagger.annotations.ApiOperation; @@ -53,6 +55,13 @@ public class FilesController { @PreAuthorize("@el.check('select:files')") public ResponseResult getFilesPage(String fileName, String startDate, String endDate, String keywords, String nodeId,String projectId, Page page) throws Exception { //分页查询 + int currentPage = (int) page.getCurrent(); + // 先尝试从缓存获取 + IPage cachedFilesPage = filesService.getCachedFilesPage(projectId, nodeId,currentPage ); + if (cachedFilesPage != null){ + return ResponseResult.successData(cachedFilesPage); + } + Page filesPage = filesService.getFilesPage(fileName, startDate, endDate, keywords, nodeId, projectId, fileName, page); return ResponseResult.successData(filesPage); } diff --git a/java/src/main/java/com/yfd/platform/modules/specialDocument/service/IFilesService.java b/java/src/main/java/com/yfd/platform/modules/specialDocument/service/IFilesService.java index 94476e8..c149bc8 100644 --- a/java/src/main/java/com/yfd/platform/modules/specialDocument/service/IFilesService.java +++ b/java/src/main/java/com/yfd/platform/modules/specialDocument/service/IFilesService.java @@ -1,7 +1,9 @@ package com.yfd.platform.modules.specialDocument.service; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.modules.experimentalData.domain.TsFiles; import com.yfd.platform.modules.specialDocument.domain.Files; import com.baomidou.mybatisplus.extension.service.IService; import org.springframework.web.multipart.MultipartFile; @@ -56,4 +58,6 @@ public interface IFilesService extends IService { ********************************** * @return*/ String deleteFilesByIds(List dataset); + + IPage getCachedFilesPage(String projectId, String nodeId, int currentPage); } diff --git a/java/src/main/java/com/yfd/platform/modules/specialDocument/service/impl/FilesServiceImpl.java b/java/src/main/java/com/yfd/platform/modules/specialDocument/service/impl/FilesServiceImpl.java index ad3d58f..e40580d 100644 --- a/java/src/main/java/com/yfd/platform/modules/specialDocument/service/impl/FilesServiceImpl.java +++ b/java/src/main/java/com/yfd/platform/modules/specialDocument/service/impl/FilesServiceImpl.java @@ -5,10 +5,13 @@ import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.exception.file.InvalidStorageSourceException; import com.yfd.platform.modules.config.model.request.FileListRequest; +import com.yfd.platform.modules.experimentalData.domain.TsFiles; import com.yfd.platform.modules.specialDocument.domain.Files; import com.yfd.platform.modules.specialDocument.mapper.FilesMapper; import com.yfd.platform.modules.specialDocument.service.IFilesService; @@ -35,7 +38,7 @@ import org.springframework.security.authentication.UsernamePasswordAuthenticatio import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.multipart.MultipartFile; +import com.fasterxml.jackson.core.type.TypeReference; import javax.annotation.Resource; import java.sql.Timestamp; @@ -43,6 +46,7 @@ import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -75,7 +79,7 @@ public class FilesServiceImpl extends ServiceImpl implements private FileChain fileChain; @Autowired - private RedisTemplate redisTemplate; + private RedisTemplate redisTemplate; /********************************** @@ -92,22 +96,6 @@ public class FilesServiceImpl extends ServiceImpl implements ***********************************/ @Override public Page getFilesPage(String fileName, String startDate, String endDate, String keywords, String nodeId, String projectId, String fileName1, Page page) throws Exception { - // 生成Redis缓存Key的基础部分(nodeId + projectId) - - -// int currentPage = (int) page.getCurrent(); // 获取当前页码 -// // 判断是否是前五页 -// if (currentPage >= 1 && currentPage <= 5) { -// // 生成带页码的完整RedisKey -// String redisKey = "sdfiles_" + projectId + "_" + nodeId + "_page_" + currentPage; -// -// // 尝试从Redis获取缓存 -// Page cachedPage = (Page) redisTemplate.opsForValue().get(redisKey); -// if (cachedPage != null) { -// return cachedPage; // 直接返回缓存数据 -// } -// } - //先查询路径下的所有文件 //首先通过项目ID 和节点ID去查询表 获取一个路径 如果不是空 就调用minio的获取文件列表接口 查询的数据放在集合中 @@ -198,16 +186,50 @@ public class FilesServiceImpl extends ServiceImpl implements } } filesPage.setRecords(records); - -// // 如果是前五页,将结果存入Redis(有效期建议30分钟) -// if (currentPage >= 1 && currentPage <= 5) { -// String redisKey = "sdfiles:" + projectId + ":" + nodeId + ":page:" + currentPage; -// redisTemplate.opsForValue().set(redisKey, filesPage, 2 * 60 * 60); -// } - + int currentPage = (int) page.getCurrent(); + // 如果是前五页,将结果存入Redis(有效期建议30分钟) + if (currentPage >= 1 && currentPage <= 5) { + String redisKey = "sdfiles_" + projectId + "_" + nodeId + "_page_" + currentPage; + redisTemplate.opsForValue().set(redisKey, filesPage, 2, TimeUnit.HOURS); + } return filesPage; } + /** + * 缓存中获取节点文件 + * + * @param projectId + * @param nodeId + * @param currentPage + * @return + */ + @Override + public IPage getCachedFilesPage(String projectId, String nodeId, int currentPage) { + String redisKeyff = "sdfiles_" + projectId + "_" + nodeId + "_page_" + currentPage; + + Object data = redisTemplate.opsForValue().get(redisKeyff); + +// if (data != null) { +// ObjectMapper mapper = new ObjectMapper(); +// // 明确指定目标类型为 Page +// return mapper.convertValue(data, new TypeReference>() {}); +// } + + if (data instanceof IPage) { + // 由于启用了类型信息,可以直接强制转换 + @SuppressWarnings("unchecked") + IPage page = (IPage) data; + // 检查 records 是否已正确反序列化 + if (page.getRecords() != null && !page.getRecords().isEmpty() + && page.getRecords().get(0) instanceof Files) { + return page; + } else { + // 处理可能的反序列化异常 + throw new IllegalStateException("反序列化失败,records 类型不正确"); + } + } + return null; + } /*********************************** * 用途说明:新增专项文档管理-文档内容 @@ -222,6 +244,13 @@ public class FilesServiceImpl extends ServiceImpl implements List names = Arrays.asList(files.getFileName().split(",")); List sizes = Arrays.asList(files.getFileSize().split(",")); + //todo 新增成功以后 删除redis + for (int page = 1; page <= 5; page++) { + String redisKey = "sdfiles_" + files.getProjectId() + "_" + files.getNodeId() + "_page_" + page; + redisTemplate.delete(redisKey); + } + LOGGER.info("已清理缓存:project={}, node={}, pages=1-5", files.getProjectId(), files.getNodeId()); + // 差不多的流程 就是提出来 然后判断 如果两个 中有一个是true //获取当前登录用户 上传人是当前登录人 UsernamePasswordAuthenticationToken authentication = @@ -281,12 +310,6 @@ public class FilesServiceImpl extends ServiceImpl implements for (Files filess : filesToSave) { int valueAdded = filesMapper.insert(filess); if (valueAdded == 1) { -// //todo 新增成功以后 删除redis -// for (int page = 1; page <= 5; page++) { -// String redisKey = "sdfiles_" + filess.getProjectId() + "_" + filess.getNodeId() + "_page_" + page; -// redisTemplate.delete(redisKey); -// } -// LOGGER.info("已清理缓存:project={}, node={}, pages=1-5", filess.getProjectId(), filess.getNodeId()); value = true; @@ -316,12 +339,12 @@ public class FilesServiceImpl extends ServiceImpl implements if (containsInvalidCharacters(fileName)) { return false; } -// //todo 修改删除redis -// for (int page = 1; page <= 5; page++) { -// String redisKey = "sdfiles_" + files.getProjectId() + "_" + files.getNodeId() + "_page_" + page; -// redisTemplate.delete(redisKey); -// } -// LOGGER.info("已清理缓存:project={}, node={}, pages=1-5", files.getProjectId(), files.getNodeId()); + //todo 修改删除redis + for (int page = 1; page <= 5; page++) { + String redisKey = "sdfiles_" + files.getProjectId() + "_" + files.getNodeId() + "_page_" + page; + redisTemplate.delete(redisKey); + } + LOGGER.info("已清理缓存:project={}, node={}, pages=1-5", files.getProjectId(), files.getNodeId()); // 修改之前查询表中的文件名是否修改,如果发生变动先修改 minio 然后再修改表结构 Files filesData = filesMapper.selectById(files.getId()); @@ -375,15 +398,15 @@ public class FilesServiceImpl extends ServiceImpl implements public String deleteFilesByIds(List dataset) { List filesList = filesMapper.selectBatchIds(dataset); - + //todo 删除的时候删除redis + for (int page = 1; page <= 5; page++) { + String redisKey = "sdfiles_" + filesList.get(0).getProjectId() + "_" + filesList.get(0).getNodeId() + "_page_" + page; + redisTemplate.delete(redisKey); + } int SuccessCount = 0, FailCount = 0, total = CollUtil.size(dataset); //Todo 最直接的办法 循环出来 一条一条删除 for (Files files : filesList) { -// //todo 删除的时候删除redis -// for (int page = 1; page <= 5; page++) { -// String redisKey = "sdfiles_" + files.getProjectId() + "_" + files.getNodeId() + "_page_" + page; -// redisTemplate.delete(redisKey); -// } + List deleteItemList = new ArrayList<>(); BatchDeleteRequest.DeleteItem deleteItemData = new BatchDeleteRequest.DeleteItem();