Swift 中的缓存:Redis、Memcached 及 iOS/macOS 内置解决方案

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

介绍:为什么需要在 Swift 应用程序中使用缓存?

现代 iOS 和 macOS 应用程序处理大量数据:图像、API 的 JSON 响应、计算结果。如果没有缓存,每次数据访问都会导致重新加载或重新计算,这对性能、流量消耗和响应时间产生负面影响。Swift 中的缓存是一种策略,将常用数据临时存储在快速存储(内存或本地磁盘)中以加速访问。

在本文中,我们将探讨 Swift 生态系统中的三种主要缓存方法:

  • 内置解决方案:NSCache 和 URLCache —— 适用于大多数任务的轻量级高效工具。
  • Redis —— 用于分布式系统的强大服务器端缓存。
  • Memcached —— 高性能内存缓存系统。

您将了解如何将这些工具中的每一个集成到 Swift 项目中,查看代码示例,并理解针对特定任务应选择哪种方案。

内置解决方案:NSCache 和 URLCache

Apple 提供了两种强大的内置缓存机制,无需安装第三方库。它们非常适合移动开发中 90% 的任务。

NSCache —— 内存缓存

NSCache 是一个具有自动内存管理的线程安全字典。它在内存不足时自动删除对象,使其成为缓存图像、数据模型和任何重型对象的理想选择。

import Foundation

// 为 UIImage 创建缓存
let imageCache = NSCache<NSString, UIImage>()

// 带缓存的图像加载函数
func loadImage(from url: URL, completion: @escaping (UIImage?) -> Void) {
    // 检查缓存
    if let cachedImage = imageCache.object(forKey: url.absoluteString as NSString) {
        completion(cachedImage)
        return
    }
    
    // 加载数据
    URLSession.shared.dataTask(with: url) { data, response, error in
        guard let data = data, let image = UIImage(data: data) else {
            completion(nil)
            return
        }
        // 保存到缓存
        imageCache.setObject(image, forKey: url.absoluteString as NSString)
        completion(image)
    }.resume()
}

NSCache 的优势:

  • 收到内存警告时自动清理
  • 无需额外锁定的线程安全
  • 能够设置对象数量和总成本的限制

URLCache —— HTTP 响应缓存

URLCache 是一个用于 HTTP 请求的系统级缓存。它将服务器响应保存到磁盘和内存,并根据 HTTP 头(Cache-Control, Expires)自动管理其生命周期。

import Foundation

// 配置 URLCache(通常在 AppDelegate 或 SceneDelegate 中)
let cacheSize = 50 * 1024 * 1024 // 50 MB
let urlCache = URLCache(memoryCapacity: cacheSize, diskCapacity: cacheSize, diskPath: "myCache")
URLCache.shared = urlCache

// 带缓存的请求示例
let request = URLRequest(url: URL(string: "https://api.example.com/data")!)
URLSession.shared.dataTask(with: request) { data, response, error in
    // URLCache 将根据 Cache-Control 头自动处理缓存
}.resume()

何时使用 URLCache:

  • 用于缓存 REST API 响应
  • 用于静态资源(图像、配置文件)
  • 当需要遵守服务器缓存策略时

Redis —— 用于 Swift 后端的分布式缓存

Redis 是一个高性能的内存数据存储,通常用作缓存服务器。对于 Swift,有多个客户端可用,最流行的

博客

书籍推荐