مقدمة: لماذا نحتاج إلى التخزين المؤقت في جافا سكريبت
تطبيقات الويب الحديثة على Node.js تعالج ملايين الطلبات يومياً. بدون تخزين مؤقت مناسب، كل استدعاء لقاعدة بيانات أو واجهة برمجية خارجية يُحدث تأخيراً، ويزيد من حمل الخادم، ويُضعف تجربة المستخدم. التخزين المؤقت هو تقنية تخزين مؤقت للبيانات المطلوبة بشكل متكرر في ذاكرة تخزين سريعة، بحيث لا يتم تنفيذ العمليات الثقيلة مرة أخرى عند الطلبات اللاحقة.
في نظام جافا سكريبت البيئي (Node.js)، هناك ثلاث طرق رئيسية للتخزين المؤقت:
- الحلول المدمجة (ذاكرة التخزين المؤقت في الذاكرة) — مكتبات بسيطة تخزن البيانات في ذاكرة عملية Node.js.
- Memcached — نظام تخزين مؤقت موزع يعمل في ذاكرة الوصول العشوائي.
- Redis — مخزن بيانات متقدم في الذاكرة مع دعم لهياكل بيانات معقدة.
في هذه المقالة، سنحلل كل طريقة بالتفصيل، وسنقدم أمثلة على الأكواد في جافا سكريبت، ونساعدك في اختيار الحل الأمثل لمشروعك.
الحلول المدمجة للتخزين المؤقت في Node.js
أبسط طريقة لتنظيم التخزين المؤقت هي استخدام إمكانيات جافا سكريبت المدمجة أو المكتبات خفيفة الوزن. هذه الحلول لا تتطلب تثبيت خدمات خارجية وهي مثالية للمشاريع الصغيرة أو النماذج الأولية.
ذاكرة تخزين مؤقت بسيطة باستخدام كائن
مثال أساسي للتخزين المؤقت باستخدام كائن جافا سكريبت عادي:
class SimpleCache { constructor() { this.cache = {}; }
get(key) { return this.cache[key]; }
set(key, value, ttl = 60000) { this.cache[key] = value; setTimeout(() => { delete this.cache[key]; }, ttl); }
delete(key) { delete this.cache[key]; }
clear() { this.cache = {}; }}
// Usageconst cache = new SimpleCache();cache.set('user:123', { name: 'Anna', role: 'admin' }, 30000);console.log(cache.get('user:123')); // { name: 'Anna', role: 'admin' }عيوب هذه الطريقة: لا يوجد تنظيف تلقائي للذاكرة، تسرب للذاكرة مع عدد كبير من المفاتيح، لا دعم للتخزين المؤقت الموزع.
مكتبة node-cache
خيار أكثر تقدماً هو استخدام حزمة node-cache:
const NodeCache = require('node-cache');const myCache = new NodeCache({ stdTTL: 100, checkperiod: 120 });
// Save datamyCache.set('key', { data: 'value' });
// Get dataconst value = myCache.get('key');if (value === undefined) { // Data not found — need to fetch from DB console.log('Cache miss');} else { console.log('Cache hit:', value);}
// Delete by keymyCache.del('key');
// Statisticsconsole.log(myCache.getStats());node-cache يدعم TTL (وقت الحياة)، التنظيف التلقائي للمفاتيح منتهية الصلاحية، وإحصائيات أساسية. ومع ذلك، فهو غير مناسب للتطبيقات متعددة العمليات — كل عملية Node.js تخزن نسختها الخاصة من البيانات.
Memcached: تخزين مؤقت موزع خفيف الوزن
Memcached هو نظام تخزين مؤقت موزع عالي الأداء في ذاكرة الوصول العشوائي. إنه مثالي لتخزين نتائج استعلامات قاعدة البيانات، جلسات المستخدم، وأجزاء HTML.
تثبيت وربط Memcached
أولاً، قم بتثبيت خادم Memcached والعميل الخاص بـ Node.js:
# Install server (Ubuntu/Debian)sudo apt-get install memcached
# Install client for Node.jsnpm install memcachedمثال على العمل مع Memcached في Node.js
const Memcached = require('memcached');const memcached = new Memcached('localhost:11211');
// Save data with TTL (in seconds)memcached.set('user:456', { name: 'Ivan', email: 'ivan@example.com' }, 3600, (err) => { if (err) console.error('Error saving:', err);});
// Get datamemcached.get('user:456', (err, data) => { if