التخزين المؤقت في 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أيضاً في المكتبة
توصيات