如何基于AWS SDK高效匹配S3版本化对象的指定日期对应版本?
问题描述
我使用AWS SDK从S3版本化存储桶拉取对象,方法接收一个指定日期,需要找到该日期对应的对象版本。S3返回的版本历史示例如下:
version 11, last modified date: Mon Jul 31 14:00:00 2023" // 当前版本 version 10, last modified date: Thu Jun 15 13:00:00 2023" version 9, last modified date: Wed May 31 12:00:00 2023" version 8, last modified date: Fri May 05 12:00:00 2023" version 7, last modified date: Thu Mar 30 18:00:00 2023" version 6, last modified date: Wed Mar 15 13:00:00 2023" version 5, last modified date: Wed Feb 01 16:00:00 2023" version 4, last modified date: Tue Nov 29 10:00:00 2022" version 3, last modified date: Wed Nov 09 10:00:00 2022" version 2, last modified date: Fri Oct 07 13:00:00 2022" version 1 last modified date: Tue Aug 09 11:00:00 2022" version null, last modified date: Tue Jun 28 10:00:00 2022"
传入的日期参数为:"02/27/2024 16:58:30"。我已将S3返回的日期与版本号存入TreeMap(自动按日期升序排序):Map<Date, String> treeMap = new TreeMap<>();。目前使用循环逐个比较的方法可实现需求,但性能较差,现寻求更优实现方案。当前代码如下:
Date newestPdfDate = (Date) treeMap.keySet().toArray()[treeMap.size()-1]; String pdfVersionToReturn = treeMap.get(newestPdfDate); for(int i = 0; i < treeMap.size(); i++) { Date pdfDate = (Date) treeMap.keySet().toArray()[i]; // Key String pdfVersion = treeMap.get(pdfDate); // Value if(applicationApprovedDate.before(pdfDate)) { pdfVersionToReturn = pdfVersion; break; } }
优化方案
TreeMap基于红黑树实现,自带高效的范围查找能力,无需手动循环遍历,直接利用内置方法即可快速定位目标版本。
核心逻辑
TreeMap的ceilingKey(Date key)方法会返回大于等于指定日期的最小键,完全匹配你的需求:找到第一个修改日期晚于传入日期的版本(与原循环逻辑一致)。如果传入日期比所有版本都晚,则返回最新版本。
优化后的代码
// 直接调用TreeMap的ceilingKey方法查找目标日期 Date targetDate = applicationApprovedDate; TreeMap<Date, String> sortedVersions = (TreeMap<Date, String>) treeMap; Date ceilingDate = sortedVersions.ceilingKey(targetDate); String pdfVersionToReturn; if (ceilingDate != null) { // 找到第一个晚于传入日期的版本 pdfVersionToReturn = sortedVersions.get(ceilingDate); } else { // 传入日期晚于所有版本,返回最新版本 pdfVersionToReturn = sortedVersions.lastEntry().getValue(); }
额外优化点
- 避免无效数组转换:原代码每次循环都调用
treeMap.keySet().toArray(),频繁创建数组造成性能损耗,优化后完全规避该操作。 - 类型安全优化:初始化时直接声明为
TreeMap<Date, String>,无需强制类型转换,代码更简洁安全:TreeMap<Date, String> sortedVersions = new TreeMap<>(); // ... 存入S3版本数据 Date ceilingDate = sortedVersions.ceilingKey(targetDate); - 边界场景覆盖:保留原逻辑中“默认返回最新版本”的处理,同时覆盖所有可能的边界情况。
内容的提问来源于stack exchange,提问作者Volk
相关产品推荐
相关产品推荐

