التخزين المؤقت في JavaScript (Node.js): Redis وأدوات أخرى
التخزين المؤقت هو أحد الاستراتيجيات الرئيسية لتحسين أداء تطبيقات الخادم على Node.js. فهو يسمح بتقليل الحمل على قواعد البيانات، وتقليل زمن استجابة API، وخفض تكاليف البنية التحتية. في هذه المقالة، سنستعرض أدوات التخزين المؤقت الرئيسية لـ Node.js: Redis وNode-Cache (مكتبة مدمجة) وMemcached، ونقارن بين طرقها ونعرض أمثلة عملية على الكود.
لماذا نحتاج التخزين المؤقت في Node.js؟
بدون التخزين المؤقت، قد يؤدي كل طلب إلى مورد شائع إلى استدعاءات متكررة لقاعدة البيانات أو واجهات برمجة التطبيقات الخارجية. يحفظ التخزين المؤقت البيانات المطلوبة بشكل متكرر في تخزين سريع (ذاكرة الوصول العشوائي)، مما يوفر:
- تقليل زمن الاستجابة (latency) من 100-500 مللي ثانية إلى 1-5 مللي ثانية.
- تقليل عدد الطلبات إلى قاعدة البيانات والخدمات الخارجية.
- زيادة سعة الخادم (RPS).
1. Redis — ملك التخزين المؤقت
Redis هو مخزن بيانات من نوع "مفتاح-قيمة" في الذاكرة، يُستخدم غالبًا كذاكرة تخزين مؤقت، ووسيط رسائل، وقاعدة بيانات. في Node.js، تُستخدم مكتبة redis (أو ioredis) للعمل مع Redis.
التثبيت والتوصيل
npm install redisconst redis = require('redis');const client = redis.createClient({ url: 'redis://localhost:6379'});
client.on('error', (err) => console.error('Redis Error:', err));await client.connect();
// مثال على تخزين البيانات مؤقتًا مع TTLasync function getCachedData(key) { const cached = await client.get(key); if (cached) return JSON.parse(cached);
const freshData = { message: 'Hello from DB', time: Date.now() }; await client.setEx(key, 60, JSON.stringify(freshData)); // TTL 60 ثانية return freshData;}ميزات Redis لـ Node.js
- دعم TTL — حذف تلقائي للسجلات القديمة.
- هياكل البيانات — سلاسل، قوائم، مجموعات، تجزئات، مجموعات مرتبة.
- Pub/Sub — يمكن بناء أنظمة إشعارات فورية.
- التجميع (Clustering) — توسع أفقي دون فقدان الأداء.
2. Node-Cache — ذاكرة تخزين مؤقت خفيفة في الذاكرة بدون تبعيات خارجية
Node-Cache هي مكتبة بسيطة لتخزين البيانات مؤقتًا مباشرة في ذاكرة عملية Node.js. وهي مثالية للمشاريع الصغيرة، والخدمات المصغرة، أو عندما لا ترغب في تشغيل Redis.
التثبيت والمثال
npm install node-cacheconst NodeCache = require('node-cache');const myCache = new NodeCache({ stdTTL: 100, checkperiod: 120 });
// حفظ البياناتmyCache.set('user:123', { name: 'Alice', role: 'admin' });
// استرجاع البياناتconst user = myCache.get('user:123');if (user === undefined) { // البيانات غير موجودة في التخزين المؤقت — يجب تحميلها من قاعدة البيانات console.log('Cache miss');} else { console.log('Cache hit:', user);}
// الحذف حسب المفتاحmyCache.del('user:123');
// مسح التخزين المؤقت بالكاملmyCache.flushAll();إيجابيات وسلبيات Node-Cache
- الإيجابيات: لا يتطلب خادمًا خارجيًا، واجهة برمجة تطبيقات بسيطة، تنظيف تلقائي بناءً على TTL.
- السلبيات: يتم تخزين التخزين المؤقت في عملية واحدة فقط — يتم فقدان البيانات عند إعادة تشغيل الخادم؛ لا يمكن استخدامه بين عدة مثيلات Node.js.
3. Memcached — تخزين مؤقت موزع بأقل حمل إضافي
Memcached هو مخزن آخر شائع في الذاكرة، محسّن للتخزين المؤقت. في Node.js، تُستخدم مكتبة memcached في أغلب الأحيان.
التثبيت والمثال
npm install memcachedconst Memcached = require('memcached');const memcac