每天早上8點,用5,6分鐘的時間給你講一個白話版技術分析,洗滌心靈,幫你擺脫工作不適癥狀。
每天堅持很苦的,但是我樂意。
每天我都要刷十幾乃至幾十遍朋友圈,來獲取最新的資訊、八卦、行業(yè)大事兒,也順便看看周圍同事都在哪些國家玩耍,哪些同事又后半夜下班打不到車,還有最近周圍同事的孩子都成長的怎么樣,哈哈。八卦、裝逼、賣萌、邀功,每天在朋友圈里悉數上演。
扯遠了,我今天主要分析一下朋友圈的圖片緩存系統(tǒng)以及介紹一個緩存系統(tǒng)的設計要素。
緩存是什么?緩是臨時的意思,存是存儲的意思,所以緩存就是臨時存儲的意思。什么東西適合臨時存儲呢?文字、網頁、圖片、數據?一切都適合臨時存儲,并且也都適合永久存儲,要看業(yè)務類型。
以朋友圈為例,你一定離不開這幾種場景:
刷了幾頁之后,然后回到頭部,你會發(fā)現(xiàn)看過的圖片依舊在顯示,并沒有重新出現(xiàn)占位符,然后再顯示出圖片,表明這張圖片一直在內存中,隨時可被使用。 點擊一條新內容的圖片時,會展示一張小的縮略圖,然后loading一直在轉,過了一會兒一張清晰無碼大圖展現(xiàn)出來,表明這張圖片是從網絡拉取回來的,隨后再被使用。loading的過程中,只存在一張小的縮略圖。 當你翻到幾天前的內容,打開圖片的時候,有的時候跟2一樣,從網絡拉取,有的時候,瞬間打開,這是為啥呢?因為有可能還在緩存系統(tǒng)中,瞬間被使用。也有可能被淘汰刪除掉了,所以從網絡重新拉取。這幾種情況基本涵蓋了一個App或者其他應用程序所使用緩存系統(tǒng)的所有場景,只不過這個舉例以圖片為主,其他原理類似。
緩存系統(tǒng)經常分為兩級,稱為一級緩存,二級緩存。一級緩存也叫內存緩存,二級緩存也叫硬盤緩存(手機App中,在Sd卡上)。很顯然,一級緩存存取速度更快,程序退出數據就消失,不可一直保留,且多占了一些內存,容易被人叨逼叨的說程序占內存大,把系統(tǒng)拖慢了,其實這是非常合理的一種以空間換取時間的程序設計。二級緩存容量可以更大,速度要慢一些,程序下次啟動時候,依然可以使用。如果你不知道內存為什么比硬盤快,請出門左轉看看以前的文章,哈。
所以緩存系統(tǒng)設計就是分配兩塊存儲空間,一塊在內存,一塊在硬盤,假設內存分配5Mb,硬盤分配100Mb,前者叫一級緩存,后者叫二級緩存(硬盤相對比較便宜,所以一般分配要大些)。
現(xiàn)在來模擬下整個朋友圈的流程。
進入朋友圈開刷,這些圖片就不斷的占用5Mb的內存空間,這時你往回滑動,你會發(fā)現(xiàn)剛才的圖片還都在,因為這個時候一級緩存還沒滿,還可以繼續(xù)吃,所有的圖片也都能正常滿足業(yè)務需求。
假設這個時候已經滾動到了第三屏,一級緩存5Mb空間已被占滿,達到上限,所以必然要進行淘汰,目前業(yè)界一般會采用LRU(Least Recently Used)算法進行淘汰,也就是最近最少被使用的圖片被淘汰(想想還是很貼心的,最近最少被使用,對一個功利的程序來說,你是最佳人選,如果你在工作中最近最少被使用,要注意安全了哦,哈哈),所以按照朋友圈時間線的性質,第一張圖片被淘汰出了一級緩存,它會被安放到二級緩存,也即存儲到了硬盤上,注意雖然叫“淘汰”,但也沒有那么慘,沒有被完全丟棄打入冷宮,也算有了個不錯的歸宿,假設這個時候滑動回第一張圖片所在的位置,這個時候內存沒有這張圖片,一級緩存中沒有,一級緩存作為一個老好人,會問二級緩存,“第一張圖片”在你哪里嗎?這個時候回答是肯定的,所以一級緩存又按照剛才的算法,淘汰一些其他最近最少被使用的圖片出去,保證第一張圖片能夠在內存中,然后我們有又看到了第一張圖片。
繼續(xù)刷下去,我們會發(fā)現(xiàn)一級緩存5Mb滿了,一直在進行換出換入操作,也就是淘汰一些,選進來一些。硬盤100Mb的空間也有可能被撐滿,所以二級緩存也會進行淘汰工作,因為它是最下面的一層,所以只被動的接收一級緩存塞入圖片,以及自身的淘汰。
擴展到一個新聞客戶端乃至任何一個應用程序,整個流程都可按朋友圈自行腦補,原理都是一樣的,只不過對參數的配置略有不同,比如有的想提供更好的看圖體驗,一級緩存設計的比較大,能夠同時瀏覽更多的圖片,不用經常的換入換出,但是同時也耗用更多內存,程序的穩(wěn)定性也帶來挑戰(zhàn)。二級緩存占用也可以設計的比較大,這樣一些被經常使用的場景的圖片,就可以不用再從網絡上拉取,但是占用大了,一些管家、衛(wèi)士就要出現(xiàn)了,說某程序占用了多少多少空間,是否要現(xiàn)在清理,除非你是像微信這種全國人民不得不用的App,他們會相應的提高閾值,清理也會更慎重。在計算機程序中,時刻充滿博弈,你想占用更多的資源,就面臨更多的風險,用戶體驗和程序性能之間永遠要做衡量,雖然有矛盾,但一定有一個最適合你自己所做業(yè)務的方案,雖然有可能也是要經過取舍的。
再舉個例子,微信的第二個tab是通訊錄,當列表快速滑動的時候,滑動過程中,很多頭像都是默認的灰頭像,為什么是默認頭像呢,因為滑動的時候再去讀相應的頭像,并且對圖片解碼,會使整個列表的滑動掉幀卡頓。一些新聞客戶端的做法又恰恰不同,比如滑動的過程中,圖片就一張接著一張出來,明顯感覺是有些卡頓的,但是慢慢滑動是不會的。所以對于關鍵路徑的理解是選擇技術方案的最重要的要素。
我來談談自己的理解,為什么列表有可能會卡頓,但是大家選擇了不同的做法?微信通訊錄的主場景是查找,按字母排序,很可能是快速的滑動,所以卡頓體驗相當不好,所以舍棄了一點點的滑動過程中的效果。一個新聞客戶端的主場景是瀏覽新聞,應該是慢慢滑動,這個時候快速滑動的卡頓感會被削弱,也即大多數用戶是不會用力滑動的,而大多數慢慢搓動刷新聞。所以對于關鍵路徑的理解不同,所產生的技術方案也不相同。
《羋月傳》中,大王娶了很多老婆,這些老婆在被開苞之后,全部被扔到了一級緩存中,隨時等待大王臨幸,但因為大王年齡越來越大,體力越來越差,并且伴隨著羋月和大王越來越match,羋姝,魏琰隨即被淘汰到了二級緩存中,這些心機較重的女人,如果能適時收手,也許還會被重新?lián)Q入到一級緩存中,和大王有更多的機會見面,但多行不義必自斃,今天晚上的故事劇情應該就是他們被從二級緩存中徹底刪除……
歡迎添加微信公眾號:給產品經理講技術
本文地址:http://m.likemindfilms.com/news/yytg3145.html