1. 什麼是cachecache就是緩存的意思.電腦上的cache就是高速緩存,電腦組成課程里的定義是,存在於主存和CPU之間,主要用於解決CPU處理數據的速度遠遠大於讀取主存數據的速度.手機上也有cache,主要作用是保存一些軟體生成的臨時文件,避免每次都要重覆地向伺服器請求相同的數據,既浪費...
1. 什麼是cache
cache就是緩存的意思.
電腦上的cache就是高速緩存,電腦組成課程里的定義是,存在於主存和CPU之間,主要用於解決CPU處理數據的速度遠遠大於讀取主存數據的速度.
手機上也有cache,主要作用是保存一些軟體生成的臨時文件,避免每次都要重覆地向伺服器請求相同的數據,既浪費用戶流量,也影響APP響應速度.
2. 緩存的實現
手機緩存一般有兩種方式,記憶體緩存和硬碟緩存.
客戶端每次請求數據,首先檢測記憶體緩存是否有數據,若沒有則檢測硬碟,還是沒有才請求伺服器.
請求數據成功後,把數據存入記憶體和硬碟中.
看起來很容易,不過實現起來就需要考慮一些策略:
1.和以前學習cache時遇到的問題一樣,記憶體是有限的,清空記憶體時採用什麼演算法
2.硬碟緩存有兩種方式,一種存文件中,一種存資料庫中,怎麼實現效率才高
3. 各種緩存庫
現在的緩存庫很多,官方自帶的NSCache
比較常見的開源緩存庫SDWebImage、FastImageCache
比較常見的閉源緩存庫NSURLCache、Facebook的FBDiskCache
這裡有YYCache作者對於各種緩存庫的評測,和以上緩存庫的實現思路,很值得學習:
http://blog.ibireme.com/2015/10/26/yycache
4. YYCache的實現
YYCache代碼清晰,註釋詳細,很值得學習思考.
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來做.
我把整個源碼仔細地學習了下,大致思路是懂了,有些細節的處理的小技巧很贊,不過還有些地方感覺理解有問題,如果大家有興趣的話也去學習下吧,一起繼續學習交流.