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

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

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

ابدأ الدورة

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



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



لماذا نحتاج التخزين المؤقت في تطبيقات Swift؟



أي تطبيق يتعامل مع طلبات الشبكة أو قواعد البيانات أو الحسابات الثقيلة يمكنه الاستفادة من التخزين المؤقت. المزايا الرئيسية:



  • السرعة: يتم إرجاع البيانات من الكاش في أجزاء من الثانية، دون تأخير الشبكة أو القرص.
  • توفير البيانات: طلبات أقل للخادم تعني تكاليف أقل للمستخدم والخادم.
  • الوصول دون اتصال: مع التنفيذ الصحيح، يعمل جزء من الوظائف بدون إنترنت.
  • تقليل الحمل على الخادم: خاصةً للحلول الخادمية Swift (Vapor، Kitura).


الحلول المدمجة: NSCache وURLCache



NSCache — تخزين مؤقت خفيف في الذاكرة



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



import Foundation

class ImageCacheManager { static let shared = ImageCacheManager() private let cache = NSCache<NSString, NSData>() func setImageData(_ data: Data, forKey key: String) { cache.setObject(data as NSData, forKey: key as NSString) } func getImageData(forKey key: String) -> Data? { return cache.object(forKey: key as NSString) as Data? } func removeAll() { cache.removeAllObjects() }}

// الاستخدامlet cache = ImageCacheManager.sharedcache.setImageData(imageData, forKey: "avatar_123")if let cachedData = cache.getImageData(forKey: "avatar_123") { print("بيانات من الكاش: \\(cachedData.count) بايت")}


الميزات:

  • إدارة تلقائية للذاكرة — لا حاجة لحذف الكائنات يدوياً.
  • آمن للخيوط — يمكن استخدامه من خيوط مختلفة.
  • لا يضمن حفظ البيانات — قد يتم مسح الكاش بواسطة النظام.


URLCache — تخزين مؤقت لطلبات HTTP



URLCache يوفر تخزيناً مؤقتاً على مستوى طلبات الشبكة. يعمل مع URLSession ويحفظ تلقائياً استجابات الخادم.



import Foundation

// إعداد الكاشlet memoryCapacity = 50 * 1024 * 1024 // 50 ميجابايتlet diskCapacity = 100 * 1024 * 1024 // 100 ميجابايتlet urlCache = URLCache(memoryCapacity: memoryCapacity, diskCapacity: diskCapacity, diskPath: "myCache")

URLCache.shared = urlCache

// تكوين الجلسةlet config = URLSessionConfiguration.defaultconfig.requestCachePolicy = .returnCacheDataElseLoadconfig.urlCache = urlCache

let session = URLSession(configuration: config)

// تنفيذ الطلبlet url = URL(string: "https://api.example.com/data")!let task = session.dataTask(with: url) { data, response, error in if let data = data { print("تم استلام \\(data.count) بايت") // يتم تخزين البيانات تلقائياً في الكاش }}task.resume()


للتحكم الدقيق في التخزين المؤقت، استخدم رؤوس HTTP وسياسات Cache-Control على جانب الخادم.



Redis في Swift: التخزين المؤقت الخادمي



Redis هو مخزن عالي الأداء من نوع "مفتاح-قيمة" في الذاكرة. لمطوري Swift الذين يعملون مع أطر الخادم (Vapor، Perfect)، يعتبر Redis الخيار القياسي للتخزين المؤقت

المدونات

توصيات الكتب