Disk Cache:什么是磁盘缓存、iOS 磁盘缓存及运行原理

作者: IT Sectr 发布日期: 2026-07-11 阅读时间: 7 分钟

Disk Cache — 是一种在设备磁盘上临时存储数据的机制,允许 iOS 应用程序加速对先前加载资源的重复访问。根据 Apple Developer Documentation, 2024Disk Cache 减少了网络使用,降低了电池负载,并确保应用程序在离线模式下运行。iOS 提供了几种内置缓存机制:用于网络请求的 URLCache、用于内存的 NSCache 以及通过 Caches 目录的自定义实现。

要点

  • Disk Cache — 在磁盘上存储数据以加速重复访问并减少流量
  • URLCache — iOS 中内置的 HTTP 请求缓存机制
  • Caches directory — 用于应用程序临时数据的专用 Sandbox 目录
  • 缓存失效 对数据及时性至关重要 — 基于时间、事件和版本的策略
  • 系统可以在空间不足时清除 缓存 — 缓存不应包含不可替代的数据

什么是 iOS 中的 Disk Cache?

Disk Cache — 是一种在设备永久存储介质(闪存)上临时存储数据以加速后续对相同数据请求的技术。与 RAM 缓存不同,Disk Cache 在应用程序甚至设备重启后仍保留数据。

iOS 提供两个主要的缓存级别:操作级别(NSCache,内存)和磁盘级别(URLCache,文件系统)。磁盘缓存比操作缓存慢 10-100 倍,但比网络请求快得多 — 差异可达 2-3 个数量级。最优策略使用两级缓存:内存用于热数据,磁盘用于冷数据。

根据 Apple Performance Optimization Guide, 2023,正确配置的 Disk Cache 可将重复查看的内容加载时间减少 60-80%,并将流量消耗降低 40-70%。对于包含媒体内容(图像、视频、音频)的应用程序,缓存是关键的 UX 因素。

URLCache:内置缓存机制

URLCache — 是一个内置的 Foundation 类,为 URLSession 请求实现组合缓存。它会自动将服务器响应保存到磁盘和内存,基于 HTTP 标头 Cache-Control、Expires 和 ETag 管理缓存大小和失效策略。

swift
import Foundation

let cache = URLCache(
    memoryCapacity: 50 * 1024 * 1024,
    diskCapacity: 200 * 1024 * 1024,
    diskPath: "network-cache"
)

URLCache.shared = cache

let config = URLSessionConfiguration.default
config.urlCache = cache
config.requestCachePolicy = .returnCacheDataElseLoad

let session = URLSession(configuration: config)

URLCache 的缓存策略 确定何时使用缓存数据以及何时执行新请求。主要策略:useProtocolCachePolicy(基于服务器标头)、reloadIgnoringLocalCacheData(始终从服务器获取)、returnCacheDataElseLoad(优先使用缓存)、returnCacheDataDontLoad(仅使用缓存 — 离线模式)。

Cache-Control — 服务器随响应发送的 HTTP 标头,指示 max-age(以秒为单位的生存时间)、must-revalidate(检查及时性)、no-cache(未经验证不使用)和 no-store(不缓存)。iOS 在使用 URLCache 并采用 useProtocolCachePolicy 策略时,会自动严格遵守这些标头。

自定义缓存策略和失效

自定义缓存 在内置 URLCache 不足时需要:用于存储已处理的图像、序列化的数据模型或计算结果。在这种情况下,开发人员基于应用程序 Sandbox 中的 Caches 目录创建自己的缓存系统。

swift
class DiskCache<T: Codable> {
    private let cacheDir: URL
    private let encoder = JSONEncoder()
    private let decoder = JSONDecoder()

    init() {
        let paths = FileManager.default
            .urls(for: .cachesDirectory,
                     in: .userDomainMask)
        cacheDir = paths[0].appendingPathComponent(
            "data-cache", isDirectory: true
        )
        try? FileManager.default
            .createDirectory(at: cacheDir,
                             withIntermediateDirectories: true)
    }

    func set(value: T, for key: String) {
        let url = cacheDir.appendingPathComponent(
            SHA256.hash(key)
        )
        if let data = try? encoder.encode(value) {
            try? data.write(to: url)
        }
    }

    func get(for key: String) -> T? {
        let url = cacheDir.appendingPathComponent(
            SHA256.hash(key)
        )
        guard let data = try? Data(contentsOf: url) else { return nil }
        return try? decoder.decode(T.self, from: data)
    }

    func clearAll() {
        try? FileManager.default
            .removeItem(at: cacheDir)
    }
}

