سياسات التخزين المؤقت وإبطالها
تحكّموا في مدة التخزين المؤقت والوسوم
سياسات التخزين المؤقت وإبطالها درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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
تتم عملية الإبطال من خلال 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القفل والحماية من اندفاع الطلبات
تجمع عملية تخزين المخرجات مؤقتًا حالات عدم العثور المتزامنة افتراضيًا: فعندما تصل طلبات كثيرة إلى نقطة نهاية غير مخزنة مؤقتًا في الوقت نفسه، ينفّذ طلب واحد فقط المعالج بينما تنتظر الطلبات الأخرى. ويمكنك إلغاء هذا السلوك باستخدام 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إلى حذفها عند تنفيذ عمليات الكتابة. - اجمع بين انتهاء الصلاحية (تلقائي) والإخلاء (صريح).
- استخدم مخزنًا موزعًا عند نشر التطبيق على عدة خوادم.
وبذلك يكتمل مقرر تحديد معدل الطلبات والتخزين المؤقت.
الأسئلة الشائعة
هل درس «سياسات التخزين المؤقت وإبطالها» مجاني؟
نعم — نص درس «سياسات التخزين المؤقت وإبطالها» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.
ماذا ستتعلم في «سياسات التخزين المؤقت وإبطالها»؟
تحكّموا في مدة التخزين المؤقت والوسوم تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟
لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «سياسات التخزين المؤقت وإبطالها»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟
نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- خوارزميات تحديد معدل الطلبات
- تهيئة Middleware تحديد معدل الطلبات
- أساسيات التخزين المؤقت للمخرجات
- سياسات التخزين المؤقت وإبطالها