Cache in Swift: Redis, Memcached und integrierte Lösungen
Cache ist eines der wichtigsten Werkzeuge zur Verbesserung der Leistung und Reaktionsfähigkeit von Swift-Anwendungen für iOS und macOS. In diesem Artikel betrachten wir drei Hauptansätze: integrierte Lösungen (NSCache, URLCache) sowie externe Systeme (Redis und Memcached). Sie erfahren, wann und welches Werkzeug Sie wählen sollten, und erhalten fertige Codebeispiele.
Warum ist Caching in Swift-Anwendungen notwendig?
Ohne Caching belastet jeder Datenzugriff (Netzwerk, Festplatte, Datenbank) das System und erhöht die Antwortzeit. Der Cache ermöglicht es, häufig verwendete Daten im RAM zu speichern, wodurch Verzögerungen und Serverlast reduziert werden. Für mobile Geräte ist dies besonders wichtig: Einsparung von Datenverkehr, Akku und Verbesserung der UX.
1. Integrierte Lösungen: NSCache und URLCache
Apple bietet zwei leistungsstarke integrierte Werkzeuge: NSCache für allgemeines Objekt-Caching und URLCache für das Caching von Netzwerkanfragen.
NSCache
NSCache ist ein threadsicherer Cache, der die Speicherverwaltung automatisch übernimmt. Er entfernt Objekte bei Speicherknappheit, was ideal für iOS ist.
import Foundation
class ImageCacheManager { static let shared = ImageCacheManager() private let cache = NSCache<NSString, UIImage>() private init() { cache.countLimit = 100 // Maximal 100 Bilder cache.totalCostLimit = 50 * 1024 * 1024 // 50 MB } func getImage(for key: String) -> UIImage? { return cache.object(forKey: key as NSString) } func setImage(_ image: UIImage, for key: String, cost: Int = 0) { cache.setObject(image, forKey: key as NSString, cost: cost) } func removeImage(for key: String) { cache.removeObject(forKey: key as NSString) } func clearCache() { cache.removeAllObjects() }}URLCache
URLCache speichert HTTP-Antworten automatisch zwischen. Es kann für eine bestimmte URLSession-Sitzung konfiguriert werden.
import Foundation
// URLCache konfigurierenlet memoryCapacity = 50 * 1024 * 1024 // 50 MBlet diskCapacity = 100 * 1024 * 1024 // 100 MBlet cache = URLCache(memoryCapacity: memoryCapacity, diskCapacity: diskCapacity, diskPath: "myCache")
let configuration = URLSessionConfiguration.defaultconfiguration.urlCache = cacheconfiguration.requestCachePolicy = .returnCacheDataElseLoad
let session = URLSession(configuration: configuration)
// Beispiel einer Anfragelet url = URL(string: "https://api.example.com/data")!let task = session.dataTask(with: url) { data, response, error in if let data = data { // Daten können aus dem Cache stammen print("Erhalten \\(data.count) Bytes") }}task.resume()2. Redis für Swift: Caching auf der Serverseite
Redis ist eine In-Memory-Datenbank, die häufig für das Caching auf der Serverseite verwendet wird. Für Swift gibt es die beliebte Bibliothek Vapor Redis (für Vapor) oder RediStack (für beliebige Projekte).
Beispiel mit RediStack
import RediStackimport NIOCoreimport NIOPosix
// Verbindung zu Redis herstellenlet eventLoopGroup = MultiThreadedEventLoopGroup(numberOfThreads: 1)let connection = try RedisConnection.make( configuration: .init(hostname: "localhost", port: 6379), boundEventLoop: eventLoopGroup.next()).wait()
// Wert setzentry connection.set("user:123", to: "{\\"name\\": \\"Alice\\", \\"age\\": 30}").wait()
// Wert abrufenlet result = try connection.get("user:123", as: String.self).wait()print("Erhalten aus Redis: \\(result ?? "nil")")
// Verbindung schließentry connection.close().wait()try eventLoopGroup.syncShutdownGracefully()