用途:解决请求间重复数据库查询、低频变更数据加载慢,以及在多实例部署、会话外部化、HTML/API 响应缓存等场景下选择与配置 ASP.NET Core 缓存方案。
主要能力与用法:
- IMemoryCache:单实例、最快。通过 AddMemoryCache 配置 SizeLimit 与 CompactionPercentage,用 TryGetValue/Set 或 GetOrCreateAsync 实现 cache-aside;需为条目设置 Size。注意应用重启即丢失、不跨实例共享,且 GetOrCreateAsync 无防击穿保护。
- IDistributedCache:多实例/负载均衡场景,常用 Redis。安装 dotnet add package Microsoft.Extensions.Caching.StackExchangeRedis,用 AddStackExchangeRedisCache 配置连接串与 InstanceName 前缀;无 Redis 基础设施可用 Microsoft.Extensions.Caching.SqlServer。需手动序列化,热点路径受网络延迟影响。
- HybridCache(.NET 9,.NET 8 为预览):统一 L1 内存 + L2 分布式,安装 Microsoft.Extensions.Caching.Hybrid 并 AddHybridCache,配合 AddStackExchangeRedisCache;GetOrCreateAsync 支持 tags,RemoveByTagAsync 按标签失效,内置防击穿与类型安全。
- 输出缓存(.NET 7+):AddOutputCache 定义策略,UseOutputCache,端点用 CacheOutput 或 [OutputCache],IOutputCacheStore.EvictByTagAsync 按标签清除,服务端缓存 HTML/JSON/文件。响应缓存则通过 [ResponseCache] 输出 Cache-Control 头,交由浏览器/CDN/代理缓存。
失效与防击穿:可用 TTL 时间失效、更新数据库时事件式移除键、HybridCache 与输出缓存按标签失效;热门键过期可用 HybridCache 或 SemaphoreSlim 双重检查锁、后台提前刷新。键建议采用 实体:ID、实体:list:过滤哈希、用户ID:资源 等带命名空间前缀的形式。
适用场景与限制:单实例且数据可容忍重启丢失用 IMemoryCache;多实例必须用分布式缓存;.NET 9 新应用推荐 HybridCache;整页或 API 响应缓存用输出缓存。避免缓存一切、无用户前缀导致跨用户泄露、忘记失效、TTL 过长、对毫秒级热点路径使用 Redis、缓存 null 未处理、未设 SizeLimit、单条序列化超过 1MB、未传递 CancellationToken。上线前应测量命中率并做配置校验。部分细节资料未提供,如具体价格与平台信息暂未提供。