Volley詳解(四) 快取(Cache)

2021-07-04 14:27:10 字數 2581 閱讀 1832

本篇介紹快取相關的類,包括cachediskbasedcachecachedispatcher

表示快取的介面,這也體現了擴充套件性,只給出訪問介面,而沒有具體實現,雖然volley中只給了一中實現,即diskbasedcache,但客戶端在呼叫時仍然只與介面打交道,如果想用其他的快取方式,只需要自己實現cache介面即可,完全不影響客戶端的工作。

靜態內部類cache$entry,表示具體的快取內容,主要屬性:

cache介面主要有如下方法:

volleycache介面的唯一預設實現,用檔案儲存的方式實現,並根據最近最少使用(lru)原則限制快取容量。

定義了內部類diskbasedcache$cacheheader,從名字可以看出該類儲存的主要是header,實際上,它的多數成員都與cache$entry類相同,比如頭資訊和過期策略相關的資訊等,唯一不同的是,該類不包含byte data,也就是響應的內容主體,很好理解,因為既然是基於disk的,那這部分內容顯然是要放在檔案裡的。

其實,cacheheader類起到了索引的作用,輔助資訊除了寫入檔案,還要放在cacheheader類中,也就是在記憶體裡。

這樣做的合理性一目了然:

cacheheader裡的資訊會被更頻繁地用到,比如判斷快取是否存在、是否過期,每次訪問快取,都要先查詢這些輔助資訊;而且這些輔助資訊占用空間很小。因此,這部分放在記憶體。

diskbasedcache中維護了乙個mapmentries,用來作快取索引。

這是讀寫快取的方法,二者思路大同小異。在diskbasedcache中,entry實際上起到了中間層的作用,這是與外界的交換方式,而cacheheader和file是diskbasedcache內部的儲存方式。

put()寫入快取時,先根據cachekey找到對應的檔案,然後依次向檔案寫入headerbody,最後將header加入到mentries中作為索引。

get()讀取快取時,先從mentries中查詢所需內容是否存在、是否過期。

diskbasedcache中用作索引的物件是mentries,它是由linkedhashmap實現的,而且儲存順序是訪問順序accessorder(與插入順序insertorder相對),可以實現最近最少使用(lru)原則。

實現控制快取大小的函式是

private

void

pruneifneeded(int neededspace);

每次需要寫入快取之前,該函式會根據本次寫入所需的空間判斷是否需要進行清理快取。如果需要清理,則獲取mentriesiterator,依次刪除索引及對應的檔案,知道快取空間低於限制的最大空間。

對於以accessorder作為訪問順序的linkedhashmapiterator會按照最近訪問的時間順序進行遍歷,最長時間沒有被訪問過的條目會被最先遍歷到。因此該資料結構可以直接用來實現lru cache。

快取分發執行緒,繼承了thread,維護了快取請求佇列mcachequeue,網路請求佇列mnetworkqueue,快取mcache,響應分發物件mdelivery等,負責從快取請求佇列mcachequeue中依次獲取請求並進行處理,如果隊列為空,則阻塞,直到佇列不為空。

對於獲取到的每個request,從mcache查詢快取,如果獲取到了未過期的快取,則將得到的cache$entry構造成networkresponse物件,交給mdelivery進行毀掉處理。

如果在mcache中沒有找到快取,則將該請求放入mnetworkqueue,等待網路分發執行緒處理。

如果在mcache中找到了過期的快取,則除了將請求放入mnetworkqueue之外,還要刪除mcache中過期的快取。

volley之快取 網路與重試

volley對所有的請求都有本地快取,對同一請求一般先從快取中獲取,獲取不到再從網路獲取。通常對進行 快取也是同樣的思路。為乙個thread,run 是乙個死迴圈。與網路方互動的邏輯如下 cache.entry entry mcache.get request.getcachekey if entr...

快取穿透 快取擊穿 快取雪崩詳解

redis 在專案中用的話,主要就是用作快取了 既然用作快取,那就肯定會有 快取穿透 快取擊穿 快取雪崩 的問題 這篇文章就來說說,遇到這種情況時,該如何去處理 首先咱們搞明白什麼是快取穿透?這三個詞這麼像,得把概念搞清楚不是 其實只是從字面意思上來看的話,大概也能知道一點兒,快取穿透嘛,就是直接穿...

HTTP快取詳解

文章分為三部分,我們先來統一梳理一下乙個快取請求的過程,然後從請求頭以及響應頭快取相關字段進行解析,最後總結一下前端需要了解的對於快取的操作 一 快取過程 當乙個使用者發起乙個靜態資源請求的時候,瀏覽器會通過以下幾步來獲取資源 當第一次傳送請求,http返回200的狀態碼,如果沒有關閉快取請求的話 ...