安卓中高階開發面試知識點之——快取

codeGoogle發表於2018-11-14

前言

幾乎所有的專案都做了快取,但是快取做的怎麼樣,其實只有我們自己知道。快取做的好,沒有網路也能流暢的使用;再多的資料請求都不會出現卡頓延遲等待很久的情況。

程式中除了圖片快取(三級快取),還有資訊快取。當使用者無法聯網時,app會預設顯示快取的資料。

前言快取方式

SQLite

下載完資料檔案後,把檔案的相關資訊如url,路經,下載時間,過期時間等存放到資料庫,把url作為唯一的標識。下次下載的時候根據url先從資料庫中查詢,如果查詢到當前時間並未過期,就根據路徑讀取本地檔案,從而實現快取的效果。

檔案快取使用File.lastModified()方法得到檔案的最後修改時間,與當前時間判斷是否過期,從而實現快取效果。資料格式為JSON。

快取方式兩點說明

1、不同型別的檔案的快取時間不一樣。籠統的說,不變檔案的快取時間是永久,變化檔案的快取時間是最大忍受不變時間。說白點,圖片檔案內容是不變的,一般存在SD卡上直到被清理,我們是可以永遠讀取快取的。配置檔案內容是可能更新的,需要設定一個可接受的快取時間。

2、不同環境下的快取時間標準不一樣。無網路環境下,我們只能讀取快取檔案,為了應用有東西顯示,沒有什麼過期之說了。

WiFi

網路環境下,快取時間可以設定短一點,一是網速較快,而是流量不要錢。

3G

流量環境下,快取時間可以設定長一點,節省流量,而且使用者體驗也更好。

快取時間

app中多個頁面的快取時間是不一樣的,對實時性要求高的頁面快取時間較短。而http訊息頭中包含有快取時間,android端無需自己記錄/規定快取時間,讀取即可。

http協議對快取的支援

Expires & Cache-Control

Expires響應首部給出了響應失效的絕對時間,這樣客戶端就可以快取一份副本,在這個時間到期之前,

不用去詢問伺服器它是否有效了。http1.0引入。 例:Expires: Thu, 03 Oct 1997 17:15:00 GMT

Cache-Control首部用於傳輸物件的快取資訊。http1.1引入。它的值是一個快取指令,給出了與某個物件可快取性有關的特有指令。這個首部可以出現在請求或者響應頭中。例如:Cache-Control: no-cache

CacheControl

有兩個欄位表達響應的過期時間:max-age和max-stale

前者表示:max-age秒內,網頁再有請求,你不要來我服務端,直接取你本地快取的結果好了

後者表示:max-stale秒內的請求,你可以使用本地快取的,但還是要來我服務端問問,到底行不行,當然,這裡要帶上Last Modified等資訊 ,如果服務端返回了304,那說明你本地快取繼續用吧,我不給你響應體200的話,自然就帶上了響應體。

Expires和Cache-Control作用一致,都是指當前資源的有效期,控制是直接從快取獲取資料還是重新傳送請求到伺服器取資料。

快取演算法

1、LRU - 最近最少使用(最後訪問時間)替換掉最近被請求最少的文件。這一傳統策略在實際中應用最廣。在CPU快取淘汰和虛擬記憶體系統中效果較好。

2、LRU-K

LRU-K

中的K代表最近使用的次數,也可以認為是LRU-1。LRU-K的主要目的是為了解決LRU演算法“快取汙染”的問題,其核心思想是將“最近使用過1次”的判斷標準擴充套件為“最近使用過K次”。相比LRU,LRU-K需要多維護一個佇列,用於記錄所有快取資料被訪問的歷史。只有當資料的訪問次數達到K次的時候,才將資料放入快取。當需要淘汰資料時,LRU-K會淘汰第K次訪問時間距當前時間最大的資料。如下:

3.  LFU - 最不經常使用(訪問次數)替換掉訪問次數最少的。這一策略意圖保留最常用的、最流行的物件,替換掉很少使用的那些。

LFU

的每個資料塊都有一個引用計數,所有資料塊按照引用計數排序,具有相同引用計數的資料塊則按照時間排序。如下:

image.png

4. SIZE(快取大小)替換size最大的物件。這一策略通過淘汰一個大物件而不是多個小物件來提高命中率。不過,可能有些進入快取的小物件永遠不會再被訪問。SIZE策略沒有提供淘汰這類物件的機制,會導致“快取汙染”(大量偶發性的資料訪問讓記憶體中存放大量冷資料,也即是快取汙染)。

引申幾個問題,面試常被問到的問題:

1、http的快取是怎麼做的 ? 2、用的什麼?(這個問題和執行緒會同問,一般問一個。) 答案請自行百度。我就不說了。因為我看過http的原始碼,看過他的快取和執行緒。是自定義的。大家做一個瞭解就行。

這個問題被問到的頻率不高。而高頻問的一般是這種問題:有一個網路請求,有很多資料(比如一年,兩年,每天的資料都要請求出來),然後拿到資料後做處理,然後recycleview(或listview)展示出來。像這種請求由於資料很多, 會有一段時間的等待,導致頁面UI資料延遲的情況的解決方案。大家心裡要做一個準備。

作者:小餅乾也有夢想 連結:www.jianshu.com/p/461554b2c…

閱讀更多

除程式設計師,除了寫好程式碼,你更應該學會這些!

你說,你的APP要不要保活?

面試官:你說一下對執行緒安全瞭解多少?

前端:後端,我要分手,你不適合我

相信自己,沒有做不到的,只有想不到的

在這裡獲得的不僅僅是技術!

image

相關文章