深入浅出理解DiskLruCache

九章 等级 408 0 0

什么是DiskLruCache?

简单来说,DiskLruCache是一种管理数据存储的技术,单从Cache的字面意思也可以理解到,"Cache","高速缓存"。在很多我们接触的APP中,大多数APP是利用了这一技术的,例如:微博,网易新闻,QQ等等。当无网络时,打开这类APP时,是不能接收网络数据的,但是你会发现无网络状态依然可以浏览到离线的数据,而这些离线的数据都是在有网络的情况下保存下来的,而这其中就涉及到DiskLruCache。

LruCache和DiskLruCache

LruCache和DiskLruCache两者都是利用到LRU算法(下文会做讲解),通过LRU算法对缓存进行管理,以最近最少使用作为管理的依据,删除最近最少使用的数据,保留最近最常用的数据。LruCache运用于内存缓存,而DiskLruCache是存储设备缓存。


为什么要使用DiskLruCache技术呢?

首先我们必须要了解到,离线数据存在的意义,当无网络或者是网络状况不好时,APP依然具备部分功能是一种很好的用户体验,假设网易新闻这类新闻客户端,数据完全存储在缓存中而不使用DiskLruCache技术存储,那么当客户端被销毁,缓存被释放,意味着再次打开APP将是一片空白,另外DiskLruCache技术也可为新闻客户端的“离线阅读”这一功能做技术支持。

DiskLruCache的存储路径是哪里?

DiskLruCache的存储路径是可以自定义的,不过也可以是默认的存储路径,而默认的存储路径一般是这样的:/sdcard/Android/data/包名/cache 。包名是指APP的包名。我们可以在手机上打开,浏览这一路径。

深入浅出理解DiskLruCache

关于DiskLruCache的实现

先来看看DiskLruCache的构造方法,主要传入四个参数:File对象(其中File对象中包含文件路径等信息),app对应版本,Key对应的文件数,最后是大小限制。

深入浅出理解DiskLruCache

DiskLruCache的存储open操作源码

创建DiskLruCache实例可以用 open方法。其中调用参数如上解释。

深入浅出理解DiskLruCache

对于上述四个参数有对应的获取方法,如下:

相关参数的获取方法

File对象的获取,如下:

深入浅出理解DiskLruCache

AppVersion的获取

深入浅出理解DiskLruCache

ValuesCount是Key所对应的文件数,我们通常选择一一对应的简单关系,这样比较方便控制,当然我们也可以一对多的关系,通常写入1,表示一一对应的关系。

maxSize用来表示最大可以缓存多少字节的数据。

关于DiskLruCache的实现算法LRU

LRU是Least Recently Used的缩写,即最近最少使用,常用于页面置换算法,是为虚拟页式存储管理服务的。

通过数据的历史访问记录,来辨别数据的使用频率,使用频率高的,说明被使用的概率就高,同样,使用频率低,意味着被使用概率低。这样对数据进行清理,清理掉使用概率低的数据。LRU算法博客:LRU算法

深入浅出理解DiskLruCache

如何使用DiskLruCache存储数据?

这里我们以浏览网络图片为例:以一个图片Url路径,下载对应网络图片。这个时候需要对图片设定所属Key,原本可以图片的网络路径为Key,但是这样的数据缺乏安全性,所以我们将网络路径加密,所得结果作为该图片的Key。

写缓存的实现

写入缓存的操作是DiskLruCache.Editor这个类实现的。这里将操作放在线程中。

深入浅出理解DiskLruCache

读取缓存的实现

读取缓存的操作是DiskLruCache的get()方法。

深入浅出理解DiskLruCache

清除缓存的实现

实际上,DiskLruCache是本身具备管理缓存的能力的,LRU算法就是对数据的管理,移除多余数据(最少访问或调用)。不过,这里还是有手动移除缓存这个方法:

深入浅出理解DiskLruCache

收藏
评论区

相关推荐

