นโยบายแคชและการทำให้แคชใช้ไม่ได้
ควบคุมอายุการใช้งานและแท็กของแคช
นโยบายแคชและการทำให้แคชใช้ไม่ได้ เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- อัลกอริทึมจำกัดอัตรา
- การกำหนดค่ามิดเดิลแวร์จำกัดอัตรา
- พื้นฐานการแคชผลลัพธ์
- นโยบายแคชและการทำให้แคชใช้ไม่ได้