التخزين المؤقت في JavaScript: Redis وMemcached والحلول المدمجة من الألف إلى الياء

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

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

ابدأ الدورة

التخزين المؤقت في JavaScript: Redis وMemcached والحلول المدمجة: من الألف إلى الياء

\n\n

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

\n\n

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

\n

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

\n
    \n
  • تقليل زمن الاستجابة (latency) للطلبات المتكررة
  • \n
  • تقليل الحمل على قواعد البيانات (PostgreSQL، MongoDB وغيرها)
  • \n
  • توفير موارد الحوسبة للخادم
  • \n
  • زيادة سعة التطبيق (throughput)
  • \n
\n\n

التخزين المؤقت المدمج في Node.js (In-Memory Cache)

\n

أبسط طريقة هي استخدام كائن Map أو Object في النطاق العام. هذا مناسب للمشاريع الصغيرة أو البيانات التي تعيش ضمن عملية واحدة.

\n\n

مثال: تخزين مؤقت بسيط باستخدام Map

\n
const cache = new Map();\n\nfunction getCachedData(key) {\n  if (cache.has(key)) {\n    const entry = cache.get(key);\n    if (Date.now() < entry.expiry) {\n      return entry.data;\n    } else {\n      cache.delete(key); // حذف البيانات منتهية الصلاحية\n    }\n  }\n  return null;\n}\n\nfunction setCachedData(key, data, ttlMs = 60000) {\n  cache.set(key, {\n    data,\n    expiry: Date.now() + ttlMs\n  });\n}\n\n// الاستخدام:\nsetCachedData('user:123', { name: 'Alice' }, 30000);\nconst user = getCachedData('user:123');\nconsole.log(user); // { name: 'Alice' }
\n\n

المزايا: البساطة، عدم وجود تأخير في الشبكة، لا يتطلب تثبيت خدمات إضافية.
\nالعيوب: البيانات غير مشتركة بين عمليات/خوادم متعددة، محدودة بذاكرة عملية واحدة.

\n\n

Memcached: التخزين المؤقت الموزع

\n

Memcached هو نظام تخزين مؤقت موزع عالي الأداء في الذاكرة. إنه بسيط وسريع ومناسب لتخزين كميات صغيرة من البيانات (مثل الجلسات أو أجزاء HTML). بالنسبة لـ Node.js، توجد وحدة شائعة تسمى memcached.

\n\n

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

\n
npm install memcached
\n\n

مثال للعمل مع Memcached

\n
const Memcached = require('memcached');\nconst memcached = new Memcached('localhost:11211');\n\n// كتابة البيانات مع TTL (بالثواني)\nmemcached.set('user:456', { name: 'Bob' }, 3600, (err) => {\n  if (err) console.error('خطأ في الكتابة:', err);\n});\n\n// قراءة البيانات\nmemcached.get('user:456', (err, data) => {\n  if (err) {\n    console.error('خطأ في القراءة:', err);\n  } else if (data) {\n    console.log('البيانات من التخزين المؤقت:', data);\n  } else {\n    console.log('التخزين المؤقت فارغ - لم يتم العثور على بيانات');\n  }\n});\n\n// إغلاق الاتصال عند إنهاء العمل\nprocess.on('SIGINT', () => {\n  memcached.end();\n});
\n\n

المزايا: بساطة API، سرعة عالية، توزيع بين الخوادم.
\nالعيوب: لا يوجد نسخ متماثل مدمج، فقدان البيانات عند إعادة التشغيل، مجموعة محدودة من أنواع البيانات.

\n\n

Redis: تخزين مؤقت قوي مع إمكانيات متقدمة

\n

Redis ليس مجرد تخزين مؤقت، بل هو مخزن بيانات كامل في الذاكرة يدعم الهياكل المعقدة (سلاسل، قوائم، مجموعات، تجزئات). يدعم الاستمرارية والنسخ المتماثل والمعاملات. بالنسبة لـ Node.js، نستخدم مكتبة redis.

\n\n

التثبيت

\n
npm install redis
\n\n

مثال: التخزين المؤقت مع Red

المدونات

توصيات الكتب