التخزين المؤقت في TypeScript: Redis وMemcached والحلول المدمجة: من الألف إلى الياء
\n\nالتخزين المؤقت هو أحد الأدوات الرئيسية لتحسين أداء تطبيقات الويب والخدمات. في نظام TypeScript وNode.js البيئي، يمكن للمطورين الاختيار بين أنظمة خارجية قوية (Redis, Memcached) وحلول مدمجة خفيفة الوزن. في هذه المقالة، سنشرح جميع الأساليب الثلاثة، ونقدم أمثلة عملية على الكود بلغة TypeScript، ونساعدك في اختيار الاستراتيجية المثلى لمشروعك.
\n\nلماذا نحتاج إلى التخزين المؤقت في TypeScript؟
\nيسمح التخزين المؤقت بتقليل وقت استجابة الخادم، وتخفيف الحمل على قواعد البيانات وواجهات برمجة التطبيقات الخارجية، وتقليل التأخير عند الطلبات المتكررة. في TypeScript، الذي يعمل فوق Node.js، يكون التخزين المؤقت مفيدًا بشكل خاص من أجل:
\n- \n
- تخزين نتائج العمليات الحسابية المكلفة؛ \n
- التخزين المؤقت للردود من واجهات برمجة التطبيقات الخارجية؛ \n
- حفظ جلسات المستخدمين؛ \n
- تقليل عدد الطلبات إلى قاعدة البيانات. \n
1. الحلول المدمجة للتخزين المؤقت في TypeScript
\nللمشاريع الصغيرة أو النماذج الأولية، يمكن استخدام الأدوات المدمجة في Node.js دون تثبيت حزم إضافية.
\n\n1.1. استخدام Map
\nالطريقة الأبسط هي استخدام كائن Map أو كائن بسيط. ومع ذلك، فإن هذا التخزين المؤقت يعيش فقط في ذاكرة عملية واحدة ويُفقد عند إعادة التشغيل.
// تخزين مؤقت بسيط يعتمد على 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\n1.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\n2. التخزين المؤقت باستخدام Redis في TypeScript
\nRedis هو مخزن بيانات شائع في الذاكرة (in-memory) يدعم هياكل بيانات متقدمة، ونشر/اشتراك (pub/sub)، والاستمرارية. بالنسبة لـ TypeScript، يتم استخدام الحزمة ioredis.
2.1. التثبيت والاتصال
\nnpm install ioredis\nnpm install @types/ioredis --save-dev\nimport 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\n2.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\n2.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