![]()
作者 | Sergio De Simone
譯者 | 田橙
為了改進(jìn) Android 應(yīng)用中的圖片緩存管理,Grab 的工程師將原有的 最近最少使用(Least Recently Used,LRU)緩存機(jī)制升級(jí)為時(shí)間感知最近最少使用(Time-Aware Least Recently Used,TLRU)緩存。這一改進(jìn)使他們能夠更高效地回收存儲(chǔ)空間,同時(shí)不會(huì)降低用戶體驗(yàn),也不會(huì)增加服務(wù)器成本。
Grab 的 Android 應(yīng)用使用 Glide 作為主要的圖片加載框架。該框架內(nèi)置了一個(gè) LRU 緩存,用于在本地存儲(chǔ)圖片,從而減少網(wǎng)絡(luò)請(qǐng)求、提升加載速度并降低服務(wù)器開銷。然而,數(shù)據(jù)分析顯示,使用 100 MB 的 LRU 緩存存在明顯問題:對(duì)于許多用戶來說,緩存空間很快就被填滿,導(dǎo)致性能下降;而在另一些情況下,如果緩存始終沒有達(dá)到大小上限,圖片可能會(huì)在緩存中保留數(shù)月之久,從而造成存儲(chǔ)空間浪費(fèi)。
為了繞過這些限制,Grab 工程師決定在 LRU 的基礎(chǔ)上引入基于時(shí)間的過期機(jī)制。TLRU 通過三個(gè)參數(shù)進(jìn)行控制:首先是 Time To Live(TTL),用于確定緩存條目在何時(shí)被視為過期;其次是最小緩存容量閾值,確保即使緩存條目已過期,只要緩存容量不足,關(guān)鍵圖片仍然可以繼續(xù)保留;最后是最大緩存容量,用于限制緩存的存儲(chǔ)上限。
在實(shí)現(xiàn)方案上,Grab 工程師并沒有從零開始編寫 TLRU,而是選擇 fork Glide 項(xiàng)目并擴(kuò)展其 DiskLruCache 實(shí)現(xiàn),以利用其“成熟且經(jīng)過大量實(shí)踐驗(yàn)證的基礎(chǔ)架構(gòu)”。
這一實(shí)現(xiàn)方式在 Android 生態(tài)中被廣泛采用,并且已經(jīng)處理了許多復(fù)雜的邊界情況,例如崩潰恢復(fù)、線程安全以及性能優(yōu)化等。如果從零實(shí)現(xiàn)這些能力,需要投入大量額外的工程工作。
為了支持 TLRU,DiskLruCache 需要在三個(gè)方面進(jìn)行擴(kuò)展:一是增加對(duì)最近訪問時(shí)間(last-access time)的追蹤;二是實(shí)現(xiàn)基于時(shí)間的緩存淘汰邏輯;三是提供現(xiàn)有用戶緩存的遷移機(jī)制。
其中,記錄最近訪問時(shí)間是為了能夠按照“最近訪問順序”對(duì)緩存條目進(jìn)行排序,并且這些時(shí)間信息必須在應(yīng)用重啟后仍然能夠保留。時(shí)間驅(qū)動(dòng)的淘汰邏輯會(huì)在每次緩存訪問時(shí)運(yùn)行,用于檢查最近最少訪問的條目是否已經(jīng)過期,如果過期則將其移除。
對(duì)于已有緩存的遷移,主要挑戰(zhàn)在于如何為原本的 LRU 緩存條目分配最近訪問時(shí)間戳。由于文件系統(tǒng) API 無法提供可靠的時(shí)間來源,Grab 工程師最終決定為所有緩存條目統(tǒng)一賦予遷移時(shí)間戳。
這種方式可以保留所有現(xiàn)有緩存內(nèi)容,并建立一個(gè)一致的時(shí)間基線。不過,它也意味著必須等待 一個(gè)完整的 TTL 周期之后,緩存淘汰機(jī)制的全部效果才會(huì)體現(xiàn)出來。同時(shí),他們還確保了雙向兼容性:原始的 LRU 實(shí)現(xiàn)可以通過忽略時(shí)間戳后綴來讀取 TLRU 的日志文件,從而在需要時(shí)能夠安全回滾。
另一個(gè)挑戰(zhàn)是確定最佳配置參數(shù),這需要通過受控實(shí)驗(yàn)來完成。
Grab 為此設(shè)定了明確的成功標(biāo)準(zhǔn):在從 LRU 遷移到 TLRU 的過程中,緩存命中率下降不得超過 3 個(gè)百分點(diǎn)(pp)。例如,如果命中率從 59% 降至 56%,就意味著服務(wù)器請(qǐng)求量將增加約 7%。這一閾值在存儲(chǔ)優(yōu)化與性能影響之間取得了平衡。
通過這種方案,95% 的應(yīng)用用戶緩存大小減少了約 50 MB,而緩存規(guī)模最大的 5% 用戶則獲得了更為顯著的節(jié)省。基于這些結(jié)果,Grab 工程師估算,在保持緩存命中率處于可接受范圍、且不增加服務(wù)器成本的前提下,他們可以在用戶設(shè)備上回收數(shù) TB 級(jí)別的存儲(chǔ)空間。
原始文章對(duì) LRU 的行為機(jī)制以及 TLRU 的實(shí)現(xiàn)細(xì)節(jié)提供了大量更為深入的技術(shù)說明,遠(yuǎn)超本文所能覆蓋的范圍。如果希望了解完整實(shí)現(xiàn)細(xì)節(jié),建議閱讀原文。
https://www.infoq.com/news/2026/03/grab-tlru-image-cache/
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.