缓存失效策略 确定存储数据何时被视为过时:TTL(Time-To-Live)— 数据在写入后存活固定时间;event-driven — 事件发生时失效(例如,服务器上数据更新);version-based — API 版本或数据格式更改时失效;LRU(Least Recently Used)— 超出大小限制时自动删除最不常用的记录。

实践规则: TTL 适用于新闻和可预测过期的内容。Event-driven — 适用于通过推送通知由服务器管理的数据。Version-based — 适用于配置和数据模型缓存。LRU — 适用于磁盘空间有限的媒体文件的通用选择。

缓存的性能和限制

Disk Cache 的性能 通过命中率来衡量 — 无需访问网络即可从缓存满足的请求百分比。配置良好的图像缓存的典型命中率为 70-90%,API 响应为 40-60%,流媒体视频为 30-50%。

数据类型典型命中率建议缓存大小
图像70-90%100-500 MB
API JSON 响应40-60%10-50 MB
视频/音频30-50%500 MB — 1 GB
字体和资源90-99%5-20 MB
网页内容50-70%50-200 MB

iOS 中 Disk Cache 的限制: 系统可以在磁盘空间不足时随时删除 Caches 目录的内容。此行为不可配置 — iOS 自行决定何时以及删除哪些缓存文件。因此,缓存不应包含无法从网络或其他来源恢复的数据。

对闪存的影响: 频繁写入 Disk Cache 会加速闪存的磨损。iOS 使用 TRIM 和磨损均衡来最小化磨损,但建议开发人员避免过度写入:不要对同一文件超过每 5 分钟更新一次缓存;将小写入分组为一次;对不需要存储在磁盘上的临时数据使用 NSCache。

iOS 中的缓存最佳实践

两级缓存 — iOS 应用程序的标准架构:内存(NSCache)用于频繁访问的数据,磁盘(URLCache 或自定义)用于应在会话之间保留的数据。内存中的生存时间 — 分钟,磁盘上 — 小时或天。

图像缓存: 使用专门的库(Kingfisher、SDWebImage、Nuke),它们实现具有自动失效、内存管理和异步磁盘写入的两级缓存。自行实现图像缓存需要考虑解码、色彩空间和缩放。

缓存与安全: 不要在没有加密的情况下将机密数据(密码、令牌、个人数据)缓存在磁盘上。URLCache 默认不加密数据 — 对敏感内容使用 NSFileProtection 或应用程序级加密。对于带认证的网络请求,使用 .reloadIgnoringLocalCacheData 策略。

缓存监控: 跟踪命中率、当前缓存大小和每分钟写入次数。如果命中率降至 30% 以下 — 缓存效率低下,需要审查策略或增加大小。根据 Point-Free (2024),缓存监控是 iOS 应用程序性能优化中最被低估的实践之一。

常见问题

什么是 iOS 中的 Disk Cache?

Disk Cache — 是一种将数据存储在设备磁盘上以加速重复访问的技术。在 iOS 中,内置的 URLCache 缓存 HTTP 响应,开发人员可以通过 Caches 目录创建自定义缓存。

Disk Cache 与 RAM Cache 有什么区别?

RAM Cache(NSCache)将数据存储在内存中 — 速度更快,但在应用程序重启时会丢失。Disk Cache 较慢,但在会话之间保留。最优策略使用两个级别:内存用于热数据,磁盘用于冷数据。

iOS 会删除我的缓存吗?

是的,系统可以在空间不足时随时删除 Caches 目录的内容。因此,切勿在缓存中存储无法恢复的数据。对于用户文档,请使用 Documents 目录。

如何选择合适的缓存大小?

缓存大小 取决于数据类型:图像为 100-500 MB,API 响应为 10-50 MB,视频可达 1 GB。跟踪命中率 — 如果低于 50%,请增加缓存大小或更改失效策略。

如何在 iOS 应用程序中清除缓存?

URLCache.removeAllCachedResponses() 清除内置缓存。对于自定义缓存,通过 FileManager 从 Caches 目录删除文件。始终在应用程序设置中为用户提供清除缓存的选项。

总结

  • Disk Cache — 在磁盘上临时存储数据以加速重复访问并减少流量
  • URLCache — 内置 Foundation 机制,用于缓存支持 Cache-Control 的 HTTP 请求
  • Caches directory — 用于临时数据的 Sandbox 目录,系统在空间不足时会清空
  • 失效 通过 TTL、事件、版本或 LRU 进行 — 选择取决于数据类型
  • 命中率 — 缓存效率的关键指标:图像 70%+,API 40-60%
  • 两级缓存(RAM + 磁盘)— iOS 应用程序的标准架构
  • 安全 — 机密数据不应在未加密的情况下缓存在磁盘上

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读