產品經理學技術|朋友圈中的圖片緩存系統

7 評論 19435 瀏覽 167 收藏 9 分鐘

緩存是什么?

緩是臨時的意思,存是存儲的意思,所以緩存就是臨時存儲的意思。什么東西適合臨時存儲呢?文字、網頁、圖片、數據?一切都適合臨時存儲,并且也都適合永久存儲,要看業務類型。

以朋友圈為例,你一定離不開這幾種場景:

  1. 刷了幾頁之后,然后回到頭部,你會發現看過的圖片依舊在顯示,并沒有重新出現占位符;然后再顯示出圖片,表明這張圖片一直在內存中,隨時可被使用。
  2. 點擊一條新內容的圖片時,會展示一張小的縮略圖,然后loading一直在轉,過了一會兒一張清晰無碼大圖展現出來,表明這張圖片是從網絡拉取回來的,隨后再被使用。loading的過程中,只存在一張小的縮略圖。
  3. 當你翻到幾天前的內容,打開圖片的時候,有的時候跟2一樣,從網絡拉取,有的時候,瞬間打開,這是為啥呢?因為有可能還在緩存系統中,瞬間被使用。也有可能被淘汰刪除掉了,所以從網絡重新拉取。

這幾種情況基本涵蓋了一個App或者其他應用程序所使用緩存系統的所有場景,只不過這個舉例以圖片為主,其他原理類似。

緩存系統經常分為兩級:稱為一級緩存,二級緩存。一級緩存也叫內存緩存,二級緩存也叫硬盤緩存(手機App中,在Sd卡上)。很顯然,一級緩存存取速度更快,程序退出數據就消失,不可一直保留,且多占了一些內存,容易被人叨逼叨的說程序占內存大,把系統拖慢了,其實這是非常合理的一種以空間換取時間的程序設計。二級緩存容量可以更大,速度要慢一些,程序下次啟動時候,依然可以使用。

所以緩存系統設計就是分配兩塊存儲空間,一塊在內存,一塊在硬盤,假設內存分配5Mb,硬盤分配100Mb,前者叫一級緩存,后者叫二級緩存(硬盤相對比較便宜,所以一般分配要大些)。

現在來模擬下整個朋友圈的流程。

Img397204050

進入朋友圈開刷,這些圖片就不斷的占用5Mb的內存空間,這時你往回滑動,你會發現剛才的圖片還都在,因為這個時候一級緩存還沒滿,還可以繼續吃,所有的圖片也都能正常滿足業務需求。

假設這個時候已經滾動到了第三屏,一級緩存5Mb空間已被占滿,達到上限,所以必然要進行淘汰,目前業界一般會采用LRU(Least Recently Used)算法進行淘汰,也就是最近最少被使用的圖片被淘汰(想想還是很貼心的,最近最少被使用,對一個功利的程序來說,你是最佳人選,如果你在工作中最近最少被使用,要注意安全了哦,哈哈)。所以按照朋友圈時間線的性質,第一張圖片被淘汰出了一級緩存,它會被安放到二級緩存,也即存儲到了硬盤上,注意雖然叫“淘汰”,但也沒有那么慘,沒有被完全丟棄打入冷宮,也算有了個不錯的歸宿,假設這個時候滑動回第一張圖片所在的位置,這個時候內存沒有這張圖片,一級緩存中沒有,一級緩存作為一個老好人,會問二級緩存,“第一張圖片”在你哪里嗎?這個時候回答是肯定的,所以一級緩存又按照剛才的算法,淘汰一些其他最近最少被使用的圖片出去,保證第一張圖片能夠在內存中,然后我們有又看到了第一張圖片。

繼續刷下去,我們會發現一級緩存5Mb滿了,一直在進行換出換入操作,也就是淘汰一些,選進來一些。硬盤100Mb的空間也有可能被撐滿,所以二級緩存也會進行淘汰工作,因為它是最下面的一層,所以只被動的接收一級緩存塞入圖片,以及自身的淘汰。

擴展到一個新聞客戶端乃至任何一個應用程序,整個流程都可按朋友圈自行腦補,原理都是一樣的,只不過對參數的配置略有不同,比如有的想提供更好的看圖體驗,一級緩存設計的比較大,能夠同時瀏覽更多的圖片,不用經常的換入換出,但是同時也耗用更多內存,程序的穩定性也帶來挑戰。二級緩存占用也可以設計的比較大,這樣一些被經常使用的場景的圖片,就可以不用再從網絡上拉取,但是占用大了,一些管家、衛士就要出現了,說某程序占用了多少多少空間,是否要現在清理,除非你是像微信這種全國人民不得不用的App,他們會相應的提高閾值,清理也會更慎重。在計算機程序中,時刻充滿博弈,你想占用更多的資源,就面臨更多的風險,用戶體驗和程序性能之間永遠要做衡量,雖然有矛盾,但一定有一個最適合你自己所做業務的方案,雖然有可能也是要經過取舍的。

再舉個例子,微信的第二個tab是通訊錄,當列表快速滑動的時候,滑動過程中,很多頭像都是默認的灰頭像,為什么是默認頭像呢,因為滑動的時候再去讀相應的頭像,并且對圖片解碼,會使整個列表的滑動掉幀卡頓。一些新聞客戶端的做法又恰恰不同,比如滑動的過程中,圖片就一張接著一張出來,明顯感覺是有些卡頓的,但是慢慢滑動是不會的。所以對于關鍵路徑的理解是選擇技術方案的最重要的要素。

我來談談自己的理解,為什么列表有可能會卡頓,但是大家選擇了不同的做法?微信通訊錄的主場景是查找,按字母排序,很可能是快速的滑動,所以卡頓體驗相當不好,所以舍棄了一點點的滑動過程中的效果。一個新聞客戶端的主場景是瀏覽新聞,應該是慢慢滑動,這個時候快速滑動的卡頓感會被削弱,也即大多數用戶是不會用力滑動的,而大多數慢慢搓動刷新聞。所以對于關鍵路徑的理解不同,所產生的技術方案也不相同。

《羋月傳》中,大王娶了很多老婆,這些老婆在被開苞之后,全部被扔到了一級緩存中,隨時等待大王臨幸,但因為大王年齡越來越大,體力越來越差,并且伴隨著羋月和大王越來越match,羋姝,魏琰隨即被淘汰到了二級緩存中,這些心機較重的女人,如果能適時收手,也許還會被重新換入到一級緩存中,和大王有更多的機會見面,但多行不義必自斃,終會被從二級緩存中徹底刪除。

 

本文由 @給產品經理講技術(微信號:pm_teacher) 原創發布于人人都是產品經理?,未經許可,禁止轉載。

更多精彩內容,請關注人人都是產品經理微信公眾號或下載App
評論
評論請登錄
  1. “微信的第二個tab是通訊錄,當列表快速滑動的時候,滑動過程中,很多頭像都是默認的灰頭像”這塊不是很理解哎,因為滑動的時候看到的頭像還是原始的頭像,沒有灰頭像。不是很懂 ??

    來自北京 回復
    1. 剛才試了一下,太快的話確實出現灰色頭像

      回復
  2. 作者大大,倒數第二段是不是描述的有點問題?或者,能不能更詳細的給我講講兩者的緩存區別?緩存應該怎么做好?最近有新項目,遇到了緩存的問題。謝謝。

    回復
  3. 漲姿勢,不過最后的例子6得不行 :mrgreen:

    來自福建 回復
  4. 最后的例子不合適,扯遠了

    來自四川 回復
  5. 不錯!

    來自北京 回復