التخزين المؤقت مع Redis
التخزين المؤقت مع Redis
يُعدّ التخزين المؤقت (Caching) من أكثر تقنيات الأداء أثرًا في متناول مهندس الواجهة الخلفية. بدلًا من إعادة حساب البيانات أو جلبها في كل طلب، يحفظ التخزين المؤقت النتيجة ويعيدها فورًا في الطلبات اللاحقة. يُزوّد NestJS بوحدة CacheModule من الدرجة الأولى مبنيّة فوق cache-manager، وباستخدام Redis كمخزن خلفيّ تحصل على تخزين مؤقت موزَّع ودائم يظل حيًّا عبر إعادة التشغيل ويتوسّع عبر نُسَخ تطبيق متعدّدة.
تثبيت الاعتماديات
cache-manager-ioredis-yet هو محوّل مخزن Redis الحديث لـ cache-manager الإصدار 5 وما فوق. يستخدم ioredis داخليًّا، وهو عميل Redis الموصى به لـ Node.js في بيئة الإنتاج.
تسجيل CacheModule مع Redis
استورد CacheModule في AppModule (أو أي وحدة ميزة). استخدم CacheModule.registerAsync() لسحب تفاصيل اتصال Redis من ConfigService:
CacheModule. في التطبيقات الكبيرة هذا ما تريده دائمًا تقريبًا.
CacheInterceptor — تخزين مسارات مؤقت دون كتابة نماذج زائدة
يوفّر NestJS الـ CacheInterceptor الذي يخزّن استجابة طريقة تحكّم كاملة تلقائيًّا. طبّقه على مستوى المتحكّم أو الطريقة عبر @UseInterceptors، أو اربطه عالميًّا عبر موفّر APP_INTERCEPTOR:
يُثبّت @CacheKey إدخال التخزين المؤقت على مفتاح نصيّ ثابت بصرف النظر عن معاملات URL. ويتجاوز @CacheTTL الإعداد الافتراضي على مستوى الوحدة لذلك المعالج فقط.
عمليات التخزين المؤقت اليدوية عبر CACHE_MANAGER
للتحكّم الدقيق — كتابة وقراءة وحذف مفاتيح فردية — حقن رمز مدير التخزين المؤقت مباشرةً:
استراتيجيات إبطال التخزين المؤقت
- انتهاء الصلاحية بالوقت (TTL) — أبسط استراتيجية؛ ينتهي صلاحية التخزين تلقائيًّا بعد N ثانية. مناسب عندما تكون البيانات القديمة قليلًا مقبولة (مثل قوائم المنتجات).
- الإبطال المعتمد على الأحداث — استدعاء
cache.del(key)صراحةً عند تغيّر البيانات الأساسية (تحديث/حذف). يضمن أن القراءة التالية تجلب بيانات جديدة فورًا. - الإبطال بالنطاق/العلامة — بادئة المفاتيح ذات الصلة (مثل
products:*) والتكرار لحذف مجموعة كاملة. مفيد لإبطال عائلة موارد بأكملها دفعةً واحدة. - الكتابة المتزامنة (Write-through) — تحديث التخزين المؤقت وقاعدة البيانات في العملية ذاتها حتى لا يصبح التخزين المؤقت قديمًا؛ أكثر تعقيدًا قليلًا لكنه يضمن الاتساق.
orders:${userId}).
keyPrefix في إعداد المخزن (مثلًا 'myapp:') لتمييز مفاتيحك عن التطبيقات أو الخدمات الأخرى التي تشارك نفس نسخة Redis.
الخلاصة
تمنح CacheModule مع مخزن Redis تطبيقات NestJS تخزينًا مؤقتًا موزَّعًا ودائمًا. يتولّى CacheInterceptor التخزين المؤقت التلقائي على مستوى المسار؛ ويضبط @CacheKey و@CacheTTL النقاط النهائية الفردية. للعمليات اليدوية حقن CACHE_MANAGER واستدعاء get وset وdel. اختر دائمًا استراتيجية إبطال — TTL أو مُعتمِدة على أحداث أو كتابة متزامنة — تناسب متطلبات اتساق بياناتك، وأبقِ البيانات الخاصة بمستخدم خلف مفاتيح مرتبطة بذلك المستخدم.