一.简介

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使用感受的更多相关文章

  1. 【初码干货】【Azure系列】1、再次感受Azure,体验Windows Server 2016并部署BlogEngine.NET

    上个月末,在某人的建议下,重新注册了一个1元试用账户(包含1个月期限的1500元订阅),并充值了1000元转为了正式账户,相当于1000元得到了2500的订阅,于是又一次开启了Azure之旅. 在这不 ...

  2. 分享我对 ASP.NET vNext 的一些感受,也许多年回过头看 So Easy!

    写在前面 阅读目录: Visual Studio "14" CTP 关于 ASP.NET vNext ASP.NET vNext 实践 后记 ASP.NET vNext 发布已经过 ...

  3. "传成老树白茶"献礼母亲节 邀市民品茗感受茶文化

    5月8日下午,传成老树白茶巡回中国公益品鉴会第七十站,走进福州马尾区东方名城传成老树白茶文化馆. 本次品鉴会活动以“感恩母亲节”为主题,以马尾船政文化为背景,邀福州市民一起品鉴白茶,感受中国茶文化. ...

  4. C# 项目提交过程中感受

    C# 项目提交过程中感受 新到一家互联网公司,昨天第一次提交代码,遇到了不少问题,而且大多数是代码格式问题,特此将范的错误记录下来,自我警示. 1. 代码对齐,这个虽然一直也都在注意,不过还是有一行代 ...

  5. Deep Learning入门视频(下)之关于《感受神经网络》两节中的代码解释

    代码1如下: #深度学习入门课程之感受神经网络(上)代码解释: import numpy as np import matplotlib.pyplot as plt #matplotlib是一个库,p ...

  6. 微信小程序开发感受

    研究了大概有一个多星期的小程序了,说一下感受,之后会随时更新,一边学习,一边加上一部分学习代码和心得.我是一个前端厂里的新手,搬砖的时间不是很长,所以到一部分知识的理解浅之又浅,所以只能说自己的理解, ...

  7. 缓存AsimpleCache -- 解决Android中Sharedpreferences无法存储List数据/ASimpleCache

    Sharedpreferences想必大家在项目中都经常会用到,但是如果需要在本地需要存储比较多的数据,存储一个集合的时,发现Sharedpreferences并不 是那么好使了. 分析 如果需要在本 ...

  8. 在GMIC听“移动互联网+医疗”的感受 2015-04-29

    “互联网+”这个词挺火的,基本格式是“互联网+传统行业”,比如医疗.教育.交通等等.就更别说电子商务.金融这些领域了,相比已经和互联网分不 开了.在我看来,互联网+的背后,是信息化.智能化.信息沟通的 ...

  9. windows 8.1 试用感受:蛋疼感大幅降低

    众所周知windows 8 的最大使用感受就是蛋疼. 无论是微软MVP,还是我这样的万年不悔微软小白鼠,普通用户,小白用户,或多或少的都对这款操作系统感到蛋疼. 槽点太多,以至于大家都懒得批判了.好在 ...

随机推荐

  1. x01.os.10: 输入输出

    从 x01.Lab.Download 中下载源代码,进入工程目录,make 后再 bochs,即可见到如下界面: 随便打几个字,ok!按 F2,可切换到第二个终端,界面如下: 当然,按 F3 还可切换 ...

  2. android JAVA字符串转日期或日期转字符串(转)

    用法: SimpleDateFormat sdf = new SimpleDateFormat( " yyyy-MM-dd HH:mm:ss " ); 这一行最重要,它确立了转换的 ...

  3. discuz mysqli_connect() 不支持 advice_mysqli_connect

      看网友的解决方案是:下面2行去掉注释 ? 1 2 ;extension=php_mysql.dll ;extension=php_mysqli.dl 尝试修改 ? 1 #vi /etc/php.i ...

  4. php实现SESSION跨域

    稍微大一点的网站,通常都会有不只一个服务器,每个服务器运行着不同的功能模块或者不同的子系统,他们使用不同的二级域名,比如www.a.com.i.a.com.bbs.a.com.而一个整体性强的网站,用 ...

  5. Containers Reserved yarn resourcemanager

    yarn rm的管理页面中显示了集群的概况,其中有一个指标叫Containers Reserved . 预留的容器,为什么会预留,集群的资源使用饱合,新的app请求的资源一般会进入pending状态, ...

  6. KSFramework:集成U3D热重载框架 - README

    KSFramework KEngine + SLua+ Framework = KSFramework KSFramework是一个整合KEngine.SLua的Unity 5开发框架,并为程序.美术 ...

  7. python反弹tty shell

    linux环境下进行内外渗透需要反弹shell连接内网ssh,Telnet等,就需要tty层的shell了.python代码转过来的,备用. #!/usr/bin/python import sys ...

  8. 斗地主(Noip2015Day1T3)

    题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...

  9. Android:关于声明文件中android:process属性说明

    笔者在学习Android Service组件的过程中碰到了一个问题,就是在Android应用的声明文件Manifest.xml中有时候会对相关的服务标签设置一个android:process=&quo ...

  10. 转 mvc项目中,解决引用jquery文件后智能提示失效的办法

    mvc项目中,解决用Url.Content方法引用jquery文件后智能提示失效的办法   这个标题不知道要怎么写才好, 但是希望文章的内容对大家有帮助. 场景如下: 我们在用开发开发程序的时候,经常 ...