Something beautiful is on the way.

.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 → 更灵活的响应缓存

官方文档:

posted @ 2025-05-31 09:02  张朋举  阅读(127)  评论(0)    收藏  举报