移动产品基础模块设计规范之应用缓存

我们的产品在 1.3 的时候有了较大的调整,包括 UI、功能等方面,当然类似缓存这样的基础能力也是不可或缺的。下面带大家一起了解下缓存相关的知识和应用。
一 什么是应用缓存
缓存就是数据交换的缓冲区(称作Cache),当某一设备要读取数据时,会首先从缓存中查找需要的数据,如果找到了则直接执行,找不到的话则从内存中找。由于缓存的运行速度比内存快得多,故缓存的作用就是帮助硬件更快地运行。
APP 中显示的数据除了从服务器获取,还有一个数据来源就是本地数据库(缓存),它给我们的设计增加了很多丰富性。
二 缓存工作原理
缓存的工作原理是当CPU要读取一个数据时,首先从 CPU 缓存中查找,找到就立即读取并送给CPU处理;没有找到,就从速率相对较慢的内存中读取并送给CPU处理,同时把这个数据所在的数据块调入缓存中,可以使得以后对整块数据的读取都从缓存中进行,不必再调用内存。正是这样的读取机制使CPU读取缓存的命中率非常高,也就是说 CPU下 一次要读取的数据90%都在 CPU 缓存中,只有大约10%需要从内存读取。这大大节省了CPU 直接读取内存的时间,也使 CPU 读取数据时基本无需等待。总的来说,CPU 读取数据的顺序是先缓存后内存。
RAM 和 ROM 相对的,RAM 是掉电以后,其中的信息就消失那一种,ROM 在掉电以后信息也不会消失那一种。RAM 又分两种,一种是静态RAM,SRAM;一种是动态 RAM,DRAM。前者的存储速率要比后者快得多,使用的内存一般都是动态 RAM。为了增加系统的速率,把缓存扩大就行了,扩的越大,缓存的数据越多,系统就越快了,缓存通常都是静态RAM,速率是非常的快, 但是静态 RAM 集成度低, 价格高,由此可见,扩大静态 RAM 作为缓存是一个非常愚蠢的行为,但是为了提高系统的性能和速率,必须要扩大缓存, 这样就有了一个折中的方法,不扩大原来的静态RAM缓存,而是增加一些高速动态 RAM 做为缓存, 这些高速动态 RAM 速率要比常规动态 RAM 快,但比原来的静态 RAM 缓存慢, 把原来的静态 RAM 缓存叫一级缓存,而把后来增加的动态RAM叫二级缓存。
二 缓存存在的意义
缓存工作的原则,就是“引用的局部性”,这可以分为时间局部性和空间局部性。空间局部性是指 CPU 在某一时刻需要某个数据,那么很可能下一步就需要其附近的数据;时间局部性是指当某个数据被访问过一次之后,过不了多久时间就会被再一次访问。对于应用程序而言,不管是指令流还是数据流都会出现引用的局部性现象。
从程序代码上来考虑,设计者通常也会尽量避免出现程序的跳跃和分支,让 CPU 可以不中断地处理大块连续数据。游戏、模拟和多媒体处理程序通常都是这方面的代表,以小段代码连续处理大块数据。不过在办公运用程序中,情况就不一样了。改动字体,改变格式,保存文档,都需要程序代码不同部分起作用,而用到的指令通常都不会在一个连续的区域中。于是 CPU 就不得不在内存中不断跳来跳去寻找需要的代码。这也就意味着对于办公程序而言,需要较大的缓存来读入大多数经常使用的代码,把它们放在一个连续的区域中。如果缓存不够,就需要缓存中的数据,而如果缓存足够大的话,所有的代码都可以放入,也就可以获得最高的效率。同理,高端的数据应用以及游戏应用则需要更高容量的缓存。
简单来说,缓存的意义主要有:
1. 告知用户产品结构和信息,不会让用户直接看到异常,增强用户体验;
2. 部分减轻用户请求对服务器的压力;
3. 提示用户,告知用户网络情况,使用缓存的情况多出现在网络状况不好或者无网的情况
三 缓存处理的方式
自己对比了几家牛逼公司的产品,在这里不一一列举了。当然这么细节的东西,他们或许就不是很在意吧~(我自己想的~)
教大家一个检测的方式,先在有网的情况下浏览一段时间 App,之后关闭网络,且杀死应用进程,然后再打开应用。你就能观察这个应用的缓存了,做的好不好,自己可以尝试下咯~
就产品而言,在应用中使用缓存的方式主要有几种:
1. 在无网络或者网络出错时,优先展示本地缓存数据,之后自动刷新界面,向用户展示非模态提示,文案“网络错误或无链接…”,或者“您的网络不给力…”等;也有可能会在缓存到的位置增加提示。这种方式是目前使用较多的。
推荐产品截图-网易
2. 在无网络或者网络出错时,没有缓存数据,只显示本地包中的元素,且向用户展示非模态提示,文案“网络错误或无链接…”,或者“您的网络不给力…”等。
推荐产品截图-简书
3. 在无网络或者网络出错时,优先自动刷新界面,且向用户展示提示,文案“网络错误或无链接…”,或者“您的网络不给力…”等。之后展示本地缓存数据。这种方式和第一种的流程不太一样,在网络状况好转的时候,应用会自动刷新且请求新数据,替换较早的缓存数据。
就目前来说,第二种方式用的较多,产品上做的细致的,大多会使用第一种方式。
大家可以多看看其他产品哦~
四 缓存的深度
再来和大家聊聊缓存的深度。
一般——当然也是我自己观察的——应用会有两层的缓存深度,也就是应用主 Tab 以及主 Tab 中内容点击后的一级内容缓存。主要有:
主界面缓存。前面提到了,主界面缓存就是应用中的 Tab 对应的界面。当用户浏览到对应界面的位置,应用就会缓存对应的数据。包括的数据可能有图片、文字、动画等。
主界面中的内容点击后的缓存。顾名思义,点击列表中的内容查看详情,点击评论 icon 到评论列表,点击用户头像跳转到用户 Profile,等等,也会有可能存在缓存。
当然,两级缓存不是绝对的,也有可能出现三级缓存。但对应的,随着缓存深度的增加,对应用的影响也会增加。同时,对用户的影响也有可能增大;用户有可能因应用占用设备空间太大而决定删掉应用。
需要注意的是,如果应用中采用的 webview 的方式,内嵌 H5 页面。在无网络或者网络出错时,H5 页面的内容是无法获取的。大家可以在无网络的情况下,点击微信中发现“购物”或“游戏”cell,观察下。
推荐产品截图-微信
五 当网络变正常时
这时候,应用也会有很多方式处理设备缓存和新数据之间的关系。上文中,我提到了一些,大家也可以在实际的观察中多多总结,并且应用的自己的产品中。
本文由人人都是产品经理专栏作家 @郑几块 授权发布于人人都是产品经理 。未经许可,禁止转载。
您好,能否告知我您的QQ或其他联系方式?有些缓存的问题,想要咨询您的。谢谢。