ASimpleCache使用感受
一.简介
ASimpleCache只能作为一份教程,一个学习样板,不能当真把它当回事。
作者杨福海,Afinal框架也是他创造的。
可是我读ASimpleCache的900行代码时,发现各种难看,并且都是很低级的缺点。我看的代码是从github上下的,大概是2013年写的,两三年没动了。可是网上为啥那么多关于ASimpleCache的文章,大概是因为它比较短比较能说明缓存的原理吧。
二.代码缺点举例
比如拼写错误,明明是getDateInfoFromData()却写成了getDateFromDate(),虽然不太重要,但看的好难受有没有。
private static String[] getDateInfoFromDate(byte[] data) {
if (hasDateInfo(data)) {
String saveDate = new String(copyOfRange(data, 0, 13));
String deleteAfter = new String(
copyOfRange(data, 14, indexOf(data, mSeparator)));
return new String[]{saveDate, deleteAfter};
}
return null;
再比如字符串拼接问题,这个函数的作用是从文件中读取字符串,因为反复用到字符串拼接,用StringBuilder总没错吧,可是代码中用的是String,这就叫我怎能放心去用它。
public String getAsString(String key) {
File file = mCache.get(key);
if (!file.exists())
return null;
boolean removeFile = false;
BufferedReader in = null;
try {
in = new BufferedReader(new FileReader(file));
String readString = "";
String currentLine;
while ((currentLine = in.readLine()) != null) {
readString += currentLine;
}
if (!Utils.isDue(readString)) {
return Utils.clearDateInfo(readString);
} else {
removeFile = true;
return null;
}
} catch (IOException e) {
e.printStackTrace();
return null;
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (removeFile)
remove(key);
}
}
三.原理概述
缓存的当然是键值对!这个键值对不能存在内存里,否则应用程序终止之后,键值对就丢了。于是你说,那就程序关闭之前从内存里保存到磁盘不久完了。我说不行,因为程序可能非正常退出,那样键值对不就全丢了,太不稳定了。所以,既然是缓存就要把一切信息存到磁盘上去。
键就是文件名,值当然就是文件内容了。凡是缓存,必有如下几个特性:
- 会过期,当然也可能是永远不过期,这过期时间,也应该放在磁盘上,等下次命中时,检测是否过期
- 不重要,愿删就删,顶多费点力气重新下载
ASimpleCache把过期时间存到了文件内容中,前4个字节表示一个int,用来表示保质期秒数。
既然是文件,那就太简单了,不仅可以存字符串,还可以存二进制。这么一来,再对它封装一下,就可以直接缓存图片Bitmap和drawable,serializable和jsonObject了,他们只是一个马甲。
缓存太多了怎么办,把旧的删除。怎么算缓存太多?第一,缓存的条目(也就是键的个数)不能太多;第二,缓存的文件总大小不能太大,也就是文件夹的大小不能太大。用一个CacheManager来维护,当应用程序启动时,根据文件夹下的文件个数和文件夹大小来初始化这个CacheManager,当往缓存中put时,就先检测大小,若超过了,那就删一点再存。CacheManager还有一个作用,维护一个hashMap用于快速定位键值对,也是在应用启动时进行初始化。
存到哪里去?在android中,每一个Context都有一个getCacheDir()函数,返回的是一个文件夹,都缓存到这里去就行了。
查找时,根据key确定文件名,去cache目录下找到文件并读取全部字符串,其中这些字符串中包含着saveTime,也就是缓存的保质期。当调用get()函数获取内容时,如果发现过期了,那就不能再用它了,就把这个文件删掉,同时更改CacheManager的缓存个数及缓存大小(如果缓存太大了,就会按照最近最少使用原则删掉旧文件),如你所知,当关闭应用程序并再次启动时,需要遍历cache目录来初始化CacheManager。
ASimpleCache使用感受的更多相关文章
- 【初码干货】【Azure系列】1、再次感受Azure,体验Windows Server 2016并部署BlogEngine.NET
上个月末,在某人的建议下,重新注册了一个1元试用账户(包含1个月期限的1500元订阅),并充值了1000元转为了正式账户,相当于1000元得到了2500的订阅,于是又一次开启了Azure之旅. 在这不 ...
- 分享我对 ASP.NET vNext 的一些感受,也许多年回过头看 So Easy!
写在前面 阅读目录: Visual Studio "14" CTP 关于 ASP.NET vNext ASP.NET vNext 实践 后记 ASP.NET vNext 发布已经过 ...
- "传成老树白茶"献礼母亲节 邀市民品茗感受茶文化
5月8日下午,传成老树白茶巡回中国公益品鉴会第七十站,走进福州马尾区东方名城传成老树白茶文化馆. 本次品鉴会活动以“感恩母亲节”为主题,以马尾船政文化为背景,邀福州市民一起品鉴白茶,感受中国茶文化. ...
- C# 项目提交过程中感受
C# 项目提交过程中感受 新到一家互联网公司,昨天第一次提交代码,遇到了不少问题,而且大多数是代码格式问题,特此将范的错误记录下来,自我警示. 1. 代码对齐,这个虽然一直也都在注意,不过还是有一行代 ...
- Deep Learning入门视频(下)之关于《感受神经网络》两节中的代码解释
代码1如下: #深度学习入门课程之感受神经网络(上)代码解释: import numpy as np import matplotlib.pyplot as plt #matplotlib是一个库,p ...
- 微信小程序开发感受
研究了大概有一个多星期的小程序了,说一下感受,之后会随时更新,一边学习,一边加上一部分学习代码和心得.我是一个前端厂里的新手,搬砖的时间不是很长,所以到一部分知识的理解浅之又浅,所以只能说自己的理解, ...
- 缓存AsimpleCache -- 解决Android中Sharedpreferences无法存储List数据/ASimpleCache
Sharedpreferences想必大家在项目中都经常会用到,但是如果需要在本地需要存储比较多的数据,存储一个集合的时,发现Sharedpreferences并不 是那么好使了. 分析 如果需要在本 ...
- 在GMIC听“移动互联网+医疗”的感受 2015-04-29
“互联网+”这个词挺火的,基本格式是“互联网+传统行业”,比如医疗.教育.交通等等.就更别说电子商务.金融这些领域了,相比已经和互联网分不 开了.在我看来,互联网+的背后,是信息化.智能化.信息沟通的 ...
- windows 8.1 试用感受:蛋疼感大幅降低
众所周知windows 8 的最大使用感受就是蛋疼. 无论是微软MVP,还是我这样的万年不悔微软小白鼠,普通用户,小白用户,或多或少的都对这款操作系统感到蛋疼. 槽点太多,以至于大家都懒得批判了.好在 ...
随机推荐
- 深入理解linux系统的目录结构(总结的非常详细)
对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统只管重要,下面 ...
- 上一周,小白的我试着搭建了两个个人博客:在github和openshift上
上一周,突发奇想,想搭建个自己的博客. 由于是突发奇想,自然想先找免费的试试手.仔细搜索下,选定了目标Openshift和Github. Openshift 安装WordPress OpenShift ...
- AngularJS 拦截器
在需要进行身份验证时,在请求发送给服务器之前或者从服务器返回时对其进行拦截,是比较好的实现手段. 例如,对于身份验证,如果服务器返回401状态码,将用户重定向到登录页面. AngularJS通过拦截器 ...
- 理解 OpenStack + Ceph (8): 基本的 Ceph 性能测试工具和方法
本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 ...
- Struts2工作原理
Struts2工作原理 Struts2请求响应流程: 在struts2的应用中,从用户请求到服务器返回相应响应给用户端的过程中,包含了许多组件如:Controller.ActionProxy.Acti ...
- 详细说说 Google Test Certified 的各级——Level 2,3
转载请联系作者,谢谢! No releases with red tests基于Level1搭建的持续集成,持续发布选用的CL(changelist)就可以取自CI系统最后跑通的CL,因为持续集成 ...
- 微软极品工具箱-Sysinternals Suite
工具包由来 Sysinternals Suite是微软发布的一套非常强大的免费工具程序集,一共包括74个windows工具.Sysinternals是Winternals公司提供的免费工具,Winte ...
- [转]mvc3 使用session来存储类来存储用户登陆信息
mvc3 使用session来存储类来存储用户登陆信息 2013-08-26 09:48:56| 分类: NET开发 |举报 |字号 订阅 项目之前的登陆机制是这样的:用户登陆后初始化一个类,类 ...
- java 26 - 7 网络编程之 TCP协议代码优化
上次所写的代码中,客户端和服务器端所进行的数据传输所用的是字节流. 优化: A:这次,为了高效,对这个字节流通过转换流来进行包装,包装成高效字符流. B:这次,传输的数据是通过键盘录入的数据. 服务器 ...
- 虚拟机 centos设置代理上网
假设我们要设置代理为 IP:PORT 1.网页上网 网页上网设置代理很简单,在firefox浏览器下 Edit-->>Preferences-->>Advanced--> ...