|

FusionCache 介绍与使用指南:.NET 高性能混合缓存框架实战

在现代 .NET 应用开发中,缓存已经成为提升性能、降低数据库压力的重要手段。然而,传统的 MemoryCache 或 IDistributedCache 在高并发场景下容易遇到缓存击穿、缓存雪崩以及缓存同步等问题。FusionCache 正是为了解决这些痛点而诞生的一款高性能缓存框架。

FusionCache GitHub 地址:https://github.com/ZiggyCreatures/FusionCache

FusionCache 是由 ZiggyCreatures 开发的开源 .NET 缓存库,它支持本地内存缓存(L1)、分布式缓存(L2)以及多节点同步机制,并提供缓存击穿保护、故障恢复、自动刷新等高级特性。微软的部分产品也已经采用 FusionCache 作为缓存解决方案。

什么是 FusionCache

FusionCache 是一个混合缓存(Hybrid Cache)框架,可以单独作为内存缓存使用,也可以同时结合 Redis 等分布式缓存构建两级缓存架构。其核心目标是在保证高性能的同时提升系统稳定性和容错能力。

与传统缓存方案相比,FusionCache 具备以下优势:

  • 支持 L1 本地缓存和 L2 分布式缓存
  • 自动防止 Cache Stampede(缓存击穿)
  • Fail-Safe 故障恢复机制
  • Soft Timeout 与 Hard Timeout 超时控制
  • Eager Refresh 预刷新机制
  • 多节点 Backplane 实时同步
  • OpenTelemetry 可观测性支持
  • 完整支持同步与异步操作
  • 与 ASP.NET Core 深度集成

FusionCache 的核心特性

Cache Stampede 保护

缓存击穿(Cache Stampede)是高并发系统中最常见的问题之一。

假设某个热门缓存失效,此时有数千个请求同时访问数据库重新生成数据,可能导致数据库瞬间被打垮。

FusionCache 内置请求合并机制,同一时间只有一个线程负责加载数据,其余请求等待结果返回,从而避免大量重复查询。该机制同时支持单机和分布式环境。

Fail-Safe 故障恢复

当数据库、API 或 Redis 临时不可用时,FusionCache 可以继续返回已经过期的缓存数据。

这种 Fail-Safe 模式能够有效提升系统可用性,避免因为后端服务异常导致整个网站不可访问。

双层缓存架构

FusionCache 支持:

  • L1:MemoryCache
  • L2:Redis、SQL Server Cache 等任何实现了 IDistributedCache 的缓存

请求优先访问内存缓存,如果未命中则访问 Redis,进一步减少数据库访问压力。

Eager Refresh 预刷新

FusionCache 可以在缓存即将过期时自动后台刷新数据。

用户访问时无需等待数据库查询,能够持续获得高性能响应。

安装 FusionCache

在 .NET 项目中安装非常简单:

dotnet add package ZiggyCreatures.FusionCache

安装完成后即可通过依赖注入使用。

ASP.NET Core 集成

在 Program.cs 中注册 FusionCache:

builder.Services
    .AddFusionCache()
    .WithDefaultEntryOptions(options =>
    {
        options.Duration = TimeSpan.FromMinutes(5);
    });

然后通过依赖注入获取实例:

public class ProductService
{
    private readonly IFusionCache _cache;

    public ProductService(IFusionCache cache)
    {
        _cache = cache;
    }
}

基础缓存示例

最常见的使用方式是 GetOrSetAsync:

var products = await cache.GetOrSetAsync(
    "products",
    async _ =>
    {
        return await db.Products.ToListAsync();
    },
    TimeSpan.FromMinutes(10)
);

执行流程如下:

  1. 先检查缓存是否存在
  2. 命中则直接返回
  3. 未命中执行数据库查询
  4. 查询结果写入缓存
  5. 返回数据

整个过程无需手动判断缓存是否存在。

启用 Fail-Safe

对于重要业务数据,建议开启 Fail-Safe:

var data = await cache.GetOrSetAsync(
    "user:1001",
    async _ =>
    {
        return await userRepository.GetUserAsync(1001);
    },
    options =>
    {
        options.Duration = TimeSpan.FromMinutes(5);
        options.IsFailSafeEnabled = true;
        options.FailSafeMaxDuration = TimeSpan.FromHours(2);
    }
);

即使数据库短暂故障,用户仍然可以获取到旧缓存数据。

集成 Redis 作为二级缓存

安装 Redis 扩展包:

dotnet add package ZiggyCreatures.FusionCache.Serialization.SystemTextJson
dotnet add package ZiggyCreatures.FusionCache.Backplane.StackExchangeRedis

配置 Redis:

builder.Services.AddStackExchangeRedisCache(options =>
{
    options.Configuration = "localhost:6379";
});

builder.Services
    .AddFusionCache()
    .WithDistributedCache();

此时系统将自动形成:

Application
    ↓
L1 MemoryCache
    ↓
L2 Redis
    ↓
Database

从而获得更好的横向扩展能力。

FusionCache 与 Microsoft HybridCache 对比

随着 .NET 9 推出 HybridCache,很多开发者会将两者进行比较。

FusionCache 的优势主要体现在:

  • 更成熟的功能体系
  • Fail-Safe 故障恢复
  • Backplane 多节点同步
  • 更丰富的缓存配置
  • 多缓存实例支持
  • 完善的监控与扩展能力

对于大型分布式系统,FusionCache 目前仍然是非常有竞争力的缓存解决方案。

总结

FusionCache 是目前 .NET 生态中功能最完善的缓存框架之一。相比单纯使用 MemoryCache 或 Redis,它不仅能够提供更高的性能,还能够通过缓存击穿保护、Fail-Safe、自动恢复、预刷新以及多级缓存架构大幅提升系统稳定性。

对于 ASP.NET Core、高并发 Web API、电商系统、SaaS 平台以及微服务架构项目来说,FusionCache 都是值得重点考虑的缓存解决方案。如果你的项目正在从传统 MemoryCache 升级,FusionCache 往往能够以较低成本获得显著的性能收益和可靠性提升。

评论