产品经理学技术|朋友圈中的图片缓存系统

7 评论 19470 浏览 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. 不错!

    来自北京 回复