記憶體快取設計

2022-07-01 15:09:11 字數 1216 閱讀 8135

記憶體快取設計

目標:減輕io和計算壓力,以記憶體占用為代價。

要素:1、組織(儲存)形式:kv、鍊錶、table

2、併發控制;序列化、鎖;

3、快取淘汰策略;

4、總體

記憶體快取

通常乙個快取是由記憶體快取和磁碟快取組成,記憶體快取提供容量小但高速的訪問功能,磁碟快取提供大容量但低速的持久化儲存。相對於磁碟快取來說,記憶體快取的設計要更簡單些,下面是我調查的一些常見的記憶體快取。

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 淘汰演算法,相對於上面幾個算是一點進步吧。

iOS快取 記憶體快取

為了減少與伺服器的連線溝通次數,提高應用程式的執行速度,使用了ios的快取機制 import youngviewcontroller.h inte ce youngviewcontroller end implementation youngviewcontroller void viewdidlo...

iOS快取 記憶體快取

為了減少與伺服器的連線溝通次數,提高應用程式的執行速度,使用了ios的快取機制 import youngviewcontroller.h inte ce youngviewcontroller end implementation youngviewcontroller void viewdidlo...

記憶體快取 磁碟快取 記憶體傻傻分不清

快取記憶體 英語 cache,英語發音 k kash 1 2 3 簡稱快取 其原始意義是指訪問速度比一般隨機訪問儲存器 ram 快的一種ram,通常它不像系統主存那樣使用dram技術,而使用昂貴但較快速的sram技術。cache一詞 於1967年的一篇電子工程期刊 其作者將法語詞 cache 賦予 ...