using FileService.Application.Ports; using FileService.Application.StorageContracts; using IM.Commons; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FileService.Infrastructure.Storage { public class StorageCacheService:IStorageRedisCache { private readonly IRedisService redis; public StorageCacheService(IRedisService redis) { this.redis = redis; } public async Task SetAsync(UploadRuntimeCache upload) { string key = RedisHelper.GetUploadInfoKey(upload.UploadSessionId); // 过期时间取 UploadRuntimeCache 的 ExpireAt 字段,兜底默认 24 小时 var ttl = upload.ExpireAt > upload.CreatedAt ? upload.ExpireAt - upload.CreatedAt : TimeSpan.FromHours(24); await redis.SetAsync(key, upload, ttl); // 维护 taskId → sessionId 映射,用于 DeleteByTaskId 快速定位 var mapKey = RedisHelper.GetUploadTaskSessionMapKey(upload.TaskId); await redis.SetAsync(mapKey, upload.UploadSessionId, ttl); } public async Task DeleteAsync(string sessionId) { string key = RedisHelper.GetUploadInfoKey(sessionId); // 先取出缓存以清理映射 key var cache = await redis.GetAsync(key); if (cache != null) { var mapKey = RedisHelper.GetUploadTaskSessionMapKey(cache.TaskId); await redis.RemoveAsync(mapKey); } await redis.RemoveAsync(key); } public async Task DeleteByTaskIdAsync(string taskId) { var mapKey = RedisHelper.GetUploadTaskSessionMapKey(taskId); var sessionId = await redis.GetAsync(mapKey); if (sessionId != null) { await DeleteAsync(sessionId); } } public async Task GetAsync(string sessionId) { var key = RedisHelper.GetUploadInfoKey(sessionId); return await redis.GetAsync(key); } } }