المستوى: مبتدئ. هذا الدليل يفترض إنك تعرف تكتب دالة بسيطة في Node.js وتشغّل query على PostgreSQL، ومش لازم تكون جرّبت Redis قبل كده.
لو نفس صفحة المنتج في موقعك بترجع لكل زائر من قاعدة البيانات، وبتاخد قرب الثانية، انت بتكرّر شغل تقدر تعمله مرة واحدة. في آخر الدليل هيبقى عندك دالة قراءة بترجع في حوالي 5 مللي ثانية بدل 820، بكود تقدر تنسخه دلوقتي.
ابنِ طبقة كاش بـ Redis أمام قاعدة بياناتك في Node.js
المشكلة باختصار
قاعدة البيانات بتخزّن بياناتها على القرص، والقرص أبطأ من الذاكرة بمراحل. كل ما المستخدم يطلب نفس المنتج، السيرفر بيروح للقرص، يبحث، يرجّع. ده هدر لو الداتا دي مبتتغيّرش كل ثانية. الحل إنك تحتفظ بنسخة من الإجابة في الذاكرة، وترجّعها من غير ما تلمس القرص.
الفكرة بمثال بسيط، ثم علميًا
تخيّل مكتبك. الورقة اللي بتحتاجها كل شوية بتحطها في درج المكتب اللي قدامك، توصلها في ثانية. الأوراق النادرة بتفضل في الأرشيف في الدور التحت، لو احتجت واحدة بتنزل تجيبها. مبتنقلش الأرشيف كله فوق، وبرضه مبتنزلش الأرشيف في كل مرة.
علميًا: الدرج ده اسمه الكاش (cache)، و Redis قاعدة بيانات بتخزّن المفاتيح والقيم في الذاكرة (RAM) بدل القرص، فالقراءة منها بتتقاس بالمللي ثانية. النمط اللي بنستخدمه اسمه cache-aside (أو lazy loading): التطبيق بيسأل الكاش الأول، ولو ملقاش (miss) بيروح لقاعدة البيانات مرة واحدة، وبعدين يخزّن النتيجة في الكاش عشان الطلب الجاي يبقى hit.
الخطوات
- شغّل Redis وركّب المكتبات. أسرع طريقة محليًا هي حاوية Docker.
- اعمل اتصال واحد لكل من Redis و PostgreSQL على مستوى التطبيق، مش لكل طلب.
- اقرأ بنمط cache-aside: اسأل Redis، لو hit رجّع فورًا، لو miss اقرأ من الداتابيز وخزّن.
- حُط مهلة صلاحية (TTL) على كل مفتاح عشان الداتا متبقاش قديمة للأبد.
- أبطِل الكاش عند التعديل: امسح المفتاح مع أي UPDATE عشان القراءة الجاية تجيب الجديد.
- قِس الفرق بأداة حِمل بسيطة قبل وبعد.
1) التشغيل والتركيب
# شغّل Redis 7 في ثوانٍ
docker run -d --name redis -p 6379:6379 redis:7
# مكتبتين فقط: عميل Redis وعميل PostgreSQL
npm install ioredis pg