关闭

数据请求优化之容器缓存

标签: 优化数据缓存
3032人阅读 评论(6) 收藏 举报
分类:

今天qiugong兄弟喜得贵子,升级当爸,开心之余,决定写篇博客庆祝下,之前忙着一些琐事,自从上篇博客最新Retrofit + RxJava + MVP 发表后,原本打算写上十篇左右贴子来讲述之前传到github上的framework,却拖了一个多月还未动笔,惭愧。

对于日常开发中,有时候很多接口并不需要多次调用,只需要访问一次就够,比如省、市、区三级目录,如果把这个放在本地,处理不当就会卡死,之前想用文本存储,文本中放json,三级目录的完整json还是挺大的,好像有140kb,具体记不清了,还有一种方案就是放xml,也还是觉得不妥,处理也很麻烦,比较好的方案,个人推荐使用容器缓存。

先上代码:

/**
 * 配置过期类型和时间
 *
 * Created by Zero on 2017/5/30.
 */

public class CacheObject {

    private long timestamp;
    private int period = -1;
    private Object data;

    /**
     * @param data
     * @param period -1 表示永不过期,大于0表示过期的时间,单位分钟
     */
    public CacheObject(Object data, int period) {
        timestamp = System.currentTimeMillis();
        this.data = data;
        this.period = period;
    }

    public Object getObject() {
        return data;
    }

    public boolean isValid() {
        if (period == -1 || System.currentTimeMillis() < (timestamp + period * 60000)) {
            return true;
        }
        return false;
    }

    public void setPeriod(int period) {
        this.period = period;
    }

    public int getPeriod() {
        return period;
    }
}

这里是对缓存类型和时间的配置,可以配置成永不过期,也可以配置成指定时间过期,比如有些token,在后台多少时间后便会过期,招商银行的APP就是这么做的,每次把app打入冷宫后,时间一长,矫情的她就离我而去,需要重新登录,对于省市区三级目录,这些属于常年不变的,可以使用长期缓存。

/**
 * 数据请求中对cache进行管理
 * Created by Zero on 2017/5/30.
 */

public class CacheManager {

    private static Map<String, CacheObject> cacheMap = new HashMap<>();

    /**
     * 添加到cache
     *
     * @param key
     * @param data
     * @param period
     */
    public static void addData(String key, Object data, int period) {
        CacheObject cacheObject = getData(key);
        if (cacheObject != null) {
            /**
             * 如果类型不同,便重新加入到缓存中
             */
            if (period != cacheObject.getPeriod()) {
                cacheObject.setPeriod(period);
                /**
                 * 移除老的value
                 */
                removeInvalidData(key);
                /**
                 * 重新putvalue
                 */
                cacheMap.put(key, cacheObject);
            }
        } else {
            cacheObject = new CacheObject(data, period);
            cacheMap.put(key, cacheObject);
        }
    }

    /**
     * 获取cache
     *
     * @param key
     * @return
     */
    public static CacheObject getData(String key) {
        CacheObject cacheObject = cacheMap.get(key);
        if (cacheObject != null) {
            /**
             * 判断缓存是否过期
             */
            if (cacheObject.isValid()) {
                return cacheObject;
            } else {
                removeInvalidData(key);
            }
        }
        return null;
    }

    /**
     * 移除过期的key
     *
     * @param key
     */
    public static void removeInvalidData(String key) {
        if (cacheMap.containsKey(key)) {
            cacheMap.remove(key);
        }
    }
}

此类主要用于缓存,把请求到的数据,以 Url 为唯一标识并作为 key 建立缓存,首先通过 key 获取缓存中是否存在缓存,如果没有,便去请求数据,把得到的结果缓存到容器中,如果之前已经建立过缓存,便直接从容器中读取缓存,减小服务器压力,在并发量大的时候,大大减小服务器压力。此处使用的是 map 缓存,采用 map ,主要原因是键值对可以更高效的为我们服务,key–>value。

