التخزين المؤقت في JavaScript: Redis وMemcached والحلول المدمجة لـ Node.js

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

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

ابدأ الدورة
```html

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



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



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

بدون التخزين المؤقت، قد يؤدي كل طلب إلى الخادم إلى عمليات مكلفة: قراءة من قاعدة البيانات، أو حسابات معقدة، أو استدعاءات لواجهات برمجة التطبيقات الخارجية. يحفظ التخزين المؤقت نتيجة الطلب الأول ويعيدها عند الطلبات المتكررة. هذا يقلل الحمل على الخادم، ويقلل وقت الاستجابة، ويحسن تجربة المستخدم.



السيناريوهات الرئيسية لاستخدام التخزين المؤقت في Node.js:

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


التخزين المؤقت المدمج في JavaScript (Node.js)

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



مثال: تخزين مؤقت باستخدام Map مع TTL (مدة الصلاحية)

class SimpleCache {    constructor(ttl = 60000) {        this.cache = new Map();        this.ttl = ttl; // مدة الحياة بالمللي ثانية (افتراضياً دقيقة واحدة)    }

set(key, value) { this.cache.set(key, { value, timestamp: Date.now() }); }

get(key) { const item = this.cache.get(key); if (!item) return null; if (Date.now() - item.timestamp > this.ttl) { this.cache.delete(key); return null; } return item.value; }

delete(key) { this.cache.delete(key); }

clear() { this.cache.clear(); }}

// الاستخدامconst cache = new SimpleCache(30000); // 30 ثانيةcache.set('user_123', { name: 'إيفان', role: 'admin' });const user = cache.get('user_123');console.log(user); // { name: 'إيفان', role: 'admin' }


المزايا: زمن وصول صفري، بساطة، لا يتطلب تبعيات خارجية.
العيوب: البيانات تُفقد عند إعادة التشغيل، محدودة بذاكرة عملية واحدة، غير مناسبة للأنظمة الموزعة.



للحصول على تخزين مؤقت مدمج أكثر تقدماً، يمكن استخدام حزمة node-cache، التي تضيف التنظيف التلقائي والإحصائيات ودعم المفاتيح النصية.



Redis: تخزين مؤقت موزع لـ Node.js

Redis هو مخزن بيانات في الذاكرة (in-memory) يُستخدم غالباً كذاكرة تخزين مؤقت. في Node.js، للعمل مع Redis تُستخدم حزمة ioredis (الأحدث من redis).



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

npm install ioredis


const Redis = require('ioredis');const redis = new Redis({    host: 'localhost',    port: 6379,    // password: 'your-password' // إذا لزم الأمر});

redis.on('connect', () => console.log('متصل بـ Redis'));redis.on('error', (err) => console.error('خطأ Redis:', err));


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

const Redis = require('ioredis');const redis = new Redis();

async function getCachedData(key, fetchFunction, ttl = 3600) { // محاولة الحصول من التخزين المؤقت const cached = await redis.get(key); if (cached) { return JSON.parse(cached); }

// إذا لم يكن موجوداً - نحصل على البيانات ونحفظها const data = await fetchFunction(); await redis.setex(key, ttl, JSON.stringify(data)); return data;}

// مثال الاستخدام: التخزين المؤقت ```

المدونات

توصيات الكتب