中高级面试知识点:缓存

简介:

602af7b401594bed5ba07bd32ed2b37af6643e0b

前言

几乎所有的项目都做了缓存,但是缓存做的怎么样,其实只有我们自己知道。缓存做的好,没有网络也能流畅的使用;再多的数据请求都不会出现卡顿延迟等待很久的情况。

程序中除了图片缓存(三级缓存),还有信息缓存。当用户无法联网时,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次访问时间距当前时间最大的数据。如下:

5134f7a72ca16b5da0ccc09b4cc83966d8be1225

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

LFU

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

32af48abc40f3a0b5a20a6e854237bc4f225b813

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

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

1、http的缓存是怎么做的 ?
2、用的什么?(这个问题和线程会同问,一般问一个。)

答案请自行百度。我就不说了。因为我看过http的源码,看过他的缓存和线程。是自定义的。大家做一个了解就行。

这个问题被问到的频率不高。而高频问的一般是这种问题:有一个网络请求,有很多数据(比如一年,两年,每天的数据都要请求出来),然后拿到数据后做处理,然后recycleview(或listview)展示出来。像这种请求由于数据很多, 会有一段时间的等待,导致页面UI数据延迟的情况的解决方案。大家心里要做一个准备。


原文发布时间为:2018-11-13

本文作者:小饼干也有梦想

本文来自云栖社区合作伙伴“终端研发部”,了解相关信息可以关注“终端研发部”。

相关文章
|
4天前
|
SQL 分布式计算 监控
Sqoop数据迁移工具使用与优化技巧:面试经验与必备知识点解析
【4月更文挑战第9天】本文深入解析Sqoop的使用、优化及面试策略。内容涵盖Sqoop基础,包括安装配置、命令行操作、与Hadoop生态集成和连接器配置。讨论数据迁移优化技巧,如数据切分、压缩编码、转换过滤及性能监控。此外,还涉及面试中对Sqoop与其他ETL工具的对比、实际项目挑战及未来发展趋势的讨论。通过代码示例展示了从MySQL到HDFS的数据迁移。本文旨在帮助读者在面试中展现Sqoop技术实力。
21 2
|
4天前
|
监控 负载均衡 Cloud Native
ZooKeeper分布式协调服务详解:面试经验与必备知识点解析
【4月更文挑战第9天】本文深入剖析ZooKeeper分布式协调服务原理,涵盖核心概念如Server、Client、ZNode、ACL、Watcher,以及ZAB协议在一致性、会话管理、Leader选举中的作用。讨论ZooKeeper数据模型、操作、会话管理、集群部署与管理、性能调优和监控。同时,文章探讨了ZooKeeper在分布式锁、队列、服务注册与发现等场景的应用,并在面试方面分析了与其它服务的区别、实战挑战及解决方案。附带Java客户端实现分布式锁的代码示例,助力提升面试表现。
26 2
|
4天前
|
数据采集 消息中间件 监控
Flume数据采集系统设计与配置实战:面试经验与必备知识点解析
【4月更文挑战第9天】本文深入探讨Apache Flume的数据采集系统设计,涵盖Flume Agent、Source、Channel、Sink的核心概念及其配置实战。通过实例展示了文件日志收集、网络数据接收、命令行实时数据捕获等场景。此外,还讨论了Flume与同类工具的对比、实际项目挑战及解决方案,以及未来发展趋势。提供配置示例帮助理解Flume在数据集成、日志收集中的应用,为面试准备提供扎实的理论与实践支持。
21 1
|
2月前
|
缓存 Java 应用服务中间件
面试官:如何实现多级缓存?
面试官:如何实现多级缓存?
180 1
|
1月前
|
消息中间件 NoSQL 网络协议
Java面试知识点复习​_kaic
Java面试知识点复习​_kaic
|
5天前
|
分布式计算 资源调度 监控
Hadoop生态系统深度剖析:面试经验与必备知识点解析
本文深入探讨了Hadoop生态系统的面试重点,涵盖Hadoop架构、HDFS、YARN和MapReduce。了解Hadoop的主从架构、HDFS的读写流程及高级特性,YARN的资源管理与调度,以及MapReduce编程模型。通过代码示例,如HDFS文件操作和WordCount程序,帮助读者巩固理解。此外,文章强调在面试中应结合个人经验、行业动态和技术进展展示技术实力。
12 0
|
1月前
|
存储 缓存 Java
什么!?实战项目竟然撞到阿里面试的原题!???关于MyBatis Plus的缓存机制
什么!?实战项目竟然撞到阿里面试的原题!???关于MyBatis Plus的缓存机制
|
2月前
|
存储 缓存 索引
【数据结构入门精讲 | 第十四篇】散列表知识点及考研408、企业面试练习(1)
【数据结构入门精讲 | 第十四篇】散列表知识点及考研408、企业面试练习(1)
24 0
|
2月前
|
算法 计算机视觉
【数据结构入门精讲 | 第十六篇】并查集知识点及考研408、企业面试练习
【数据结构入门精讲 | 第十六篇】并查集知识点及考研408、企业面试练习
26 0
|
2月前
|
自然语言处理 数据安全/隐私保护
【数据结构入门精讲 | 第十五篇】散列表知识点及考研408、企业面试练习(2)
【数据结构入门精讲 | 第十五篇】散列表知识点及考研408、企业面试练习(2)
23 0