本篇介紹快取相關的類,包括cache
、diskbasedcache
、cachedispatcher
。
表示快取的介面,這也體現了擴充套件性,只給出訪問介面,而沒有具體實現,雖然volley
中只給了一中實現,即diskbasedcache
,但客戶端在呼叫時仍然只與介面打交道,如果想用其他的快取方式,只需要自己實現cache
介面即可,完全不影響客戶端的工作。
靜態內部類cache$entry
,表示具體的快取內容,主要屬性:
cache
介面主要有如下方法:
volley
中cache
介面的唯一預設實現,用檔案儲存的方式實現,並根據最近最少使用(lru)原則限制快取容量。
定義了內部類diskbasedcache$cacheheader
,從名字可以看出該類儲存的主要是header
,實際上,它的多數成員都與cache$entry
類相同,比如頭資訊和過期策略相關的資訊等,唯一不同的是,該類不包含byte data
,也就是響應的內容主體,很好理解,因為既然是基於disk
的,那這部分內容顯然是要放在檔案裡的。
其實,cacheheader
類起到了索引的作用,輔助資訊除了寫入檔案,還要放在cacheheader
類中,也就是在記憶體裡。
這樣做的合理性一目了然:
cacheheader
裡的資訊會被更頻繁地用到,比如判斷快取是否存在、是否過期,每次訪問快取,都要先查詢這些輔助資訊;而且這些輔助資訊占用空間很小。因此,這部分放在記憶體。
diskbasedcache
中維護了乙個mapmentries
,用來作快取索引。
這是讀寫快取的方法,二者思路大同小異。在diskbasedcache
中,entry
實際上起到了中間層的作用,這是與外界的交換方式,而cacheheader
和file是diskbasedcache
內部的儲存方式。
用put()
寫入快取時,先根據cachekey
找到對應的檔案,然後依次向檔案寫入header
和body
,最後將header
加入到mentries
中作為索引。
用get()
讀取快取時,先從mentries
中查詢所需內容是否存在、是否過期。
diskbasedcache
中用作索引的物件是mentries
,它是由linkedhashmap
實現的,而且儲存順序是訪問順序accessorder
(與插入順序insertorder
相對),可以實現最近最少使用(lru)原則。
實現控制快取大小的函式是
private
void
pruneifneeded(int neededspace);
每次需要寫入快取之前,該函式會根據本次寫入所需的空間判斷是否需要進行清理快取。如果需要清理,則獲取mentries
的iterator
,依次刪除索引及對應的檔案,知道快取空間低於限制的最大空間。
對於以accessorder作為訪問順序的linkedhashmap
,iterator
會按照最近訪問的時間順序進行遍歷,最長時間沒有被訪問過的條目會被最先遍歷到。因此該資料結構可以直接用來實現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的狀態碼,如果沒有關閉快取請求的話 ...