Android面试总结之缓存

admin 2023年2月24日09:13:42评论18 views字数 1755阅读5分51秒阅读模式
引入

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

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

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

缓存方式两点说明

  1. 不同类型的文件的缓存时间不一样。
    笼统的说,不变文件的缓存时间是永久,变化文件的缓存时间是最大忍受不变时间。说白点,图片文件内容是不变的,一般存在SD卡上直到被清理,我们是可以永远读取缓存的。配置文件内容是可能更新的,需要设置一个可接受的缓存时间。

  2. 不同环境下的缓存时间标准不一样。
    无网络环境下,我们只能读取缓存文件,为了应用有东西显示,没有什么过期之说了。
    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作用一致,都是指当前资源的有效期,控制是直接从缓存获取数据还是重新发送请求到服务器取数据。

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

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


    Android面试总结之缓存

  3. LFU - 最不经常使用(访问次数)
    替换掉访问次数最少的。这一策略意图保留最常用的、最流行的对象,替换掉很少使用的那些。
    LFU的每个数据块都有一个引用计数,所有数据块按照引用计数排序,具有相同引用计数的数据块则按照时间排序。
    如下:


    Android面试总结之缓存

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

作者:FeelsChaotic
链接:https://www.jianshu.com/p/6b1667c2c639
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


原文始发于微信公众号(汇编语言):Android面试总结之缓存

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年2月24日09:13:42
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Android面试总结之缓存http://cn-sec.com/archives/1569220.html

发表评论

匿名网友 填写信息