内存缓存设计git
目标:减轻io和计算压力,之内存占用为代价。github
要素:算法
一、组织(存储)形式:kv、链表、table缓存
二、并发控制;序列化、锁;安全
三、缓存淘汰策略;并发
四、整体异步
内存缓存async
一般一个缓存是由内存缓存和磁盘缓存组成,内存缓存提供容量小但高速的存取功能,磁盘缓存提供大容量但低速的持久化存储。相对于磁盘缓存来讲,内存缓存的设计要更简单些,下面是我调查的一些常见的内存缓存。性能
NSCache 是苹果提供的一个简单的内存缓存,它有着和 NSDictionary 相似的 API,不一样点是它是线程安全的,而且不会 retain key。我在测试时发现了它的几个特色:NSCache 底层并无用 NSDictionary 等已有的类,而是直接调用了 libcache.dylib,其中线程安全是由 pthread_mutex 完成的。另外,它的性能和 key 的类似度有关,若是有大量类似的 key (好比 “1”, “2”, “3”, …),NSCache 的存取性能会降低得很是厉害,大量的时间被消耗在 CFStringEqual() 上,不知这是否是 NSCache 自己设计的缺陷。测试
TMMemoryCache 是 TMCache 的内存缓存实现,最初由 Tumblr 开发,但如今已经再也不维护了。TMMemoryCache 实现有不少 NSCache 并无提供的功能,好比数量限制、总容量限制、存活时间限制、内存警告或应用退到后台时清空缓存等。TMMemoryCache 在设计时,主要目标是线程安全,它把全部读写操做都放到了同一个 concurrent queue 中,而后用 dispatch_barrier_async 来保证任务能顺序执行。它错误的用了大量异步 block 回调来实现存取功能,以致于产生了很大的性能和死锁问题。
PINMemoryCache 是 Tumblr 宣布不在维护 TMCache 后,由 Pinterest 维护和改进的一个内存缓存。它的功能和接口基本和 TMMemoryCache 同样,但修复了性能和死锁的问题。它一样也用 dispatch_semaphore 来保证线程安全,但去掉了dispatch_barrier_async,避免了线程切换带来的巨大开销,也避免了可能的死锁。
YYMemoryCache 是我开发的一个内存缓存,相对于 PINMemoryCache 来讲,我去掉了异步访问的接口,尽可能优化了同步访问的性能,用 OSSpinLock 来保证线程安全。另外,缓存内部用双向链表和 NSDictionary 实现了 LRU 淘汰算法,相对于上面几个算是一点进步吧。
https://blog.ibireme.com/2015/10/26/yycache/