在现代 .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)
);
执行流程如下:
- 先检查缓存是否存在
- 命中则直接返回
- 未命中执行数据库查询
- 查询结果写入缓存
- 返回数据
整个过程无需手动判断缓存是否存在。
启用 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 往往能够以较低成本获得显著的性能收益和可靠性提升。