写C端,如何优雅的处理多个弹框的显示?(附带源码)
我的前端学习笔记📒 最近花了点时间把笔记整理到语雀上了,方便童鞋们阅读 我的前端学习笔记📒(https://www.yuque.com/wanggangfeng
React系列-自定义Hooks很简单(下)
我的前端学习笔记📒 最近花了点时间把笔记整理到语雀上了,方便童鞋们阅读 我的前端学习笔记📒(https://www.yuque.com/wanggangfeng
性能优化之防抖和节流
我的前端学习笔记📒 最近花了点时间把笔记整理到语雀上了,方便童鞋们阅读 我的前端学习笔记📒(https://www.yuque.com/wanggangfeng
JavaScript进阶之new的实现
我的前端学习笔记📒 最近花了点时间把笔记整理到语雀上了,方便童鞋们阅读 我的前端学习笔记📒(https://www.yuque.com/wanggangfeng
React系列之高阶组件
我的前端学习笔记📒 最近花了点时间把笔记整理到语雀上了,方便童鞋们阅读 我的前端学习笔记📒(https://www.yuque.com/wanggangfeng
Redux系列之分析中间件原理(附经验分享)
我的前端学习笔记📒 最近花了点时间把笔记整理到语雀上了,方便童鞋们阅读 我的前端学习笔记📒(https://www.yuque.com/wanggangfeng
JavaScript进阶之实现拖拽(上)
我的前端学习笔记📒 最近花了点时间把笔记整理到语雀上了,方便童鞋们阅读 我的前端学习笔记📒(https://www.yuque.com/wanggangfeng
React系列-轻松学会Hooks(中)
我的前端学习笔记📒 最近花了点时间把笔记整理到语雀上了,方便童鞋们阅读 我的前端学习笔记📒(https://www.yuque.com/wanggangfeng
一文搞懂什么是HTTP与HTTPS
(https://blog.csdn.net/petterp/article/details/102779257)Http与Https的区别。 在最近的开发中,深感网络相关基础知识薄弱,于是趁周末好好总结一
金三银四了,掌握 JS 这 36 个概念,助你一臂之力
作者:Mahdhi Rezvi 译者:前端小智 来源:dmitripavlutin 点赞再看,微信搜索【大迁世界(https://mp.weixin.qq.com/s/sY9ufGGKfcdaAQ7KJQs3HA)】,B站关注【前端小智(https://space.bilibili.com/31089477)】这个没有大厂背景,但有着
20 张图彻底弄懂 HTTPS 的原理
前言 近年来各大公司对信息安全传输越来越重视,也逐步把网站升级到 HTTPS 了,那么大家知道 HTTPS 的原理是怎样的吗,到底是它是如何确保信息安全传输的?网上挺多介绍 HTTPS,但我发现总是或多或少有些点有些遗漏,没有讲全,今天试图由浅入深地把 HTTPS 讲明白,相信大家看完一定能掌握 HTTPS 的原理,本文大纲如下: HTTP 为什么不安全
一文读懂http缓存(超详细)
前端缓存 前端缓存可分为两大类:http缓存和浏览器缓存。我们今天重点讲的是http缓存,所以关于浏览器缓存大家自行去查阅。下面这张图是前端缓存的一个大致知识点: (https://imghelloworld.osscnbeijing.aliyuncs.com/3e161cfcbe560b9608064ec91077346
深入浅出理解DiskLruCache
什么是DiskLruCache? 简单来说,DiskLruCache是一种管理数据存储的技术,单从Cache的字面意思也可以理解到,"Cache","高速缓存"。在很多我们接触的APP中,大多数APP是利用了这一技术的,例如:微博,网易新闻,QQ等等。当无网络时,打开这类APP时,是不能接收网络数据的,但是你会发现
7个关于"this"面试题,你能回答上来吗?
作者:Shadeed 译者:前端小智 来源:dmitripavlutin 点赞再看,微信搜索【大迁世界(https://mp.weixin.qq.com/s/sY9ufGGKfcdaAQ7KJQs3HA)】,B站关注【前端小智(https://space.bilibili.com/31089477)】这个没有大厂背景,但有着一股向上积
https://cloud.tencent.com/developer/article/write/1830331
一、目标今天的目标是这个sign和appcode 二、步骤 Jadx没法上了app加了某梆的企业版,Jadx表示无能为力了。 FRIDADEXDumpDexDump出来,木有找到有效的信息。 Wallbreaker葫芦娃的Wallbreaker可以做些带壳分析,不过这个样本,用Frida的Spawn模式可以载入,Attach模式会失败。而直接用Objecti