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

来源:http://www.cnblogs.com/stevenfukua/archive/2016/01/05/5102817.html
-Advertisement-
Play Games

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

 

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Order By--將當前查詢出來的數據結果,進行排序,排序按照後面指定的列排序;DESC--倒序排序(降序);ASC--正序排序(升序);漢字:用拼音的首字母排序,升序是從a--z;降序是從z--a;如果是根據多個列排序,那麼兩個之間用逗號,隔開,排序會先按照前面一個排序之後,在按照後面一個排序;...
  • UIScrollView --->UIView//創建UIScrollViewtestScrollView=[[UIScrollView alloc]init];testScrollView.frame=CGRectMake(0, 0, 320, 200);testScrollView.backgr...
  • 自己管理好自己的。儘量別把屬性暴露給其他對象。1,封裝成一個整體,讓多個地方直接調用整體。2,可以解耦合。將來一個類中的屬性發生變化的時候,只需要對類本身進行修改即可。
  • 圖片排列切換
  • 本文轉載於:http://www.cnblogs.com/tianzhijiexian/p/4254110.htmlBitmap是引起OOM的罪魁禍首之一,當我們從網路上下載圖片的時候無法知道網路圖片的準確大小,所以為了節約記憶體,一般會在伺服器上緩存一個縮略圖,提升下載速度。除此之外,我們還可以在本...
  • 實現圖片按鈕的縮放、動畫效果(block的初步應用)
  • 準備工作:1.下載對應手機型號線刷Rom包,進入小米官網Rom下載頻道2.解壓下載下來的Rom包,並用Rom助手提取出system.img中的文件內容。這方面的文章很多,請參考Rom助手如何提取IMG文件3.找到跟小米桌面相關的apk——/system/priv-app/MiuiHome.apk(5...
  • 支付坑的故事 -最主要的是微信 ,以下都是自己的思考得來的,難免有不足之處。如有錯誤,歡迎給位批評指正!也可在下麵留下你的QQ 咱們一起討論問題!總結:樓主感覺微信支付是最坑人的-沒有之一!1:微信支付步驟如下:微信支付原理:https://pay.weixin.qq.com/wiki/doc/a....
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...