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

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

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

ابدأ الدورة

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

\n\n

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

\n\n

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

\n

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

\n
    \n
  • تخزين نتائج العمليات الحسابية المكلفة؛
  • \n
  • التخزين المؤقت للردود من واجهات برمجة التطبيقات الخارجية؛
  • \n
  • حفظ جلسات المستخدمين؛
  • \n
  • تقليل عدد الطلبات إلى قاعدة البيانات.
  • \n
\n\n

1. الحلول المدمجة للتخزين المؤقت في TypeScript

\n

للمشاريع الصغيرة أو النماذج الأولية، يمكن استخدام الأدوات المدمجة في Node.js دون تثبيت حزم إضافية.

\n\n

1.1. استخدام Map

\n

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

\n
// تخزين مؤقت بسيط يعتمد على Map\nclass SimpleCache<T> {\n    private cache = new Map<string, T>();\n\n    get(key: string): T | undefined {\n        return this.cache.get(key);\n    }\n\n    set(key: string, value: T): void {\n        this.cache.set(key, value);\n    }\n\n    clear(): void {\n        this.cache.clear();\n    }\n}\n\n// مثال على الاستخدام\nconst cache = new SimpleCache<string>();\ncache.set('user:1', 'Alice');\nconsole.log(cache.get('user:1')); // Alice
\n\n

1.2. تخزين مؤقت مع TTL (وقت الحياة)

\n

نسخة أكثر تقدمًا - تخزين مؤقت مع حذف تلقائي للسجلات بعد وقت محدد.

\n
// تخزين مؤقت مع TTL\nclass TtlCache<T> {\n    private cache = new Map<string, { value: T; expiry: number }>();\n\n    get(key: string): T | undefined {\n        const item = this.cache.get(key);\n        if (!item) return undefined;\n        if (Date.now() > item.expiry) {\n            this.cache.delete(key);\n            return undefined;\n        }\n        return item.value;\n    }\n\n    set(key: string, value: T, ttlMs: number): void {\n        this.cache.set(key, {\n            value,\n            expiry: Date.now() + ttlMs,\n        });\n    }\n}\n\n// مثال\nconst ttlCache = new TtlCache<number>();\nttlCache.set('price', 100, 5000); // يعيش لمدة 5 ثوانٍ\nsetTimeout(() => console.log(ttlCache.get('price')), 6000); // undefined
\n\n

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

\n

Redis هو مخزن بيانات شائع في الذاكرة (in-memory) يدعم هياكل بيانات متقدمة، ونشر/اشتراك (pub/sub)، والاستمرارية. بالنسبة لـ TypeScript، يتم استخدام الحزمة ioredis.

\n\n

2.1. التثبيت والاتصال

\n
npm install ioredis\nnpm install @types/ioredis --save-dev
\n
import Redis from 'ioredis';\n\nconst redis = new Redis({\n    host: 'localhost',\n    port: 6379,\n});\n\nredis.on('connect', () => console.log('متصل بـ Redis'));\nredis.on('error', (err) => console.error('خطأ في Redis', err));
\n\n

2.2. العمليات الأساسية set/get

\n
// حفظ قيمة\nawait redis.set('user:1:name', 'Alice');\n\n// الحصول على قيمة\nconst name = await redis.get('user:1:name');\nconsole.log(name); // Alice\n\n// تعيين TTL (بالثواني)\nawait redis.setex('session:123', 3600, 'active');
\n\n

2.3. العمل مع الكائنات (JSON)

\n
// حفظ كائن\nconst user = { id: 1, name: 'Alice', email: 'alice@example.com' };\nawait redis.set('user:1', JSON.stringify(user));\n\n// القراءة والتحليل\nconst r                

المدونات

توصيات الكتب