التخزين المؤقت في TypeScript: Redis وMemcached والحلول داخل الذاكرة

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

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

ابدأ الدورة

التخزين المؤقت في TypeScript: Redis وMemcached والحلول داخل الذاكرة



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



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

يسمح التخزين المؤقت بتقليل وقت استجابة الخادم، وتخفيف الحمل على قواعد البيانات وواجهات API الخارجية، بالإضافة إلى تحسين تجربة المستخدم. السيناريوهات الرئيسية للاستخدام:

  • حفظ نتائج العمليات الحسابية المكلفة
  • تخزين الردود من واجهات API الخارجية مؤقتاً
  • تخزين جلسات المستخدمين
  • تخزين أجزاء من صفحات HTML مؤقتاً


1. ioredis — عميل متقدم لـ Redis

ioredis هي المكتبة الأكثر شيوعاً للعمل مع Redis في Node.js وTypeScript. وهي تدعم التجميع (Clustering)، ونشر/اشتراك (Pub/Sub)، والمعاملات (Transactions)، وإعادة الاتصال التلقائي.



التثبيت:

npm install ioredisnpm install @types/ioredis --save-dev


الاستخدام الأساسي مع TypeScript:

import Redis from 'ioredis';

// الاتصال بـ Redis المحليconst redis = new Redis({ host: 'localhost', port: 6379, retryStrategy: (times) => Math.min(times * 50, 2000)});

// دالة لتخزين البيانات مؤقتاًasync function getCachedData(key: string): Promise<string | null> { const cached = await redis.get(key); if (cached) { console.log('بيانات من الذاكرة المؤقتة'); return cached; } // محاكاة الحصول على البيانات من قاعدة البيانات const data = `Data for ${key} at ${new Date().toISOString()}`; await redis.setex(key, 3600, data); // TTL لمدة ساعة return data;}

// مثال على الاستخدام(async () => { const result = await getCachedData('user:123'); console.log(result);})();


تخزين الكائنات مؤقتاً:

interface User {    id: number;    name: string;    email: string;}

async function cacheUser(user: User): Promise<void> { await redis.setex(`user:${user.id}`, 3600, JSON.stringify(user));}

async function getUserFromCache(id: number): Promise<User | null> { const cached = await redis.get(`user:${id}`); return cached ? JSON.parse(cached) : null;}


2. node-cache — تخزين مؤقت بسيط داخل الذاكرة

node-cache هي مكتبة خفيفة لتخزين البيانات في الذاكرة العاملة لعملية Node.js. وهي مثالية للمشاريع الصغيرة أو النماذج الأولية التي لا تتطلب تخزيناً مؤقتاً موزعاً.



التثبيت:

npm install node-cachenpm install @types/node-cache --save-dev


مثال على الاستخدام:

import NodeCache from 'node-cache';

const myCache = new NodeCache({ stdTTL: 600, // وقت الحياة الافتراضي (بالثواني) checkperiod: 120 // فترة التحقق من المفاتيح منتهية الصلاحية});

// حفظ واسترجاع البياناتmyCache.set('key1', { value: 42 });const value = myCache.get('key1');console.log(value); // { value: 42 }

// التحقق من وجود المفتاحif (myCache.has('key1')) { console.log('المفتاح موجود');}

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

// الحصول على الإحصائياتconst stats = myCache.getStats();console.log(`عدد المفاتيح في الذاكرة المؤقتة: ${stats.keys}`);


3. lru-cache — ذاكرة تخزين مؤقت بسياسة LRU

lru-cache هي تطبيق لذاكرة تخزين مؤقت تستخدم خوارزمية الإزالة "الأقل استخداماً مؤخراً" (Least Recently Used). وهي تحد من عدد الإدخالات المخزنة، وتقوم تلقائياً بحذف الأقدم. وهي مناسبة تماماً للتخزين المؤقت بحجم ثابت.



التثبيت:

npm install lru-cache
                
    
    

توصيات