每天早上8点,用5,6分钟的时间给你讲一个白话版技术分析,洗涤心灵,帮你摆脱工作不适症状。
每天坚持很苦的,但是我乐意。
每天我都要刷十几乃至几十遍朋友圈,来获取最新的资讯、八卦、行业大事儿,也顺便看看周围同事都在哪些国家玩耍,哪些同事又后半夜下班打不到车,还有最近周围同事的孩子都成长的怎么样,哈哈。八卦、装逼、卖萌、邀功,每天在朋友圈里悉数上演。
扯远了,我今天主要分析一下朋友圈的图片缓存系统以及介绍一个缓存系统的设计要素。
缓存是什么?缓是临时的意思,存是存储的意思,所以缓存就是临时存储的意思。什么东西适合临时存储呢?文字、网页、图片、数据?一切都适合临时存储,并且也都适合永久存储,要看业务类型。
以朋友圈为例,你一定离不开这几种场景:
刷了几页之后,然后回到头部,你会发现看过的图片依旧在显示,并没有重新出现占位符,然后再显示出图片,表明这张图片一直在内存中,随时可被使用。 点击一条新内容的图片时,会展示一张小的缩略图,然后loading一直在转,过了一会儿一张清晰无码大图展现出来,表明这张图片是从网络拉取回来的,随后再被使用。loading的过程中,只存在一张小的缩略图。 当你翻到几天前的内容,打开图片的时候,有的时候跟2一样,从网络拉取,有的时候,瞬间打开,这是为啥呢?因为有可能还在缓存系统中,瞬间被使用。也有可能被淘汰删除掉了,所以从网络重新拉取。这几种情况基本涵盖了一个App或者其他应用程序所使用缓存系统的所有场景,只不过这个举例以图片为主,其他原理类似。
缓存系统经常分为两级,称为一级缓存,二级缓存。一级缓存也叫内存缓存,二级缓存也叫硬盘缓存(手机App中,在Sd卡上)。很显然,一级缓存存取速度更快,程序退出数据就消失,不可一直保留,且多占了一些内存,容易被人叨逼叨的说程序占内存大,把系统拖慢了,其实这是非常合理的一种以空间换取时间的程序设计。二级缓存容量可以更大,速度要慢一些,程序下次启动时候,依然可以使用。如果你不知道内存为什么比硬盘快,请出门左转看看以前的文章,哈。
所以缓存系统设计就是分配两块存储空间,一块在内存,一块在硬盘,假设内存分配5Mb,硬盘分配100Mb,前者叫一级缓存,后者叫二级缓存(硬盘相对比较便宜,所以一般分配要大些)。
现在来模拟下整个朋友圈的流程。
进入朋友圈开刷,这些图片就不断的占用5Mb的内存空间,这时你往回滑动,你会发现刚才的图片还都在,因为这个时候一级缓存还没满,还可以继续吃,所有的图片也都能正常满足业务需求。
假设这个时候已经滚动到了第三屏,一级缓存5Mb空间已被占满,达到上限,所以必然要进行淘汰,目前业界一般会采用LRU(Least Recently Used)算法进行淘汰,也就是最近最少被使用的图片被淘汰(想想还是很贴心的,最近最少被使用,对一个功利的程序来说,你是最佳人选,如果你在工作中最近最少被使用,要注意安全了哦,哈哈),所以按照朋友圈时间线的性质,第一张图片被淘汰出了一级缓存,它会被安放到二级缓存,也即存储到了硬盘上,注意虽然叫“淘汰”,但也没有那么惨,没有被完全丢弃打入冷宫,也算有了个不错的归宿,假设这个时候滑动回第一张图片所在的位置,这个时候内存没有这张图片,一级缓存中没有,一级缓存作为一个老好人,会问二级缓存,“第一张图片”在你哪里吗?这个时候回答是肯定的,所以一级缓存又按照刚才的算法,淘汰一些其他最近最少被使用的图片出去,保证第一张图片能够在内存中,然后我们有又看到了第一张图片。
继续刷下去,我们会发现一级缓存5Mb满了,一直在进行换出换入操作,也就是淘汰一些,选进来一些。硬盘100Mb的空间也有可能被撑满,所以二级缓存也会进行淘汰工作,因为它是最下面的一层,所以只被动的接收一级缓存塞入图片,以及自身的淘汰。
扩展到一个新闻客户端乃至任何一个应用程序,整个流程都可按朋友圈自行脑补,原理都是一样的,只不过对参数的配置略有不同,比如有的想提供更好的看图体验,一级缓存设计的比较大,能够同时浏览更多的图片,不用经常的换入换出,但是同时也耗用更多内存,程序的稳定性也带来挑战。二级缓存占用也可以设计的比较大,这样一些被经常使用的场景的图片,就可以不用再从网络上拉取,但是占用大了,一些管家、卫士就要出现了,说某程序占用了多少多少空间,是否要现在清理,除非你是像微信这种全国人民不得不用的App,他们会相应的提高阈值,清理也会更慎重。在计算机程序中,时刻充满博弈,你想占用更多的资源,就面临更多的风险,用户体验和程序性能之间永远要做衡量,虽然有矛盾,但一定有一个最适合你自己所做业务的方案,虽然有可能也是要经过取舍的。
再举个例子,微信的第二个tab是通讯录,当列表快速滑动的时候,滑动过程中,很多头像都是默认的灰头像,为什么是默认头像呢,因为滑动的时候再去读相应的头像,并且对图片解码,会使整个列表的滑动掉帧卡顿。一些新闻客户端的做法又恰恰不同,比如滑动的过程中,图片就一张接着一张出来,明显感觉是有些卡顿的,但是慢慢滑动是不会的。所以对于关键路径的理解是选择技术方案的最重要的要素。
我来谈谈自己的理解,为什么列表有可能会卡顿,但是大家选择了不同的做法?微信通讯录的主场景是查找,按字母排序,很可能是快速的滑动,所以卡顿体验相当不好,所以舍弃了一点点的滑动过程中的效果。一个新闻客户端的主场景是浏览新闻,应该是慢慢滑动,这个时候快速滑动的卡顿感会被削弱,也即大多数用户是不会用力滑动的,而大多数慢慢搓动刷新闻。所以对于关键路径的理解不同,所产生的技术方案也不相同。
《芈月传》中,大王娶了很多老婆,这些老婆在被开苞之后,全部被扔到了一级缓存中,随时等待大王临幸,但因为大王年龄越来越大,体力越来越差,并且伴随着芈月和大王越来越match,芈姝,魏琰随即被淘汰到了二级缓存中,这些心机较重的女人,如果能适时收手,也许还会被重新换入到一级缓存中,和大王有更多的机会见面,但多行不义必自毙,今天晚上的故事剧情应该就是他们被从二级缓存中彻底删除……
欢迎添加微信公众号:给产品经理讲技术
本文地址:http://www.tuquu.com/news/yytg3145.html