Mise en cache en Swift : Redis, Memcached et solutions intégrées — niveau avancé

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : Pourquoi la mise en cache est la clé des performances des applications Swift

\n\n

Dans le développement moderne en Swift, qu'il s'agisse d'une application iOS ou d'une solution serveur avec Vapor, la vitesse d'exécution et la réactivité de l'interface dépendent directement d'une gestion efficace des données. La mise en cache n'est pas simplement une « mémorisation » des résultats, mais une véritable science visant à réduire le temps d'accès aux données, diminuer la charge sur le réseau et la base de données, et assurer un fonctionnement fluide même en cas de pics de charge.

\n\n

Au niveau avancé, les développeurs Swift sont confrontés à un choix : utiliser les mécanismes intégrés (NSCache, URLCache) ou intégrer des systèmes externes comme Redis et Memcached. Chacun de ces outils possède sa propre architecture et son domaine d'application. Dans cet article, nous analyserons comment intégrer et combiner efficacement ces solutions dans l'écosystème Swift.

\n\n

1. Solutions intégrées : NSCache et URLCache

\n\n

1.1 NSCache — cache léger pour objets

\n\n

NSCache est un dictionnaire thread-safe intégré à Foundation. Il est idéal pour mettre en cache des objets dont la création ou le chargement est coûteux (par exemple, des images, des résultats de calculs complexes). Son principal avantage est le nettoyage automatique en cas de manque de mémoire, ce qui est crucial pour les applications mobiles.

\n\n
import Foundation\n\nfinal class ImageCache {\n    static let shared = ImageCache()\n    private let cache = NSCache<NSString, UIImage>()\n    \n    private init() {\n        cache.countLimit = 100 // Maximum 100 objets\n        cache.totalCostLimit = 50 * 1024 * 1024 // 50 MB\n    }\n    \n    func getImage(for key: String) -> UIImage? {\n        return cache.object(forKey: key as NSString)\n    }\n    \n    func setImage(_ image: UIImage, for key: String, cost: Int? = nil) {\n        if let cost = cost {\n            cache.setObject(image, forKey: key as NSString, cost: cost)\n        } else {\n            cache.setObject(image, forKey: key as NSString)\n        }\n    }\n    \n    func removeImage(for key: String) {\n        cache.removeObject(forKey: key as NSString)\n    }\n    \n    func clearAll() {\n        cache.removeAllObjects()\n    }\n}
\n\n

Points importants :

\n
    \n
  • countLimit et totalCostLimit sont des recommandations, pas des limites strictes. Le système décide lui-même quand supprimer les objets.
  • \n
  • Les clés doivent être de type NSString, et non String (Swift les convertit automatiquement, mais il est préférable de les caster explicitement).
  • \n
  • Il ne faut pas utiliser NSCache pour de grandes données qui ne tiennent pas en mémoire.
  • \n
\n\n

1.2 URLCache — mise en cache des requêtes réseau

\n\n

URLCache est un cache système pour les requêtes HTTP. Il enregistre automatiquement les réponses du serveur (en tenant compte des en-têtes Cache-Control) et les renvoie sans accès au réseau. La configuration permet de contrôler la quantité de mémoire et de disque.

\n\n
import Foundation\n\n// Configuration d'URLCache pour toute l'application\nlet memoryCapacity = 20 * 1024 * 1024 // 20 MB\nlet diskCapacity = 100 * 1024 * 1024 // 100 MB\nlet cache = URLCache(memoryCapacity: memoryCapacity, diskCapacity: diskCapacity, diskPath: "myCache")\nURLCache.shared = cache\n\n// Exemple d'utilisation avec URLSession\nlet config = URLSessionConfiguration.default\nconfig.requestCachePolicy = .returnCacheDataElseLoad // D'abord le cache, puis le réseau\nconfig.urlCache = cache\n\nlet session = URLSession(configuration: config)\nlet url = URL(string: "https://api.example.com/data")!\nlet task = session.dataTask(with: url) { data, response, error in\n    // Les données seront prises du cache si elles existent et ne sont pas obsolètes\n}\ntask.resume()
\n\n

Conseil avancé : Pour forcer la mise à jour du cache, utilisez la politique .reloadIgnoringLocalCacheData, et pour une gestion manuelle, les méthodes cachedResponse(for:) et storeCachedResponse(_:for:).

\n\n

2.

Blogs

Book Recommendations