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

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

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

ابدأ الدورة

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



تتطلب تطبيقات الويب الحديثة المكتوبة بـ TypeScript سرعة استجابة عالية وإدارة فعالة للموارد. واحدة من الأدوات الرئيسية لتحقيق هذا الهدف هي التخزين المؤقت. في هذه المقالة، سنقوم بتحليل ثلاثة أساليب رئيسية للتخزين المؤقت في بيئة TypeScript/Node.js: استخدام Redis وMemcached والحلول المدمجة (in-memory cache). ستتعلم كيفية اختيار الأداة المناسبة لمهمتك وسترى أمثلة عملية على الكود.



لماذا نحتاج التخزين المؤقت في TypeScript؟



يسمح التخزين المؤقت بتخزين البيانات المطلوبة بشكل متكرر مؤقتًا في مخزن سريع، لتقليل وقت الاستجابة وتخفيف الحمل على قواعد البيانات أو واجهات API الخارجية. في TypeScript الذي يعمل على Node.js، يكون التخزين المؤقت مفيدًا بشكل خاص من أجل:

  • تسريع الاستعلامات المتكررة لقاعدة البيانات؛
  • تقليل زمن الانتظار عند الاتصال بالخدمات الخارجية؛
  • تحسين العمليات الحسابية المعقدة؛
  • إدارة جلسات المستخدمين.


دعنا نستعرض ثلاثة أنواع رئيسية من التخزين المؤقت المتاحة لمطور TypeScript.



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



الطريقة الأبسط والأسرع هي تخزين البيانات في ذاكرة عملية Node.js نفسها. يمكن استخدام Map أو مكتبات أكثر تقدمًا مثل node-cache لهذا الغرض.



المزايا:

  • سرعة قصوى (لا توجد استدعاءات شبكية)؛
  • سهولة التنفيذ؛
  • لا يتطلب تثبيت خدمات خارجية.


العيوب:

  • تُفقد البيانات عند إعادة تشغيل التطبيق؛
  • محدود بحجم الذاكرة العشوائية لعملية واحدة؛
  • لا يعمل في وضع الكتلة (كل عملية لها ذاكرة تخزين مؤقت خاصة بها).


مثال باستخدام node-cache



قم بتثبيت المكتبة:

npm install node-cache


تنفيذ خدمة تخزين مؤقت بسيطة:

import NodeCache from 'node-cache';

class MemoryCacheService { private cache: NodeCache;

constructor(ttlSeconds: number = 600) { this.cache = new NodeCache({ stdTTL: ttlSeconds, checkperiod: 120 }); }

public get<T>(key: string): T | undefined { return this.cache.get<T>(key); }

public set<T>(key: string, value: T, ttl?: number): boolean { return this.cache.set(key, value, ttl); }

public has(key: string): boolean { return this.cache.has(key); }

public del(key: string): number { return this.cache.del(key); }

public flush(): void { this.cache.flushAll(); }}

// الاستخدامconst cacheService = new MemoryCacheService(300); // TTL = 5 دقائق

async function getData(id: string): Promise<any> { const cached = cacheService.get<any>(`data:${id}`); if (cached) { return cached; }

// محاكاة عملية مكلفة const data = await fetchFromDatabase(id); cacheService.set(`data:${id}`, data); return data;}


2. التخزين المؤقت باستخدام Redis



Redis هو مخزن بيانات قوي في الذاكرة (in-memory) يُستخدم غالبًا كذاكرة تخزين مؤقت. يدعم هياكل بيانات معقدة (سلاسل، تجزئات، قوائم، مجموعات) ويمكنه العمل في وضع الكتلة.



المزايا:

  • استمرارية البيانات (اختياري)؛
  • دعم هياكل البيانات المعقدة (مثل المجموعات المرتبة)؛
  • آليات TTL مدمجة (Time-To-Live)؛
  • أداء ممتاز (حتى 100,000 عملية/ثانية)؛
  • دعم Pub/Sub لتبادل الرسائل.


العيوب:

  • يتطلب تثبيت وتهيئة خادم منفصل؛
  • يستخدم ذاكرة أكثر من الحلول المدمجة؛
  • تأخيرات الشبكة (وإن كانت ضئيلة).


مثال للعمل مع Redis في Typ

المدونات

توصيات الكتب