为了提高文件下载性能,减少对MinIO存储的重复请求,系统实现了基于内存的文件缓存机制。该机制具有以下特性:
在 application.yml 或 application-dev.yml 中添加以下配置:
system:
file-cache:
# 是否启用文件缓存
enabled: true
# 最大缓存文件数量
max-cache-size: 100
# 最大缓存大小(字节)- 500MB
max-cache-size-bytes: 524288000
# 缓存过期时间(毫秒)- 30分钟
expire-time-ms: 1800000
# 最大缓存单个文件大小(字节)- 50MB
max-single-file-size: 52428800
# LRU淘汰比例(百分比)
evict-ratio: 20
# 是否启用缓存统计
enable-stats: true
# 缓存清理间隔(毫秒)- 5分钟
cleanup-interval-ms: 300000
| 参数名 | 默认值 | 说明 |
|---|---|---|
enabled |
true |
是否启用文件缓存功能 |
max-cache-size |
100 |
缓存的最大文件数量 |
max-cache-size-bytes |
524288000 |
缓存的最大总大小(500MB) |
expire-time-ms |
1800000 |
缓存条目的过期时间(30分钟) |
max-single-file-size |
52428800 |
单个文件的最大缓存大小(50MB) |
evict-ratio |
20 |
LRU淘汰时移除的条目比例(20%) |
enable-stats |
true |
是否启用缓存统计功能 |
cleanup-interval-ms |
300000 |
自动清理过期条目的间隔(5分钟) |
缓存机制对用户透明,正常使用文件下载接口即可:
GET /resource/oss/download/{ossId}
系统会自动:
GET /resource/oss/cache/stats
返回示例:
{
"code": 200,
"msg": "操作成功",
"data": {
"cacheSize": 25,
"currentCacheSizeBytes": 104857600,
"maxCacheSizeBytes": 524288000,
"cacheHits": 150,
"cacheMisses": 50,
"hitRate": "75.00%"
}
}
DELETE /resource/oss/cache/clear
DELETE /resource/oss/cache/{ossId}
max-cache-size-bytesmax-cache-sizeexpire-time-msmax-single-file-sizeevict-ratio 控制淘汰比例cleanup-interval-msprivate class CacheEntry {
private final byte[] data; // 文件数据
private final long size; // 文件大小
private final long createTime; // 创建时间
private final long lastAccessTime; // 最后访问时间
private final String contentType; // 内容类型
}
private void evictLRUEntries() {
// 按最后访问时间排序
List<Map.Entry<Long, CacheEntry>> entries = new ArrayList<>(fileCache.entrySet());
entries.sort((e1, e2) -> Long.compare(e1.getValue().getLastAccessTime(), e2.getValue().getLastAccessTime()));
// 淘汰最旧的20%条目
int evictCount = Math.max(1, entries.size() / 5);
for (int i = 0; i < evictCount && i < entries.size(); i++) {
Map.Entry<Long, CacheEntry> entry = entries.get(i);
fileCache.remove(entry.getKey());
currentCacheSize.addAndGet(-entry.getValue().getSize());
}
}
ConcurrentHashMap 存储缓存数据ReentrantReadWriteLock 保证读写安全AtomicLong 统计缓存大小和命中率文件下载请求
用户请求 → 权限验证 → 检查缓存 → 返回文件
缓存命中流程
检查缓存 → 验证过期 → 直接返回 → 更新统计
缓存未命中流程
检查缓存 → 从MinIO下载 → 添加到缓存 → 返回文件
缓存管理流程
检查大小限制 → LRU淘汰 → 清理过期 → 添加新条目
缓存命中率低
内存使用过高
缓存不生效
enabled 配置是否为 true定期检查缓存统计
curl -X GET "http://localhost:8080/resource/oss/cache/stats"
bash
jstat -gc <pid> 1000
查看缓存相关日志
tail -f logs/application.log | grep "cache"
📝 维护说明: 本文档基于文件缓存机制的实现,如需修改缓存策略或参数,请同步更新相关代码和配置。