التخزين المؤقت في 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 الخيار القياسي للتخزين المؤقت