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

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

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

ابدأ الدورة

مقدمة: لماذا التخزين المؤقت في تطبيقات Swift؟

\n

التخزين المؤقت هو أحد التقنيات الرئيسية لتحسين أداء تطبيقات الهواتف المحمولة والخوادم. في عالم Swift (iOS/macOS)، يسمح التخزين المؤقت الصحيح بتقليل وقت تحميل البيانات، وتقليل الحمل على الشبكة وقاعدة البيانات، بالإضافة إلى تحسين تجربة المستخدم. في هذه المقالة، سنستعرض ثلاثة أساليب رئيسية للتخزين المؤقت في Swift: الحل المضمن NSCache، وأنظمة الخوادم الشائعة Redis وMemcached، بالإضافة إلى دمجها في مشاريع iOS/macOS.

\n\n

1. التخزين المؤقت المضمن: NSCache وURLCache

\n

معظم تطبيقات iOS لا تحتاج إلى خوادم خارجية - يكفي استخدام الآليات المضمنة من Apple.

\n\n

1.1 NSCache - ذاكرة تخزين مؤقت بسيطة وفعالة في الذاكرة

\n

NSCache هو قاموس آمن للخيوط يقوم تلقائياً بحذف الكائنات عند نقص الذاكرة. مثالي لتخزين الصور، استجابات JSON، أو أي كائنات مكلفة في الحساب.

\n
import Foundation\n\nclass ImageCache {\n    private let cache = NSCache<NSString, NSData>()\n\n    func setImageData(_ data: Data, forKey key: String) {\n        cache.setObject(data as NSData, forKey: key as NSString)\n    }\n\n    func getImageData(forKey key: String) -> Data? {\n        return cache.object(forKey: key as NSString) as Data?\n    }\n}
\n

نصيحة: قم بتعيين الحدود countLimit وtotalCostLimit للحصول على أداء مثالي.

\n\n

1.2 URLCache - تخزين مؤقت لطلبات الشبكة

\n

URLCache يقوم تلقائياً بتخزين استجابات HTTP على القرص وفي الذاكرة. يتم التهيئة عبر URLSessionConfiguration:

\n
let config = URLSessionConfiguration.default\nconfig.urlCache = URLCache(memoryCapacity: 50 * 1024 * 1024,  // 50 MB\n                           diskCapacity: 100 * 1024 * 1024, // 100 MB\n                           diskPath: "myCache")\nlet session = URLSession(configuration: config)
\n

هذا مفيد بشكل خاص للمحتوى الثابت (الصور، استجابات API ذات عمر طويل).

\n\n

2. Redis في مشاريع Swift

\n

Redis هو مخزن بيانات في الذاكرة يدعم الهياكل (سلاسل، قوائم، تجزئات). في مشاريع Swift من جانب الخادم (Vapor, Perfect)، يُستخدم Redis للجلسات، قوائم الانتظار، والتخزين المؤقت السريع.

\n\n

2.1 توصيل Redis عبر Vapor

\n

يوفر Vapor الحزمة vapor/redis. التثبيت:

\n
// Package.swift\ndependencies: [\n    .package(url: "https://github.com/vapor/redis.git", from: "4.0.0")\n]
\n

مثال لتخزين بيانات المستخدم مؤقتاً:

\n
import Vapor\nimport Redis\n\nfunc cacheUser(_ user: User, on request: Request) async throws {\n    let key = "user:\\(user.id)"\n    let data = try JSONEncoder().encode(user)\n    try await request.redis.set(key, to: data)\n    // تعيين TTL (مدة الحياة) ساعة واحدة\n    try await request.redis.expire(key, after: .hours(1))\n}\n\nfunc getUser(from request: Request, id: Int) async throws -> User? {\n    let key = "user:\\(id)"\n    guard let data = try await request.redis.get(key, as: Data.self) else {\n        return nil\n    }\n    return try JSONDecoder().decode(User.self, from: data)\n}
\n\n

2.2 مزايا Redis لـ Swift

\n
    \n
  • السرعة: البيانات مخزنة في الذاكرة العشوائية - زمن استجابة أقل من ميلي ثانية.
  • \n
  • TTL: انتهاء صلاحية تلقائي للمفاتيح.
  • \n
  • Pub/Sub: اتصال غير متزامن بين الخدمات.
  • \n
\n\n

3. Memcached: تخزين مؤقت موزع خفيف

\n

Memcached هو نظام تخزين مؤقت أقدم ولكنه لا يزال شائعاً. على عكس Redis، لا يدعم هياكل البيانات المعقدة والاستمرارية، لكنه بسيط وفعال للغاية لتخزين المفتاح-القيمة المؤقت.

\n\n

3.1 دمج Memcached في Swift

المدونات

توصيات الكتب