0Pricing
C# Academy · บทเรียน

นโยบายแคชและการทำให้แคชใช้ไม่ได้

ควบคุมอายุการใช้งานและแท็กของแคช

นโยบายแคชและการทำให้แคชใช้ไม่ได้ เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน 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 ให้ฉีดการพึ่งพานี้เข้าไป แล้วเรียก 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);

กฎ Vary-By ในโยบาย

รวมการหมดอายุ แท็ก และกฎ Vary-By ไว้ในนโยบายที่ตั้งชื่อเดียวกัน เพื่อสร้างข้อตกลงการแคชที่สมบูรณ์

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 ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “นโยบายแคชและการทำให้แคชใช้ไม่ได้”

ควบคุมอายุการใช้งานและแท็กของแคช คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “นโยบายแคชและการทำให้แคชใช้ไม่ได้” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม

ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. อัลกอริทึมจำกัดอัตรา
  2. การกำหนดค่ามิดเดิลแวร์จำกัดอัตรา
  3. พื้นฐานการแคชผลลัพธ์
  4. นโยบายแคชและการทำให้แคชใช้ไม่ได้
← กลับไปที่ C# Academy