You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 15:25:20