其他
在 .NET 10 应用中实现缓存时,用…
适用于 .NET 10 应用需要实现缓存、优化读取性能、减少数据库负载,或处理 HybridCache、Redis、输出缓存、缓存失效与缓存击穿等场景。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 35/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 38/100 ×0.15
适用场景
在 .NET 10 应用中实现缓存时,用特定
解决思路
- 默认使用 HybridCache 作为统一缓存抽象:它合并内存 L1 和分布式 L2 缓存,并内置防缓存击穿(stampede protection)。
- 只缓存读取(GET)操作;在数据变更时使缓存失效;绝不要缓存 POST/PUT/DELETE 响应。
- 当整个 HTTP 响应可缓存(如公开 API、静态数据)时,使用输出缓存中间件。
- 为每个缓存项设置显式 TTL(过期时间);禁止无界缓存。
- 在 Program.cs 中注册 HybridCache:调用 builder.Services.AddHybridCache,并设置 options.DefaultEntryOptions = new HybridCacheEntryOptions { Expiration = TimeSpan.FromMinutes(5), LocalCacheExpiration = TimeSpan.FromMinutes(2) }。
- 可选:将 Redis 添加为 L2 分布式缓存:调用 builder.Services.AddStackExchangeRedisCache,并设置 options.Configuration = builder.Configuration.GetConnectionString(Redis)。
- 在处理器中使用 HybridCache.GetOrCreateAsync 实现读取缓存与回源:键为 products:{query.Id},回源委托从 DbContext 查询并投影为 Response,设置 HybridCacheEntryOptions.Expiration = TimeSpan.FromMinutes(10),传入 cancellationToken。
- 在更新数据并 SaveChangesAsync 后,调用 cache.RemoveAsync 使对应缓存项失效,键为 products:{command.Id}。
- 在 Program.cs 中配置输出缓存:调用 builder.Services.AddOutputCache,添加基础策略 NoCache,添加策略 ProductList(Expire(TimeSpan.FromMinutes(5))、Tag(products))和 ProductById(Expire(TimeSpan.FromMinutes(10))、SetVaryByRouteValue(id)、Tag(products))。
- 调用 app.UseOutputCache(); 启用输出缓存中间件。
- 在端点注册时应用输出缓存策略:group.MapGet 的 / 路径使用 .CacheOutput(ProductList),/{id:guid} 路径使用 .CacheOutput(ProductById)。
- 在变更端点中注入 IOutputCacheStore,并在更新逻辑后调用 await store.EvictByTagAsync(products, ct); 按标签清除输出缓存。
- 新代码优先使用 HybridCache;仅在集成已直接使用 IDistributedCache 的现有代码时,才使用手动 cache-aside 模式。
- 不要缓存没有过期时间的项;使用 DistributedCacheEntryOptions 设置 AbsoluteExpirationRelativeToNow,例如 TimeSpan.FromMinutes(10)。
- 不要用全局键缓存可变用户特定数据;在缓存键中包含用户 ID,例如 shopping-cart:{userId}。
- 不要自己实现防缓存击穿逻辑(如 SemaphoreSlim 手动锁);使用 HybridCache 的内置防缓存击穿,通过 hybridCache.GetOrCreateAsync(key, factory) 获取或创建缓存。
- 一般数据缓存使用 HybridCache 的 GetOrCreateAsync。
- 完整 HTTP 响应使用输出缓存 .CacheOutput()。
- 频繁读取、很少写入的数据使用 HybridCache 并设置更长 TTL。
- 用户特定数据使用 HybridCache 并设置用户作用域键。
- 写入时缓存失效使用 cache.RemoveAsync() 或输出缓存标签。
- 分布式部署使用 HybridCache + Redis L2 后端。
- 单服务器部署使用 HybridCache 且仅内存缓存。
适用边界 · 注意事项
- 新代码不要使用手动 IDistributedCache cache-aside 模式;它缺少防缓存击穿、需要手动序列化、没有 L1/L2 分层,仅在集成已有 IDistributedCache 代码时使用。
- 不要缓存 POST/PUT/DELETE 等写操作响应。
- 不要缓存没有过期时间的项、不要用全局键缓存用户特定数据、不要自己实现防缓存击穿锁。