內存緩存設計

內存緩存設計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 自己設計的缺陷。測試

TMMemoryCacheTMCache 的內存緩存實現,最初由 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/

相關文章
相關標籤/搜索