0Pricing
C# Academy · 课时

缓存策略与失效

控制缓存生命周期和标签。

缓存策略与失效 是 CoddyKit 上的免费 C# Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C# Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C# Academy 课程共包含 4 节课。

命名策略

您不必在每个端点上重复缓存设置,而是可以一次定义可复用的命名策略,然后按名称引用它们。

builder.Services.AddOutputCache(options =>
{
    options.AddPolicy("Short", policy =>
        policy.Expire(TimeSpan.FromSeconds(10)));
    options.AddPolicy("Long", policy =>
        policy.Expire(TimeSpan.FromMinutes(10)));
});

应用命名策略

缓存端点时,请通过策略名称引用该策略。

app.MapGet("/catalog", GetCatalog)
   .CacheOutput("Long");

缓存标签

标签可以将相关的缓存条目分组,以便一起使它们失效。在策略中使用 Tag 为端点添加标签。

app.MapGet("/products", GetProducts)
   .CacheOutput(policy => policy
        .Expire(TimeSpan.FromMinutes(5))
        .Tag("products"));

IOutputCacheStore

失效处理通过 IOutputCacheStore 进行。请注入它并调用 EvictByTagAsync,清除所有带有指定标签的条目。

app.MapPost("/products", async (
    Product p, AppDb db, IOutputCacheStore cache, CancellationToken ct) =>
{
    db.Products.Add(p);
    await db.SaveChangesAsync(ct);
    await cache.EvictByTagAsync("products", ct);
    return Results.Created($"/products/{p.Id}", p);
});

为什么要在写入时使缓存失效

底层数据发生变化的瞬间,缓存列表就会过时。在每次创建、更新或删除操作时清除相关标签,可以在无需等待过期的情况下保持读取结果最新。

// After any mutation:
await cache.EvictByTagAsync("products", ct);

按资源添加标签

以更细的粒度添加标签,这样只需清除某个条目的缓存响应,而不必清除整个集合。

app.MapGet("/products/{id}", GetProduct)
   .CacheOutput(policy => policy.Tag("products"));
// Evict the single item's detail + the list together
await cache.EvictByTagAsync("products", ct);

策略中的按条件区分

在一个命名策略中组合过期时间、标签和按条件区分规则,即可形成完整的缓存约定。

options.AddPolicy("ProductList", policy => policy
    .Expire(TimeSpan.FromMinutes(5))
    .Tag("products")
    .SetVaryByQuery("page", "size"));

自定义区分值

VaryByValue 允许您根据任意请求数据设置缓存键,例如从请求中解析出的租户标识符。

policy.VaryByValue(context =>
    new KeyValuePair<string, string>(
        "tenant",
        context.Request.Headers["X-Tenant"].ToString()));

清除与过期

条目离开缓存有两种方式:

  • 过期:基于时间,通过 Expire 自动发生。
  • 清除:显式执行,在数据发生变化时通过 EvictByTagAsync 完成。

请同时使用两者:以较短的过期时间作为安全保障,以清除操作确保正确性。

// belt-and-suspenders: Expire(5min) + EvictByTag on write

锁定与缓存击穿保护

默认情况下,输出缓存会合并并发缓存未命中请求:当许多请求同时访问未缓存的端点时,只有一个请求会运行 handler,其余请求会等待。您可以使用 SetLocking(false) 退出此行为。

policy.SetLocking(false); // allow concurrent regeneration

分布式输出缓存

默认情况下,存储位于内存中,并且每个实例独立。对于多服务器环境,请使用分布式存储(例如 Redis)作为后端,这样所有实例就能共享同一个缓存,并使其中的内容同时失效。

// Register a distributed IOutputCacheStore implementation
// (e.g. a Redis-backed package) so EvictByTag works cluster-wide

快速检查

请测试您对失效处理的理解。

回顾

您学习了缓存策略和失效处理:

  • 定义可复用的命名策略,并按名称应用它们。
  • 标签可以将条目分组;IOutputCacheStore.EvictByTagAsync 会在写入时清除这些条目。
  • 将过期(自动)与清除(显式)结合使用。
  • 在多服务器部署中使用分布式存储。

限流与缓存课程到此结束。

常见问题解答

「缓存策略与失效」课时是免费的吗?

是的 — 「缓存策略与失效」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C# Academy 课程的其余内容,请升级到 CoddyKit PRO。 C# Academy 课程共包含 4 节课。

「缓存策略与失效」这节课中我会学到什么?

控制缓存生命周期和标签。 你通过在浏览器中直接运行的动手代码来练习 C# Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C# Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C# Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「缓存策略与失效」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C# Academy 课中编写并运行代码吗?

能。每节 C# Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 速率限制算法
  2. 配置速率限制中间件
  3. 输出缓存基础
  4. 缓存策略与失效
← 返回 C# Academy