التخزين المؤقت في TypeScript: Redis وnode-cache وأدوات أخرى

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

التخزين المؤقت في TypeScript: Redis وأدوات أخرى



التخزين المؤقت هو أحد الاستراتيجيات الرئيسية لتحسين أداء تطبيقات الويب. في نظام TypeScript وNode.js، توجد عدة مكتبات قوية تسمح بإدارة التخزين المؤقت للبيانات بكفاءة. في هذه المقالة، سنشرح بالتفصيل الأدوات الشائعة وتطبيقاتها وأفضل الممارسات.



لماذا نحتاج إلى التخزين المؤقت؟

يسمح التخزين المؤقت بتخزين البيانات المطلوبة بشكل متكرر في مخزن سريع مؤقتاً، لتجنب تنفيذ عمليات مكلفة (استعلامات قاعدة البيانات، الحسابات، واجهات برمجة التطبيقات الخارجية) في كل مرة. هذا يقلل الحمل على الخادم ويقلل وقت الاستجابة.



الأدوات الرئيسية للتخزين المؤقت في TypeScript



1. Redis عبر مكتبة ioredis

Redis هو مخزن بيانات عالي الأداء في الذاكرة، يدعم هياكل بيانات متنوعة. بالنسبة لـ TypeScript، الخيار الأفضل هو ioredis - عميل مع دعم كامل للأنواع والوعود.



import Redis from 'ioredis';

// إنشاء عميلconst redis = new Redis({ host: 'localhost', port: 6379,});

// دالة للتخزين المؤقت مع TTLasync function cacheGet(key: string): Promise<string | null> { const data = await redis.get(key); return data;}

async function cacheSet(key: string, value: string, ttl: number = 3600): Promise<void> { await redis.setex(key, ttl, value);}

// مثال على الاستخدامasync function getUserData(userId: string) { const cacheKey = `user:${userId}`; const cached = await cacheGet(cacheKey); if (cached) { return JSON.parse(cached); } // محاكاة طلب مكلف const userData = { id: userId, name: 'John Doe' }; await cacheSet(cacheKey, JSON.stringify(userData), 3600); return userData;}


2. node-cache - تخزين مؤقت في الذاكرة للمشاريع الصغيرة

node-cache هي مكتبة بسيطة في الذاكرة، لا تتطلب تبعيات خارجية. مثالية للنماذج الأولية والخدمات المصغرة ذات حجم البيانات الصغير.



import NodeCache from 'node-cache';

const myCache = new NodeCache({ stdTTL: 600, checkperiod: 120 });

// حفظ البياناتmyCache.set('key', { data: 'value' });

// الحصول على البياناتconst value = myCache.get('key');if (value) { console.log('من التخزين المؤقت:', value);} else { console.log('التخزين المؤقت فارغ، جاري طلب البيانات...');}

// الحذف حسب المفتاحmyCache.del('key');

// مسح التخزين المؤقت بالكاملmyCache.flushAll();


3. async-cache-dedupe - لمنع الطلبات المكررة

تحل هذه المكتبة مشكلة "تدافع التخزين المؤقت" (عندما تحاول طلبات متعددة ملء التخزين المؤقت في نفس الوقت). تقوم تلقائياً بإزالة تكرار الطلبات المتوازية لنفس المفتاح.



import { createCache } from 'async-cache-dedupe';

const cache = createCache({ ttl: 60, // وقت الحياة بالثواني stale: 10, // الوقت الذي تعتبر فيه البيانات قديمة ولكن يمكن إرجاعها});

// تغليف دالة غير متزامنةconst getData = cache.define('getData', async (id: number) => { // طلب مكلف const result = await fetch(`https://api.example.com/data/${id}`); return result.json();});

// الاستخدامconst result = await getData(42);


استراتيجيات إبطال التخزين المؤقت

من أصعب المهام في التخزين المؤقت هو الإبطال - تحديث البيانات القديمة. دعنا نستعرض الأساليب الرئيسية:



  • TTL (وقت الحياة) - يتم حذف البيانات تلقائياً بعد وقت محدد. طريقة بسيطة وموثوقة.
  • الإبطال الكسول - نتحقق من حداثة البيانات عند كل طلب (على سبيل المثال، حسب الإصدار).
  • الإبطال القائم على الأحداث - عند تغيير البيانات في قاعدة البيانات، نرسل حدثاً لمسح التخزين المؤقت المقابل.
  • الكتابة من خلال - نقوم بتحديث التخزين المؤقت بالتزامن مع الكتابة في القاعدة الرئيسية.

توصيات