تخزين الكائنات المتسلسلة مؤقتًا
خزّنوا الكائنات المعقدة واسترجعوها
تخزين الكائنات المتسلسلة مؤقتًا درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.
تخزين ما هو أكثر من السلاسل النصية
تخزّن التطبيقات الفعلية الكائنات مؤقتًا، وليس السلاسل النصية فقط. وبما أن IDistributedCache يخزّن البايتات، فعليكم إجراء تسلسل للكائن إلى تمثيل من البايتات أو السلسلة النصية، ثم إلغاء التسلسل عند إخراجه. ويُعد JSON الخيار المعتاد.
إجراء التسلسل باستخدام System.Text.Json
استخدموا System.Text.Json لتحويل كائن إلى سلسلة JSON، ثم خزّنوها باستخدام SetStringAsync.
using System.Text.Json;
var product = new Product { Id = 1, Name = "Coffee", Price = 4.5m };
string json = JsonSerializer.Serialize(product);
await _cache.SetStringAsync("product:1", json);إلغاء التسلسل عند القراءة
عند القراءة، اجلبوا سلسلة JSON وأعيدوا إلغاء تسلسلها إلى نوعها، مع تذكّر التعامل مع القيمة null في حالة عدم العثور على القيمة في ذاكرة التخزين المؤقت.
string json = await _cache.GetStringAsync("product:1");
if (json is null) return null;
Product product = JsonSerializer.Deserialize<Product>(json);مساعد عام قابل لإعادة الاستخدام
غلّفوا منطق إجراء التسلسل وإلغائه في أساليب امتداد، حتى يتمكن المستدعون من تخزين أي نوع مؤقتًا بطريقة واضحة.
public static async Task SetAsync<T>(
this IDistributedCache cache, string key, T value,
DistributedCacheEntryOptions options)
{
string json = JsonSerializer.Serialize(value);
await cache.SetStringAsync(key, json, options);
}مساعد Get العام
يعيد المُسترجِع المطابق إلغاء التسلسل إلى T، ويعيد default عند عدم العثور على القيمة.
public static async Task<T> GetAsync<T>(
this IDistributedCache cache, string key)
{
string json = await cache.GetStringAsync(key);
return json is null ? default : JsonSerializer.Deserialize<T>(json);
}نمط GetOrCreate
اجمعوا بين Cache-aside وإجراء التسلسل في مساعد واحد: أعيدوا الكائن المخزّن مؤقتًا، أو نفّذوا دالة مصنع، وخزّنوا نتيجتها مؤقتًا، ثم أعيدوها.
public static async Task<T> GetOrCreateAsync<T>(
this IDistributedCache cache, string key,
Func<Task<T>> factory, DistributedCacheEntryOptions options)
{
var existing = await cache.GetAsync<T>(key);
if (existing is not null) return existing;
var created = await factory();
await cache.SetAsync(key, created, options);
return created;
}استخدام GetOrCreate
يصبح موضع الاستدعاء سطرًا واحدًا يخفي جميع تفاصيل التخزين المؤقت.
var product = await _cache.GetOrCreateAsync(
"product:1",
() => _repository.LoadProductAsync(1),
new DistributedCacheEntryOptions
{
AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(15)
});خيارات التسلسل
أعيدوا استخدام مثيل واحد من JsonSerializerOptions، مثل استخدام camelCase وتجاهل القيم الفارغة، للحفاظ على اتساق الحمولة المخزّنة مؤقتًا وصغر حجمها، وتجنب إنشاء الخيارات مرارًا.
private static readonly JsonSerializerOptions JsonOptions = new()
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
DefaultIgnoreCondition =
System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingNull
};إصدار بنية البيانات المخزّنة مؤقتًا
إذا تغيرت بنية نوع مخزّن مؤقتًا، فقد يتعذر إلغاء تسلسل JSON القديم. أدرجوا مقطع إصدار في المفتاح، مثل product:v2:1، حتى يتجاوز النشر تلقائيًا الإدخالات غير المتوافقة.
حافظوا على خفة الحمولة
خزّنوا مؤقتًا الحقول التي تحتاجون إليها فقط. تعني الحمولة الأصغر استخدامًا أقل للشبكة والذاكرة في Redis، وتسلسلًا أسرع في كل عملية قراءة وكتابة.
انتبهوا إلى تكلفة التسلسل
ليس إجراء التسلسل مجانيًا. في المسارات شديدة الاستخدام، ضعوا في الاعتبار استخدام تنسيقات مدمجة أو تخزين النتائج المُنسّقة مسبقًا مؤقتًا، وقيسوا دائمًا للتأكد من أن ذاكرة التخزين المؤقت تحقق فائدة صافية.
اختبار سريع
اختبروا تخزين الكائنات المُسلسلة مؤقتًا.
مراجعة
لتخزين الكائنات مؤقتًا، أجروا تسلسلًا لها، عادةً بصيغة JSON عبر System.Text.Json، عند الكتابة، وألغوا تسلسلها عند القراءة. تخفي الدالتان العامتان SetAsync<T>/GetAsync<T> ومساعد GetOrCreateAsync التفاصيل وتطبّقان Cache-aside بطريقة واضحة. أعيدوا استخدام JsonSerializerOptions، وأضيفوا إصدارًا إلى مفاتيح ذاكرة التخزين المؤقت عند تغير البنية، وحافظوا على خفة الحمولات، وقيسوا تكلفة التسلسل في المسارات شديدة الاستخدام.
الأسئلة الشائعة
هل درس «تخزين الكائنات المتسلسلة مؤقتًا» مجاني؟
نعم — نص درس «تخزين الكائنات المتسلسلة مؤقتًا» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تجريد IDistributedCache
- الاتصال بـ Redis
- أنماط التخزين المؤقت وانتهاؤه
- تخزين الكائنات المتسلسلة مؤقتًا