Swift 中的缓存:Redis、Memcached 及内置解决方案从 A 到 Z

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

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

开始课程

引言:为什么要在 Swift 应用中使用缓存?

\n

缓存是优化移动端和服务器端应用性能的关键技术之一。在 Swift(iOS/macOS)的世界中,正确的缓存可以减少数据加载时间、降低网络和数据库负载,并改善用户体验。在本文中,我们将探讨 Swift 中三种主要的缓存方法:内置解决方案 NSCache、流行的服务器端系统 Redis 和 Memcached,以及它们在 iOS/macOS 项目中的集成。

\n\n

1. 内置缓存:NSCache 和 URLCache

\n

对于大多数 iOS 应用来说,不需要外部服务器——使用 Apple 的内置机制就足够了。

\n\n

1.1 NSCache——简单高效的内存缓存

\n

NSCache 是一个线程安全的字典,当内存不足时会自动移除对象。它非常适合缓存图像、JSON 响应或任何计算成本高昂的对象。

\n
import Foundation\n\nclass ImageCache {\n    private let cache = NSCache<NSString, NSData>()\n\n    func setImageData(_ data: Data, forKey key: String) {\n        cache.setObject(data as NSData, forKey: key as NSString)\n    }\n\n    func getImageData(forKey key: String) -> Data? {\n        return cache.object(forKey: key as NSString) as Data?\n    }\n}
\n

提示: 设置 countLimit 和 totalCostLimit 限制以获得最佳性能。

\n\n

1.2 URLCache——网络请求缓存

\n

URLCache 自动将 HTTP 响应缓存到磁盘和内存中。通过 URLSessionConfiguration 进行配置:

\n
let config = URLSessionConfiguration.default\nconfig.urlCache = URLCache(memoryCapacity: 50 * 1024 * 1024,  // 50 MB\n                           diskCapacity: 100 * 1024 * 1024, // 100 MB\n                           diskPath: "myCache")\nlet session = URLSession(configuration: config)
\n

这对于静态内容(图像、生命周期较长的 API 响应)特别有用。

\n\n

2. Swift 项目中的 Redis

\n

Redis 是一个支持多种数据结构(字符串、列表、哈希)的内存数据存储。在 Swift 服务端项目(Vapor、Perfect)中,Redis 用于会话、队列和快速缓存。

\n\n

2.1 通过 Vapor 连接 Redis

\n

Vapor 提供了 vapor/redis 包。安装:

\n
// Package.swift\ndependencies: [\n    .package(url: "https://github.com/vapor/redis.git", from: "4.0.0")\n]
\n

缓存用户数据的示例:

\n
import Vapor\nimport Redis\n\nfunc cacheUser(_ user: User, on request: Request) async throws {\n    let key = "user:\\(user.id)"\n    let data = try JSONEncoder().encode(user)\n    try await request.redis.set(key, to: data)\n    // 设置 TTL(生存时间)为 1 小时\n    try await request.redis.expire(key, after: .hours(1))\n}\n\nfunc getUser(from request: Request, id: Int) async throws -> User? {\n    let key = "user:\\(id)"\n    guard let data = try await request.redis.get(key, as: Data.self) else {\n        return nil\n    }\n    return try JSONDecoder().decode(User.self, from: data)\n}
\n\n

2.2 Redis 对 Swift 的优势

\n
    \n
  • 速度: 数据存储在内存中——延迟低于一毫秒。
  • \n
  • TTL: 键自动过期。
  • \n
  • Pub/Sub: 服务之间的异步通信。
  • \n
\n\n

3. Memcached:轻量级分布式缓存

\n

Memcached 是一个较老但仍然流行的缓存系统。与 Redis 不同,它不支持复杂的数据结构和持久化,但对于键值缓存来说极其简单高效。

\n\n

3.1 在 Swift 中集成 Memcached

博客

书籍推荐