ASP.NET Core Web API文件缓存工作原理及文件型缓存实现咨询
ASP.NET Core 基于文件的分布式缓存工作机制
基于文件的分布式缓存是IDistributedCache的文件系统实现,核心运行逻辑如下:
- 缓存项会被序列化为二进制数据,存储在指定的本地目录中,通常会对缓存键做哈希处理生成文件名,避免路径非法字符或过长的问题
- 支持绝对过期和滑动过期策略,内部会定期扫描缓存目录,自动清理过期的缓存文件
- 并发访问控制:通过文件锁机制,避免多个进程或线程同时读写同一个缓存项,保证数据一致性
- 容量限制:可配置缓存目录的最大占用空间,当达到阈值时,会自动删除最久未使用的缓存项(LRU策略)
针对图片转Base64场景的文件缓存实现
1. 安装依赖包
首先安装官方的文件缓存NuGet包:
Install-Package Microsoft.Extensions.Caching.FileSystem
或使用.NET CLI:
dotnet add package Microsoft.Extensions.Caching.FileSystem
2. 配置文件缓存
在Program.cs中注册文件缓存服务,指定缓存目录和容量限制:
var builder = WebApplication.CreateBuilder(args); // 注册文件系统分布式缓存 builder.Services.AddDistributedFileSystemCache(options => { // 设置缓存存储目录,可根据实际路径调整 options.CachePath = Path.Combine(Directory.GetCurrentDirectory(), "ImageBase64Cache"); // 设置缓存最大占用空间,示例为100MB options.MaximumSize = 1024 * 1024 * 100; }); // 注册图片处理业务服务 builder.Services.AddScoped<ImageProcessingService>(); var app = builder.Build(); // ... 其他中间件配置 app.Run();
3. 实现缓存逻辑
创建图片处理服务,注入IDistributedCache实现缓存逻辑:
public class ImageProcessingService { private readonly IDistributedCache _cache; public ImageProcessingService(IDistributedCache cache) { _cache = cache; } public async Task<string> GetImageAsBase64Async(string imageFilePath) { // 用图片路径的哈希值作为缓存键,避免路径字符非法或过长 var cacheKey = $"ImageCache_{ComputeSha256Hash(imageFilePath)}"; // 优先从缓存读取 var cachedBase64 = await _cache.GetStringAsync(cacheKey); if (!string.IsNullOrEmpty(cachedBase64)) { return cachedBase64; } // 缓存不存在时,读取图片并转换为Base64 var imageBytes = await File.ReadAllBytesAsync(imageFilePath); var base64Content = Convert.ToBase64String(imageBytes); // 将结果写入缓存,设置7天绝对过期时间 var cacheOptions = new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = TimeSpan.FromDays(7) // 若需要滑动过期,可添加:SlidingExpiration = TimeSpan.FromDays(1) }; await _cache.SetStringAsync(cacheKey, base64Content, cacheOptions); return base64Content; } // 辅助方法:生成字符串的SHA256哈希值 private string ComputeSha256Hash(string input) { using var sha256 = SHA256.Create(); var inputBytes = Encoding.UTF8.GetBytes(input); var hashBytes = sha256.ComputeHash(inputBytes); return BitConverter.ToString(hashBytes).Replace("-", "").ToLowerInvariant(); } }
4. 注意事项
- 权限问题:确保应用程序对指定的缓存目录有读写权限,否则会抛出IO异常
- 缓存失效:如果原始图片文件被修改,缓存不会自动更新,可通过以下方式处理:
- 设置较短的过期时间,让缓存自动刷新
- 监听图片文件的变化事件,触发对应缓存项的删除
- 在图片更新时,手动调用
_cache.RemoveAsync(cacheKey)删除旧缓存
- 性能优化:如果图片体积较大,建议直接缓存图片字节数组(用
_cache.SetAsync存储byte[]),而非Base64字符串,可减少约30%的存储空间,需要时再转换为Base64
内容的提问来源于stack exchange,提问作者Seppe OK
相关产品推荐
相关产品推荐

