.net 8 缓存策略
在 .NET 8 中,缓存策略得到了显著增强,特别是在 内存缓存(MemoryCache)、分布式缓存(DistributedCache) 和 响应缓存(ResponseCache) 方面。以下是 .NET 8 中缓存的主要改进和最佳实践:
1. 内存缓存(MemoryCache)
Microsoft.Extensions.Caching.Memory 是 .NET 核心的内置内存缓存库,.NET 8 对其进行了优化:
新特性
✅ 更灵活的过期策略
- 支持 滑动过期(SlidingExpiration) + 绝对过期(AbsoluteExpiration) 组合策略:
var options = new MemoryCacheEntryOptions { SlidingExpiration = TimeSpan.FromMinutes(5), AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(1) }; _cache.Set("key", data, options);
✅ 支持依赖令牌(CancellationToken)手动清除缓存
var cts = new CancellationTokenSource();
_cache.Set("key", data, new MemoryCacheEntryOptions { ExpirationToken = new CancellationChangeToken(cts.Token) });
cts.Cancel(); // 手动清除缓存
✅ 性能优化
- 减少锁竞争,提高高并发场景下的吞吐量。
2. 分布式缓存(DistributedCache)
Microsoft.Extensions.Caching.Distributed 用于 Redis、SQL Server、NCache 等分布式缓存方案。
新特性
✅ 增强的 Redis 缓存支持
- 默认使用
StackExchange.Redis的最新版本(支持 Redis 6+)。 - 支持 Redis 7 的 RESP3 协议,提高性能。
✅ 更简单的序列化配置
- 支持
System.Text.Json作为默认序列化方式(替代BinaryFormatter):services.AddStackExchangeRedisCache(options => { options.Configuration = "localhost:6379"; options.InstanceName = "SampleInstance"; }).AddJsonSerializer(); // 使用 JSON 序列化
✅ TTL(Time-To-Live)策略改进
- 支持 滑动过期 + 绝对过期(类似
MemoryCache):var options = new DistributedCacheEntryOptions { SlidingExpiration = TimeSpan.FromMinutes(10), AbsoluteExpiration = DateTimeOffset.Now.AddHours(1) }; await _distributedCache.SetStringAsync("key", "value", options);
3. 响应缓存(ResponseCache)
ResponseCache 用于 HTTP 响应缓存(基于 [ResponseCache] 属性)。
新特性
✅ 更灵活的缓存策略
- 支持 按请求头(VaryByHeader) 和 按查询参数(VaryByQueryKeys) 动态缓存:
[ResponseCache(Duration = 60, VaryByQueryKeys = new[] { "id" }, Location = ResponseCacheLocation.Any)] public IActionResult GetProduct(int id) { ... }
✅ 支持服务端缓存(Server-Side Caching)
- 可与 CDN 或 反向代理(如 Nginx) 配合使用:
services.AddResponseCaching(options => { options.UseCaseSensitivePaths = false; options.MaximumBodySize = 1024; // 最大缓存响应大小(KB) });
✅ 与 Output Caching 集成(ASP.NET Core 8 新增)
OutputCache提供更细粒度的控制:
app.MapGet("/cached", () => "Hello, Cached World!")
.CacheOutput(policy => policy.Expire(TimeSpan.FromSeconds(30)));
4. 缓存策略最佳实践
| 场景 | 推荐缓存策略 |
|---|---|
| 短期、高频访问(如用户会话) | MemoryCache(内存缓存) |
| 多实例共享缓存(如微服务) | DistributedCache(Redis/SQL Server) |
| HTTP API 响应缓存 | ResponseCache + CDN |
| 高性能计算 | MemoryCache + AOT 优化 |
5. 缓存失效策略
| 策略 | 适用场景 |
|---|---|
| 绝对过期(Absolute Expiration) | 数据不会频繁变更(如配置信息) |
| 滑动过期(Sliding Expiration) | 高频访问但可能过期的数据(如会话数据) |
| 依赖令牌(CancellationToken) | 手动控制缓存失效(如数据库变更时清除缓存) |
| 基于事件失效(Pub/Sub) | 分布式缓存(如 Redis 发布/订阅) |
总结
.NET 8 提供了更强大的缓存策略,适用于不同场景:
MemoryCache→ 单机高性能缓存DistributedCache→ 分布式环境(Redis/SQL Server)ResponseCache→ HTTP API 缓存优化OutputCache→ 更灵活的响应缓存
官方文档:
浙公网安备 33010602011771号