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,还是我这样的万年不悔微软小白鼠,普通用户,小白用户,或多或少的都对这款操作系统感到蛋疼. 槽点太多,以至于大家都懒得批判了.好在 ...
随机推荐
- x01.os.10: 输入输出
从 x01.Lab.Download 中下载源代码,进入工程目录,make 后再 bochs,即可见到如下界面: 随便打几个字,ok!按 F2,可切换到第二个终端,界面如下: 当然,按 F3 还可切换 ...
- android JAVA字符串转日期或日期转字符串(转)
用法: SimpleDateFormat sdf = new SimpleDateFormat( " yyyy-MM-dd HH:mm:ss " ); 这一行最重要,它确立了转换的 ...
- discuz mysqli_connect() 不支持 advice_mysqli_connect
看网友的解决方案是:下面2行去掉注释 ? 1 2 ;extension=php_mysql.dll ;extension=php_mysqli.dl 尝试修改 ? 1 #vi /etc/php.i ...
- php实现SESSION跨域
稍微大一点的网站,通常都会有不只一个服务器,每个服务器运行着不同的功能模块或者不同的子系统,他们使用不同的二级域名,比如www.a.com.i.a.com.bbs.a.com.而一个整体性强的网站,用 ...
- Containers Reserved yarn resourcemanager
yarn rm的管理页面中显示了集群的概况,其中有一个指标叫Containers Reserved . 预留的容器,为什么会预留,集群的资源使用饱合,新的app请求的资源一般会进入pending状态, ...
- KSFramework:集成U3D热重载框架 - README
KSFramework KEngine + SLua+ Framework = KSFramework KSFramework是一个整合KEngine.SLua的Unity 5开发框架,并为程序.美术 ...
- python反弹tty shell
linux环境下进行内外渗透需要反弹shell连接内网ssh,Telnet等,就需要tty层的shell了.python代码转过来的,备用. #!/usr/bin/python import sys ...
- 斗地主(Noip2015Day1T3)
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...
- Android:关于声明文件中android:process属性说明
笔者在学习Android Service组件的过程中碰到了一个问题,就是在Android应用的声明文件Manifest.xml中有时候会对相关的服务标签设置一个android:process=&quo ...
- 转 mvc项目中,解决引用jquery文件后智能提示失效的办法
mvc项目中,解决用Url.Content方法引用jquery文件后智能提示失效的办法 这个标题不知道要怎么写才好, 但是希望文章的内容对大家有帮助. 场景如下: 我们在用开发开发程序的时候,经常 ...