1. 内存缓存 (YYMemoryCache) 存储的单元是_YYLinkedMapNode, 除了 key 和 value 外, 还存储了它的前后 Node 的地址_prev,_next. 整个实现基于_YYLinkedMap, 它是一个双向链表, 除了存储了字典_dic 外, 还存储了头结点和尾节点. 它实现的功能很简单, 就是: 有新数据了插入链表头部, 访问过的数据结点移到头部, 内存紧张时把尾部的结点移除. 就这样实现了淘汰算法. 因为内存访问速度很快, 锁占用的时间少, 所以用的速度最快的 OSSpinLockLock 2. 硬盘缓存 (YYDiskCache) 采用的是文件和数据库相互配合的方式. 有一个参数 inlineThreshold, 默认 20KB, 小于它存数据库, 大于它存文件. 能获得效率的提高. key:path,value:cache 存储在 NSMapTable 里. 根据 path 获得 cache, 进行一系列的 set,get,remove 操作更底层的是 YYKVStorage, 它能直接对 sqlite 和文件系统进行读写. 每次内存超过限制时, select key, filename, size from manifest order by last_access_time desc limit ?1 会根据时间排序来删除最近不常用的数据. 硬盘访问的时间比较长, 如果用 OSSpinLockLock 锁会造成 CPU 消耗过大, 所以用的 dispatch_semaphore_wait 来做.