addData方法,顾名思义,添加缓存,看下源码,并不是无脑的添加,还是先做判断是否有缓存,上述已经提到,如果没有缓存便会添加到容器中,如果有,便会判断缓存时间类型是否有改变,如果有没有改变,便不会添加到缓存中,如果有改变,便会先移除老的数据,把新数据加入进去。

项目已上传,戳此进入github。

4
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

使用缓存优化数据请求

继上一篇场景之后,事情还没有完。 我有一堆struct obj对象(数量级可能为千级), 客户端需要频繁拉取这些信息中的一部分去显示(比如,当切换标签页时)。 由于这一操作可能会很频繁...
  • findstr
  • findstr
  • 2017-04-18 13:13
  • 260

大数据之(二)——缓存优化管理

上一篇博客笔者介绍了在具体项目中,使用创建数据对应字典表的方式实现利用缓存存取数据库部分数据,从而达到减少服务器负担,提高客户端响应速度,同时在数据库异常崩溃的情况之下,程序仍能继续运行。      ...
  • Daybreak1209
  • Daybreak1209
  • 2015-05-15 17:19
  • 864

Android通过请求网络数据实现ListView,ListView的优化、图片的缓存、子控件的点击事件。

对Android初学者来说为ListView自定义Adapter和实现item点击是一个比较生疏的内容,而且理解起来也不是太容易,尤其是涉及到ListView的优化问题的时候。本篇内容会简单的介绍下如...
  • qq_20521573
  • qq_20521573
  • 2016-07-24 16:58
  • 1341

HTTP请求中浏览器的缓存机制

在HttpServlet类中定义了一个getLastModified方法,其完整语法定义如下:  protected long getLastModified(HttpServletRequest ...
  • u014082714
  • u014082714
  • 2015-12-02 10:29
  • 3698

安卓网络数据缓存策略

前言对于大部分 App 来说,网络请求都是必不可少的,而且不少App是以数据为主。如果不做数据缓存,在网络慢的情况下,会降低用户体验度。仿佛有一段时间没写博客了,吓得我都祭出了神图。 Json/Xm...
  • qq_35064774
  • qq_35064774
  • 2016-12-04 00:43
  • 2542

教你写Android网络框架之请求配置与Response缓存

在教你写Android网络框架的前三篇文章中,我们从基本结构到代码实现,剖析了一个简单的网络框架应该是怎样运作的,以及在面对各式各样的需求时应该如何对代码做出处理,在深入了解网络框架的同时学习到一些简...
  • bboyfeiyu
  • bboyfeiyu
  • 2015-01-27 14:21
  • 6431

Android Http缓存数据处理

来北京一个多月了~ 本周做组里技术分享时,被提问到一个问题: Retrofit里自带网络线程调度(okHttp),适配RxJava后,内部是同步还是异步的?异步的话,就多了一层线程的包装了? 听...
  • wangkai0681080
  • wangkai0681080
  • 2016-06-04 16:56
  • 1500

iOS开发网络篇—数据缓存

m http://www.cnblogs.com/wendingding/p/3950198.html 一、关于同一个URL的多次请求   有时候,对同一个URL请求多次,返回的数据可能...
  • m372897500
  • m372897500
  • 2015-08-27 11:35
  • 551

AJAX性能优化方法

AJAX性能优化方法   Asp.net AJAX提高性能的原则(对web同样也适用): 合并(Composite)-减少请求的次数 压缩(Compression)-减少请求的数据 缓存(...
  • u010403387
  • u010403387
  • 2015-07-27 17:06
  • 2865

Android开发之ListView 优化之缓存优化

通过平时对ListView的使用,目前我把ListView的优化分为以下几个方面: 1.缓存优化 2.数据优化 3.其他方面优化 0.未优化简单代码 public class MainActivi...
  • u013278940
  • u013278940
  • 2016-10-25 16:51
  • 709
    个人资料
    • 访问:251534次
    • 积分:2878
    • 等级:
    • 排名:第14248名
    • 原创:44篇
    • 转载:0篇
    • 译文:0篇
    • 评论:321条
    QQ交流群

    Android路上

    611566797
    博客专栏
    我的公众号