OkHttp原始碼分析(四)DiskLruCache

2021-08-04 04:12:58 字數 1602 閱讀 5026

前一章講到okhttp使用的快取是disklrucache,displrucache是以linkedhashmap為底層實現的磁碟快取,但是具體是如何快取的我還是不是很理解,作為程式設計師,不理解和鹹魚有什麼分別。為了不做鹹魚,我們還是看一下原始碼吧!

public

final

class

disklrucache

implements

closeable, flushable

};...

}

linkedhashmap中的entry物件,乙個entry物件對應一條cache記錄。

乙個entry主要由以下幾部分構成:

key:每個cache都有乙個key作為其識別符號。當前cache的key為其對應url的md5字串

cleanfiles/dirtyfiles:每乙個entry對應多個檔案,其對應的檔案數由disklrucache.valuecount指定。當前在okhttp中valuecount為2。即每個cache對應2個cleanfiles,2個dirtyfiles。其中第乙個cleanfiles/dirtyfiles記錄cache的meta資料(如url,建立時間,ssl握手記錄等等),第二個檔案記錄cache的真正內容。cleanfiles記錄處於穩定狀態的cache結果,dirtyfiles記錄處於建立或更新狀態的cache

currenteditor:entry編輯器,對entry的所有操作都是通過其編輯器完成。編輯器內部新增了同步鎖。

同時entry中還加入了清理執行緒,用來重建精簡日誌,當冗餘日誌超過日誌檔案本身的一般且總條數超過2000時執行

private

final

class

entry

}

snapshot cache快照,記錄了特定cache在某乙個特定時刻的內容。每次向disklrucache請求時返回的都是目標cache的乙個快照,相關邏輯在disklrucache.get中:

public

synchronized snapshot get(string key) throws ioexception

return snapshot;

}

總結:

disklrucache主要有以下幾個特點:

通過linkedhashmap實現lru替換

通過本地維護cache操作日誌保證cache原子性與可用性,同時為防止日誌過分膨脹定時執行日誌精簡

每乙個cache項對應兩個狀態副本:dirty,clean。clean表示當前可用狀態cache,外部訪問到的cache快照均為clean狀態;dirty為更新態cache。由於更新和建立都只操作dirty狀態副本,實現了cache的讀寫分離

每乙個cache項有四個檔案,兩個狀態(dirty,clean),每個狀態對應兩個檔案:乙個檔案儲存cache meta資料,乙個檔案儲存cache內容資料

disklrucache寫cache時根據url的md5值找到editor(如果沒有則建立editor),根據editor就得到檔案輸出流,讀cache時同樣根據url的md5值找到snapshot物件,用snapshot物件得到檔案輸入流。

OkHttp 原始碼分析

先來看 new okhttpclient 然後 clien.newcall request 建立了 realcall 物件,這也是 okhttp 中乙個重要的類,先來分析非同步執行的原始碼吧,因為同步執行跟非同步的後半段沒什麼區別了。override public void enqueue call...

OkHttp 原始碼分析(一)

首先我們來看一段 我們直接來看這一段 研究okhttpclient這個類之前,我們先來看看他都實現了那些類。這裡我們就很明白newcall 的來歷了。廢話不多說直接看okhttpclient的newcall方法。public class okhttpclient implements cloneab...

OkHttp原始碼初探

在之前的文章我中我們介紹了okhttp的基本使用方法並簡單說明了原始碼下各個module的功能作用,從這篇開始我們將要開始分析okhttp的原始碼。首先,我們先來回憶一下okhttp的使用過程 1.建立乙個okhttpclient物件 2.建立乙個request物件 3.呼叫okhttpclient...