面试题-在项目中,你是如何缓存数据的?

Android程序员面试宝典

数据的缓存从两方面来阐述:

  1. 对网络数据
    我们采取了两级缓存方案,来提高性能和用户体验的
    一级: 网络缓存
    请求消息或响应消息中设置Cache-Control来判断是否读取缓存
    Cache-Control:
    Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令有下几种:

Public指示响应可被任何缓存区缓存。
Private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。
no-cache指示请求或响应消息不能缓存
no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。
max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。
min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。
max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。

Cache-Control类的使用:

面试题-在项目中,你是如何缓存数据的?_第1张图片

请求时如何使用??

面试题-在项目中,你是如何缓存数据的?_第2张图片

二级: 磁盘缓存

使用了DiskLruCache进行本地缓存的

DiskLruCache介绍:

Google提供了一套硬盘缓存的解决方案:DiskLruCache(非Google官方编写,但获得官方认证)
DiskLruCache并没有限制数据的缓存位置,可以自由地进行设定,但是通常情况下多数应用程序都会将缓存的位置选择为 /sdcard/Android/data//cache 这个路径

选择在这个位置有两点好处:
第一, 这是存储在SD卡上的,因此即使缓存再多的数据也不会对手机的内置存储空间有任何影响,只要SD卡空间足够就行。
第二,这个路径被Android系统认定为应用程序的缓存路径,当程序被卸载的时候,这里的数据也会一起被清除掉,这样就不会出现删除程序之后手机上还有很多残留数据的问题

缓存原理:

打开缓存:
创建一个DiskLruCache的实例,则需要调用它的open()方法
写入缓存:
DiskLruCache的实例之后,我们就可以对缓存的数据进行操作了,操作类型主要包括写入、访问、移除等
写入的操作是借助DiskLruCache.Editor这个类完成的,通过edit()方法获取Editor,同时,edit()方法接收一个key,这个key将会成为缓存文件的文件名,通常我们对url进行md5之后,作为key传递editor。

有了DiskLruCache.Editor的实例之后,我们可以调用它的newOutputStream()方法来创建一个输出流,然后把它传入到downloadUrlToStream()中就能实现下载并写入缓存的功能了
注意:在写入操作执行完之后,我们还需要调用一下commit()方法进行提交才能使写入生效,调用abort()方法的话则表示放弃此次写入

读缓存:
主要是借助DiskLruCache的get()方法,获取一个DiskLruCache.Snapshot对象,通过该对象,调用它的getInputStream()方法就可以得到缓存文件的输入流了,然后把
有了文件的输入流之后,将文件输入流转换为文件或者字符串。就获取缓存数据

  1. 对图片数据
    网络缓存:
    通过Cache-Control的设置进行网络缓存

内存缓存:
内存缓存我们采用了LruCache

LruCache是android提供的一个缓存工具类,其算法是最近最少使用算法。
它把最近使用的对象用“强引用”存储在LinkedHashMap中,并且把最近最少使用的对象在缓存值达到预设定值之前就从内存中移除

LruCache:底层实现原理:

LruCache中Lru算法的实现就是通过LinkedHashMap来实现的。LinkedHashMap继承于HashMap,它使用了一个双向链表来存储Map中的Entry顺序关系,
对于get、put、remove等操作,LinkedHashMap除了要做HashMap做的事情,还做些调整Entry顺序链表的工作。
LruCache中将LinkedHashMap的顺序设置为LRU顺序来实现LRU缓存,每次调用get(也就是从内存缓存中取图片),则将该对象移到链表的尾端。
调用put插入新的对象也是存储在链表尾端,这样当内存缓存达到设定的最大值时,将链表头部的对象(近期最少用到的)移除。

磁盘缓存
使用的是DiskLruCache

  • 欢迎关注微信公众号、长期为您推荐优秀博文、开源项目、视频

  • 微信公众号名称:Android干货程序员

你可能感兴趣的:(面试题-在项目中,你是如何缓存数据的?)