
LRU缓存淘汰机制全揭秘SDURLCache如何守护你的磁盘容量上限【免费下载链接】SDURLCacheURLCache subclass with on-disk cache support on iPhone/iPad. Forked for speed!项目地址: https://gitcode.com/gh_mirrors/sdu/SDURLCacheSDURLCache 是一个为 iPhone/iPad 上 NSURLCache 提供磁盘缓存支持的开源库它内置基于LRU 缓存淘汰算法的自动清理机制确保磁盘缓存使用量永远不超过你设定的容量上限。本文将用通俗的方式拆解它的完整淘汰流程。为什么磁盘缓存需要 LRU 淘汰机制移动端 App 的 HTTP 响应缓存如果只进不出迟早会塞满磁盘缓存文件越写越多磁盘容量上限被突破淘汰策略选择不当还会误删最近还在用的热数据清理如果跑在主线程会直接卡死 UILRULeast Recently Used最近最少使用是工业界最经典的解法容量超限时优先淘汰最久没被访问过的条目把空间留给高频使用的数据。SDURLCache 正是靠这套机制把磁盘占用牢牢锁在diskCapacity之内。第一步给每条缓存建立档案淘汰的前提是知道谁多大、多久没用了。SDURLCache 在缓存目录下维护一个 cacheInfo.plist 档案文件里面只存两组关键数据档案键内容作用accesses每条缓存的最后访问时间供 LRU 排序sizes每条缓存的磁盘大小计算总占用初始化时会把所有sizes求和得到实时磁盘用量_diskCacheUsage见 diskCacheInfo 加载逻辑。每个缓存文件本身则是用URL 的 MD5 哈希命名落盘的规则见 cacheKeyForURL。 小技巧定义SDURLCACHE_DEBUG1后档案里还会额外记录每条缓存对应的原始 URL方便调试SDURLCache.h。核心揭秘balanceDiskUsage 的三段式淘汰当磁盘用量达到上限balanceDiskUsage 方法执行完整的 LRU 淘汰分三步走1️⃣ 先算要腾多少空间capacityToSave 当前磁盘用量 − diskCapacity只要用量没超上限方法会直接 return零开销——这是它高效的第一层原因。2️⃣ 按访问时间排序最旧的排最前方法把accesses档案按时间戳升序排序得到一份从最冷到最热的淘汰候选队列。3️⃣ 逐个删除直到腾够空间从队列头部最久未访问的条目开始删每删一个就从capacityToSave里扣掉它的大小直到欠款清零为止。删除动作由 removeCachedResponseForCachedKeys 完成删磁盘文件、清档案记录、扣减用量计数三步一气呵成。注意这里的批量删除设计先收集所有待删 Key再一次性执行避免边遍历边删造成状态错乱。谁来触发淘汰5 秒一醒的维护定时器SDURLCache 没有每次写入都立刻清理而是用一个 5 秒周期的 GCD 定时器做周期性维护maintenanceTimer⏰ 每 5 秒触发一次 periodicMaintenance用量超过上限 → 在独立磁盘 IO 队列上执行 LRU 淘汰没超上限但有脏数据 → 顺路把档案持久化到磁盘执行完先挂起自己等有新的缓存写入时再被唤醒见 storeRequestToDisk 中的恢复逻辑这套休眠—唤醒设计让空闲期的 App 几乎不产生任何磁盘 IO非常省电。细节亮点LRU 访问时间的延迟写入缓存命中时是更新访问时间的最佳时机但每次都写 plist 太费 IO。SDURLCache 的做法很聪明cachedResponseForRequest命中磁盘缓存后只在内存里更新访问时间并打上脏标记把磁盘 IO 和档案保存留给维护线程批量完成命中的响应同时回填到内存缓存下次访问更快读写操作全部收敛到独立的磁盘队列串行执行绝不阻塞主 Run Loop这也是它敢叫为速度而 Fork的原因README.md。写盘前的三道防护垃圾数据根本不进库淘汰机制再强也不如少存垃圾有效。SDURLCache 在数据落盘前设置了层层闸门最小缓存间隔默认 5 分钟内就要过期的响应直接不写盘避免占着空间白过期minCacheInterval 属性说明尊重服务器指令Cache-Control: no-store、Pragma: no-cache的响应一律拒收过期时间解析逻辑见 expirationDateFromHeaders单条体积上限单条响应比整个diskCapacity还大直接跳过防止一条缓存吃掉全部配额storeCachedResponse快速上手三行代码开启磁盘缓存SDURLCache *urlCache [[SDURLCache alloc] initWithMemoryCapacity:1024*1024 diskCapacity:1024*1024*5 diskPath:[SDURLCache defaultCachePath]]; [NSURLCache setSharedURLCache:urlCache];替换默认共享缓存后App 立即拥有磁盘 HTTP 缓存能力容量与淘汰策略完全由你掌控。更多 API如isCached:、removeAllCachedResponses可在 SDURLCache.h 中查阅。总结一张图看懂容量守护全链路新响应到达 → 三道防护过滤 → 异步写盘 → 用量档案更新 ↓ 5秒维护定时器唤醒 → 用量 diskCapacity ↓ 是 LRU 排序 → 从最冷条目删起 → 腾够空间为止SDURLCache 的设计哲学可以概括为一句话用最少的 IO换取最稳定的磁盘占用上限。理解它的 LRU 淘汰链路对你在任何项目中设计缓存容量管理都会有直接启发。【免费下载链接】SDURLCacheURLCache subclass with on-disk cache support on iPhone/iPad. Forked for speed!项目地址: https://gitcode.com/gh_mirrors/sdu/SDURLCache创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考