iOS數據緩存及YYCache的實現分析


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來做.

 

我把整個源碼仔細地學習了下,大致思路是懂了,有些細節的處理的小技巧很贊,不過還有些地方感覺理解有問題,如果大家有興趣的話也去學習下吧,一起繼續學習交流.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM