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,还是我这样的万年不悔微软小白鼠,普通用户,小白用户,或多或少的都对这款操作系统感到蛋疼. 槽点太多,以至于大家都懒得批判了.好在 ...
随机推荐
- CentOS系统启动流程你懂否
一.Linux内核的组成 相关概念: Linux系统的组成部分:内核+根文件系统 内核:进程管理.内存管理.网络协议栈.文件系统.驱动程序. IPC(Inter-Process Communicati ...
- 虚拟机centos6.5 --ssh免密码登录
说明:此处是以hadoop虚拟机3台机器为背景进行设置,即master.slave01.slave02 1.在master上,生成公钥.私钥 用hadoop用户登录系统,进入个人主目录,即/home/ ...
- emacs 新手笔记(四) —— 使用 dired 完成一些简单的文件和目录操作
ilocker:关注 Android 安全(新入行,0基础) QQ: 2597294287 据说熟悉了 dired,就可以在 emacs 下轻松管理文件和目录了,甚至不再需要 shell 和桌面操作. ...
- 使用Fiddler对Android或者iOS设备进行抓包
1.PC端Fiddler配置 Tools->HTTPS->选中“Decrpt HTTPS traffic”,“Ignore server certificate errors” Tools ...
- 用pygame学习初级python(二) 15.5.11
闲得无聊,对第一版的东西做了一些修改,让它更像一个游戏,也具有一些可玩性. 项目的github地址:https://github.com/lfkdsk/BrainHole_pygame 1.人物类进行 ...
- 【CImg】霍夫变换——直线检测
霍夫变换——直线检测 考古debug,其实很久之前就解决的bug......一直忘记过来改文章....欸 =============================原文================ ...
- 线程同步以及yield()、wait()、Notify()、Notifyall()
一.线程同步 1.线程同步的目的是为了保护多个线程访问一个资源时对资源的破坏. 2.线程同步方法是通过锁来实现,每个对象都有切仅有一个锁,这个锁与一个特定的对象关联,线程一旦获取了对象锁,其他访问该对 ...
- Redis的安装和使用
Redis 安装redis: 将将要安装redis文件夹放到一个盘中 通过命令行切换到放文件的地方 安装成功后,将文件夹中的扩展放入wamp/php/ext中,然后配置php.ini,重启服务器. 使 ...
- mvc5权限管理(简单登录):ActionFilterAttribute
效果图: 1.控制器 public ActionResult Index() { return View(); } [HttpPost] public ActionResult Index(User ...
- CSS3线性渐变和径向渐变
background:linear-gradient(to top left, blue,orange);//从右下角往左上角渐变 background:radial-gradient(to top ...