التخزين المؤقت في TypeScript: Redis وأدوات أخرى لـ Node.js
التخزين المؤقت هو أحد الآليات الأساسية لتحسين أداء تطبيقات الويب. في مشاريع TypeScript على Node.js، يسمح الكاش بتقليل وقت استجابة API، وتخفيف الحمل على قواعد البيانات، وتقليل التكاليف الناتجة عن الاستدعاءات الخارجية. في هذه المقالة، سنستعرض المكتبات الشائعة للتخزين المؤقت، وإعداداتها، وأمثلة عملية.
لماذا نحتاج التخزين المؤقت؟
بدون الكاش، قد يؤدي كل طلب إلى الخادم إلى معالجة متكررة للبيانات: القراءة من قاعدة البيانات، أو العمليات الحسابية المعقدة، أو الاتصال بـ APIs خارجية. يحفظ الكاش نتيجة الاستدعاء الأول ويعيدها في الطلبات المتكررة خلال أجزاء من الثانية. السيناريوهات الرئيسية:
- تخزين ردود الخدمات الخارجية مؤقتًا (الطقس، أسعار العملات)؛
- تخزين البيانات المطلوبة بشكل متكرر (القواميس، الإعدادات)؛
- تقليل وقت عرض الصفحات؛
- الحد من عدد الاستعلامات إلى قاعدة البيانات.
المكتبات الشائعة للتخزين المؤقت في TypeScript
1. Redis (عبر ioredis)
Redis هو مخزن بيانات في الذاكرة يعمل كخادم. أفضل عميل لـ TypeScript هو ioredis مع دعم كامل للأنواع. التثبيت:
npm install ioredisnpm install -D @types/ioredisمثال على كاش أساسي مع TTL (مدة الصلاحية):
import Redis from 'ioredis';
const redis = new Redis({ host: 'localhost', port: 6379,});
// حفظ البيانات لمدة 60 ثانيةawait redis.set('user:123', JSON.stringify({ name: 'آنا' }), 'EX', 60);
// استرجاع البياناتconst cached = await redis.get('user:123');if (cached) { const user = JSON.parse(cached); console.log(user.name); // آنا}المزايا: تخزين موزع، حذف تلقائي للمفاتيح، دعم الهياكل المعقدة (القوائم، التجزئات). العيوب: يتطلب خادم Redis قيد التشغيل، تأخير بسبب استدعاء الشبكة.
2. node-cache (في الذاكرة)
node-cache هي مكتبة بسيطة للتخزين المؤقت في ذاكرة العملية. لا تتطلب تبعيات خارجية. التثبيت:
npm install node-cachenpm install -D @types/node-cacheمثال:
import NodeCache from 'node-cache';
const myCache = new NodeCache({ stdTTL: 120 }); // TTL افتراضي 120 ثانية
// حفظmyCache.set('config', { theme: 'dark', lang: 'ar' });
// استرجاعconst config = myCache.get('config');if (config) { console.log(config.theme); // dark}
// حذفmyCache.del('config');مناسبة للتطبيقات الصغيرة التي لا تحتاج إلى مزامنة بين الخوادم.
3. memory-cache
مكتبة أخرى في الذاكرة بواجهة برمجية بسيطة. تتميز بالبساطة وعدم وجود تبعيات:
npm install memory-cacheمثال:
import cache from 'memory-cache';
cache.put('weather', { temp: 22, condition: 'sunny' }, 300_000); // 5 دقائق
const weather = cache.get('weather');if (weather) { console.log(`درجة الحرارة: ${weather.temp}°C`);}
// التحقق من وجود المفتاحif (cache.keys().includes('weather')) { // ...}استراتيجيات التخزين المؤقت لـ TypeScript
اختيار الاستراتيجية يعتمد على طبيعة البيانات:
- Write-through — تُكتب البيانات في الكاش وقاعدة البيانات في نفس الوقت. يضمن الاتساق لكنه يزيد وقت الكتابة.
- Write-behind — الكتابة في الكاش فورية، وفي قاعدة البيانات بشكل غير متزامن. سريع لكن قد يؤدي إلى فقدان البيانات عند حدوث عطل.
- Cache-aside — التطبيق يتحقق من الكاش بنفسه، وعند عدم وجود البيانات يقرأ من قاعدة البيانات ويملأ الكاش. النمط الأكثر شيوعًا.
تنفيذ Cache-aside في TypeScript باستخدام ioredis:
async function getUserById(id: number) { const cacheKey = `user:${id}`; const cached = await redis.get(cacheKey);
if