安卓中高级开发面试知识点之——缓存

前言

几乎全部的项目都作了缓存,可是缓存作的怎么样,其实只有咱们本身知道。缓存作的好,没有网络也能流畅的使用;再多的数据请求都不会出现卡顿延迟等待好久的状况。前端

程序中除了图片缓存(三级缓存),还有信息缓存。当用户没法联网时,app会默认显示缓存的数据。android

前言缓存方式

SQLite

下载完数据文件后,把文件的相关信息如url,路经,下载时间,过时时间等存放到数据库,把url做为惟一的标识。下次下载的时候根据url先从数据库中查询,若是查询到当前时间并未过时,就根据路径读取本地文件,从而实现缓存的效果。程序员

文件缓存使用File.lastModified()方法获得文件的最后修改时间,与当前时间判断是否过时,从而实现缓存效果。数据格式为JSON。面试

缓存方式两点说明算法

一、不一样类型的文件的缓存时间不同。笼统的说,不变文件的缓存时间是永久,变化文件的缓存时间是最大忍受不变时间。说白点,图片文件内容是不变的,通常存在SD卡上直到被清理,咱们是能够永远读取缓存的。配置文件内容是可能更新的,须要设置一个可接受的缓存时间。数据库

二、不一样环境下的缓存时间标准不同。无网络环境下,咱们只能读取缓存文件,为了应用有东西显示,没有什么过时之说了。后端

WiFi

网络环境下,缓存时间能够设置短一点,一是网速较快,而是流量不要钱。缓存

3G

流量环境下,缓存时间能够设置长一点,节省流量,并且用户体验也更好。安全

缓存时间服务器

app中多个页面的缓存时间是不同的,对实时性要求高的页面缓存时间较短。而http消息头中包含有缓存时间,android端无需本身记录/规定缓存时间,读取便可。

http协议对缓存的支持

Expires & Cache-Control

Expires响应首部给出了响应失效的绝对时间,这样客户端就能够缓存一份副本,在这个时间到期以前,

不用去询问服务器它是否有效了。http1.0引入。 例:Expires: Thu, 03 Oct 1997 17:15:00 GMT

Cache-Control首部用于传输对象的缓存信息。http1.1引入。它的值是一个缓存指令,给出了与某个对象可缓存性有关的特有指令。这个首部能够出如今请求或者响应头中。例如:Cache-Control: no-cache

CacheControl

有两个字段表达响应的过时时间:max-age和max-stale

前者表示:max-age秒内,网页再有请求,你不要来我服务端,直接取你本地缓存的结果好了

后者表示:max-stale秒内的请求,你可使用本地缓存的,但仍是要来我服务端问问,到底行不行,固然,这里要带上Last Modified等信息 ,若是服务端返回了304,那说明你本地缓存继续用吧,我不给你响应体200的话,天然就带上了响应体。

Expires和Cache-Control做用一致,都是指当前资源的有效期,控制是直接从缓存获取数据仍是从新发送请求到服务器取数据。

缓存算法

一、LRU - 最近最少使用(最后访问时间)替换掉最近被请求最少的文档。这一传统策略在实际中应用最广。在CPU缓存淘汰和虚拟内存系统中效果较好。

二、LRU-K

LRU-K

中的K表明最近使用的次数,也能够认为是LRU-1。LRU-K的主要目的是为了解决LRU算法“缓存污染”的问题,其核心思想是将“最近使用过1次”的判断标准扩展为“最近使用过K次”。相比LRU,LRU-K须要多维护一个队列,用于记录全部缓存数据被访问的历史。只有当数据的访问次数达到K次的时候,才将数据放入缓存。当须要淘汰数据时,LRU-K会淘汰第K次访问时间距当前时间最大的数据。以下:

3.  LFU - 最不常用(访问次数)替换掉访问次数最少的。这一策略意图保留最经常使用的、最流行的对象,替换掉不多使用的那些。

LFU

的每一个数据块都有一个引用计数,全部数据块按照引用计数排序,具备相同引用计数的数据块则按照时间排序。以下:

image.png

4. SIZE(缓存大小)替换size最大的对象。这一策略经过淘汰一个大对象而不是多个小对象来提升命中率。不过,可能有些进入缓存的小对象永远不会再被访问。SIZE策略没有提供淘汰这类对象的机制,会致使“缓存污染”(大量偶发性的数据访问让内存中存放大量冷数据,也便是缓存污染)。

引伸几个问题,面试常被问到的问题:

一、http的缓存是怎么作的 ? 二、用的什么?(这个问题和线程会同问,通常问一个。) 答案请自行百度。我就不说了。由于我看过http的源码,看过他的缓存和线程。是自定义的。你们作一个了解就行。

这个问题被问到的频率不高。而高频问的通常是这种问题:有一个网络请求,有不少数据(好比一年,两年,天天的数据都要请求出来),而后拿到数据后作处理,而后recycleview(或listview)展现出来。像这种请求因为数据不少, 会有一段时间的等待,致使页面UI数据延迟的状况的解决方案。你们内心要作一个准备。

做者:小饼干也有梦想 连接:www.jianshu.com/p/461554b2c…

阅读更多

除程序员,除了写好代码,你更应该学会这些!

你说,你的APP要不要保活?

面试官:你说一下对线程安全了解多少?

前端:后端,我要分手,你不适合我

相信本身,没有作不到的,只有想不到的

在这里得到的不只仅是技术!

image
相关文章
相关标签/搜索