التخزين المؤقت في Node.js: Redis وMemcached والذاكرة المدمجة

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

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

ابدأ الدورة

التخزين المؤقت في JavaScript (Node.js): Redis وأدوات أخرى



التخزين المؤقت هو أحد أكثر الطرق فعالية لتحسين أداء تطبيقات الويب على Node.js. فهو يسمح بتقليل وقت الاستجابة، وتخفيف الحمل على قواعد البيانات، وتقليل تكاليف البنية التحتية. في هذه المقالة، سنستعرض أدوات التخزين المؤقت الرئيسية في بيئة Node.js: Redis وMemcached والتخزين المؤقت المدمج في الذاكرة (in-memory cache). ستتعرف على متى تختار أي أداة، وسترى أمثلة عملية على الأكواد.



لماذا نحتاج التخزين المؤقت في Node.js؟

Node.js هو بيئة أحادية الخيط ولكنها غير متزامنة. كل طلب إلى قاعدة البيانات أو API خارجي هو انتظار (I/O). يسمح التخزين المؤقت بحفظ نتيجة عملية مكلفة (مثل استعلام SQL معقد أو تحليل HTML) وإعادتها فورًا. حالات الاستخدام الرئيسية:

  • حفظ نتائج الاستعلامات إلى قاعدة البيانات (خاصة الاستعلامات التجميعية)
  • تخزين استجابات APIs الخارجية مؤقتًا (الطقس، أسعار العملات)
  • تخزين جلسات المستخدمين
  • تخزين البيانات المحسوبة مؤقتًا (مثل عرض القوالب)


1. Redis — ملك التخزين المؤقت

Redis هو مخزن بيانات في الذاكرة (in-memory data store) يُستخدم غالبًا كذاكرة تخزين مؤقت. يعمل كعملية منفصلة، ويدعم هياكل بيانات معقدة (سلاسل، تجزئات، قوائم، مجموعات) ويحتوي على آليات TTL مدمجة (وقت حياة المفتاح).



التثبيت والاتصال

للعمل، ستحتاج إلى خادم Redis مثبت (محليًا أو في Docker). في Node.js نستخدم الحزمة redis:

npm install redis


مثال: تخزين البيانات مؤقتًا مع TTL

const redis = require('redis');const client = redis.createClient();

client.on('error', (err) => console.error('Redis error:', err));

// دالة غير متزامنة لجلب البيانات مع التخزين المؤقتasync function getCachedData(key, fetchFunction, ttlSeconds = 60) { // نحاول الحصول من التخزين المؤقت const cached = await client.get(key); if (cached) { return JSON.parse(cached); }

// إذا لم يكن موجودًا — نستدعي الدالة المكلفة const freshData = await fetchFunction();

// نحفظ في التخزين المؤقت مع TTL await client.setEx(key, ttlSeconds, JSON.stringify(freshData)); return freshData;}

// الاستخدام: نخزن نتيجة استعلام قاعدة البيانات مؤقتًاconst users = await getCachedData('users:list', () => db.query('SELECT * FROM users'), 120);


مزايا Redis

  • أداء عالٍ (ملايين العمليات في الثانية)
  • دعم TTL وpub/sub والمعاملات
  • الاستمرارية (يمكن الحفظ على القرص)
  • مناسب للأنظمة الموزعة (عدة خوادم Node.js)


العيوب

  • يتطلب خادم/حاوية منفصلة
  • يستهلك ذاكرة الوصول العشوائي
  • مفرط في التعقيد للتطبيقات البسيطة أحادية الخيط


2. Memcached — خفيف وسريع

Memcached هو ذاكرة تخزين مؤقت أخرى شائعة في الذاكرة، لكنها أبسط من Redis: سلاسل فقط، لا استمرارية، لا هياكل معقدة. مثالي للتخزين المؤقت البسيط للبيانات.



التثبيت والمثال

npm install memcached
const Memcached = require('memcached');const memcached = new Memcached('localhost:11211');

async function getCachedData(key, fetchFunction, ttlSeconds = 60) { return new Promise((resolve, reject) => { memcached.get(key, async (err, data) => { if (data) return resolve(JSON.parse(data));

const freshData = await fetchFunction(); memcached.set(key, JSON.stringify(freshData), ttlSeconds, (err) => { if (err) reject(err); resolve(freshData); }); }); });}


متى نستخدم Memcached؟

  • تحتاج فقط إلى تخزين مؤقت بسيط من نوع مفتاح-قيمة
  • لا حاجة لحفظ البيانات بعد إعادة التشغيل
  • الموارد محدودة (Memcached أخف من Redis)


3. In

توصيات