最新内容建议直接访问原文:PreloadDataCache支持预取的数据缓存,示例APK地址:TrineaAndroidDemo
本文主要介绍一个支持自动向前或向后获取新数据的缓存的使用及功能。Android图片内存缓存可见ImageCache。
主要特性:(1).使用简单 (2).可自动预取新数据 (3).可选择多种缓存算法(包括FIFO、LIFO、LRU、MRU、LFU、MFU等15种)或自定义缓存算法 (4).省流量性能佳(有且仅有一个线程获取数据) (5).支持不同类型网络处理 (6)缓存可序列化到本地 缓存可从文件中恢复 (7).扩展性强 (8). 包含map的大多数接口
适用:Java和Android开发中获取数据较耗时的应用,如网络通讯、响应慢数据获取,在类似网易新闻、花瓣这类应用中可以起到很好的效果。对于图片缓存可直接使用ImageCache。
1、使用
引入TrineaAndroidCommon@Github作为你项目的library,或是自己抽取其中的PreloadDataCache@Git部分使用。
测试场景:获取每个数据需用时2秒,10次获取的场景效果对比,缓存前用时(ms):20004,缓存后用时(ms):4026。缓存命中率为80%。实例代码如下:
从上面的代码中缓存定义部分可以看出,只需要定义PreloadDataCache,并设置获取数据的接口setOnGetDataListener,以后使用get获取数据即可。
2、功能介绍
(1) 初始化缓存
可以使用以下四种方式之一初始化缓存
PreloadDataCache()
PreloadDataCache(int)
PreloadDataCache(int, int)
loadCache(String) 从文件中恢复缓存
支持缓存大小和获取数据线程池大小的设置,默认缓存大小为SimpleCache#DEFAULT_MAX_SIZE,默认线程池大小根据系统Cpu个数设置。
(2)、设置数据获取方式
public void setOnGetDataListener(OnGetDataListener<K, V> onGetDataListener)
设置数据获取的方式。缓存通过该接口获取数据及预取数据。
(3) 获取及预取数据
public CacheObject<V> get(K key, List<K> keyList) get某个key(同步),并且会根据key在keyList中的顺序自动向前或向后获取新数据进行缓存
public CacheObject<V> get(K key) get某个key(同步),但不会自动获取新数据进行缓存
public void setForwardCacheNumber(int forwardCacheNumber) 向前预取数据个数设置,默认为PreloadDataCache#DEFAULT_FORWARD_CACHE_NUMBER
public void setBackwardCacheNumber(int backwardCacheNumber)向后预取数据个数设置默认,默认为PreloadDataCache#DEFAULT_BACKWARD_CACHE_NUMBER
(4)、设置缓存算法
public void setCacheFullRemoveType(CacheFullRemoveType<V> cacheFullRemoveType)
设置缓存算法,缓存算法即为缓存满时为了插入新数据,删除旧数据的规则。
目前包括FIFO、LIFO、LRU、MRU、LFU、MFU、优先级低先删除、优先级高先删除、数据小先删除、数据大先删除、图片小先删除、图片大先删除、文件小的先删除、文件大的先删除、永不删除。还可以通过实现CacheFullRemoveType来自定义缓存算法。。默认为RemoveTypeEnterTimeFirst,即先进先出。下面为详细介绍
RemoveTypeEnterTimeFirst FIFO先进先出,先进入先删除
RemoveTypeEnterTimeLast LIFO后进先出,后进入先删除
RemoveTypeLastUsedTimeFirst LRU(Least Recently User),最先使用先删除
RemoveTypeLastUsedTimeLast MRU(Most Recently Used),最近使用先删除
RemoveTypeUsedCountSmall LFU(Least Frequently Used),使用频率低先删除
RemoveTypeUsedCountBig MRU(Most Frequently Used),使用频率高先删除
RemoveTypePriorityLow 优先级低先删除
RemoveTypePriorityHigh 优先级低先删除
RemoveTypeDrawableSmall 图片小的先删除
RemoveTypeDrawableLarge 图片大的先删除
RemoveTypeFileSmall 文件小的先删除
RemoveTypeFileLarge 文件大的先删除
RemoveTypeDataBig 数据大先删除,根据缓存数据的compareTo函数决定
RemoveTypeDataSmall 数据小先删除,根据缓存数据的compareTo函数决定
RemoveTypeNotRemove 不删除,缓存满时不再允许插入新数据
自定义缓存算法只需要实现CacheFullRemoveType的compare方法即可。比较结果小于0表示会被先删除
(5)、优化数据读取
a. 设置数据读取http超时
public void setHttpReadTimeOut(int httpReadTimeOut)
若httpReadTimeOut小于0表示不设置超时,默认不设置,单位为毫秒
b. 设置无网络不读取
public void setContext(Context context)
设置context,网络连接失败不会新建线程请求数据。
c. 支持不同网络类型的处理
public void setAllowedNetworkTypes(int allowedNetworkTypes)
设置允许的网络类型,可选择PreloadDataCache#NETWORK_MOBILE、PreloadDataCache#NETWORK_WIFI或两者都允许。默认两者都允许。
注意:这个接口生效必须先setContext(Context context)
(6)、缓存元素有效时间
public void setValidTime(long validTime)
设置缓存元素有效时间,小于0表示不会失效,此时仅根据CacheFullRemoveType在缓存满时替换元素
通过protected boolean isExpired(K key)判断某key是否过期
(7)、缓存命中率
getHitRate()、getHitCount()、getMissCount()分别表示缓存命中率、命中次数、未命中次数
(8) 序列化
序列化需要缓存数据类型支持Serializable,关于序列化可参考Java Serializable的理解和总结
使用loadCache(String)从文件中恢复缓存
saveCache(String, SimpleCache)保存缓存到文件
(9)、其他与map类似接口
public boolean containsKey(K key) 缓存中是否包含该key
public CacheObject<V> remove(K key) 从缓存中删除某个key
public void clear() 清空缓存
public Set<K> keySet() 缓存中key集合
public Set<Map.Entry<K, CacheObject<V>>> entrySet() 缓存中key,value键值对集合
public Collection<CacheObject<V>> values() 缓存中元素集合
public CacheObject<V> put(K key, V value) 手动插入某个元素
public CacheObject<V> put(K key, CacheObject<V> value) 手动插入某个元素
public CacheObject<V> get(K key) 得到某个key
public int getSize() 得到缓存中有效元素个数
public int getMaxSize() 得到缓存中元素最大个数
(10)得到设置
上面的set几乎都可以通过对应的get得到相应value
使用getOnGetDataListener()得到获取数据的方法
getForwardCacheNumber()得到自动向前缓存的个数
getBackCacheNumber()得到自动向后缓存的个数
getMaxSize()得到缓存最大容量
getValidTime()得到有效时间,以毫秒计
getCacheFullRemoveType()得到cache满时删除元素类型
你可能还感兴趣:
Android ImageCache图片缓存,使用简单,支持预取,支持多种缓存算法,支持不同网络类型,扩展性强
相关推荐
针对专题型应用中普遍存在的大数据查询的频繁性和模式固定性特点,提出一种基于模板的数据预取和缓存算法,用于加快数据查询响应速度并减轻服务器端负载压力。通过构建数据查询模板,在触发器被激发时调用模板以构建...
摘要I1. 绪论 11.1课题背景及意义 11.2CPU 高速缓存 11.2.1 结构和参数 11.2.2 性能指标 11.2.3 替换算法 21.31.3.1
此外,通过指令高速缓存和数据高速缓存的故障行为,开发了一种预取策略,该策略与故障转移队列状态的数据捕获相结合。 最后,该方法可以保持指令和数据访问的顺序,从而有利于端到端数据处理中预取的提取。
通过利用WWW访问的空间局部性,Web预取使缓存机制从时间局部性向空间局部性扩展.归纳了Web预取技术的分类,概括和比较了不同类别的优势和局限性,给出了预取模型的基本框架及每部分的主要功能,并对各种评价标准进行了...
针对命名数据网络(named data networking,NDN)移动性增强支持不足的问题,基于城区移动场景提出了一种基于移动预测的内容预取方法(mobility-aware prediction approach for content prefetching,MAP-CP)及扩展...
支持预取数据到缓存, 内置自适应智能缓存调度算法, 支持三种缓存策略:读写缓存、仅读缓存和仅写缓存, 支持性能数据监视和统计, 支持同时缓存多个硬盘和多个分区, 支持缓存采用自定义文件系统的分区, 支持缓存...
PIC32系列参考手册 第4章 预取高速缓存,官方资源
基于数据预取的多核处理器末级缓存优化方法.pdf
基于缓存窗口和段补丁预取的流媒体动态调度算法,杨戈,朱晓民,该文提出了一种新的基于缓存窗口和段补丁预取的移动流媒体动态调度算法,采用代理缓存窗口自适应伸缩和分段缓存补丁块方案,实现
网络技术-网络基础
Hadoop原有的作业调度算法在任务级调度阶段均采用简单考虑数据本地性的任务分配策略,并不能保证良好的数据本地性,而相应的改进算法改进目标不一,也不完全适用于所有作业调度场合。针对以上问题,结合数据预取理念...
预执行帮助线程在预取过程中需要进行动态预取调节,而传统静态枚举控制参数值的控制方法在预取执行过程中保持固定不变,从而使得该方法不能够有效地为主线程提供预取质量保证(quality of service,QoS)。...
基于Monte Carlo熵权决策的云计算数据预取算法.pdf
8. 性能卓越、规模化扩展性强,每秒处理请求26万以上。 9. 可管理大量的并发连接。 10. 基于用户代理(user agent)的重定向。 11. 可自由配置的即时压缩。 12. 集群支持--运行一个中央管理、具有热备功能的aiCache...
基于神经网络算法的三维模型预取系统.pdf
软件数据预取是一种有效的隐藏存储延迟的技术,通过预取使数据在实际使用之前从硬盘读到缓存中,提高了缓存(cache)的命中率,降低了读取数据的时间。通过设置两个缓冲区来轮流存放本次和下一次读入的数据块,实现访存...
基于这些模板和参数,提出了两种智能预取算法以适应两类不同的数据查询需求。第一个算法基于蚁群规则,该算法能够用于预测将来具有最高可能性的查询。经过监控某个特定应用对于数据库所发生的大量查询,实际的模板数...
研究了代理服务器在流媒体传输和缓存方面对于网络带宽的消耗以及在缓存过程中内存分配和管理等方面存在的问题;在分析了现有的流媒体代理缓存技术的基础上,提出了基于代理服务器的流媒体动态共享缓存(DSB)算法。...
Linux 内核中的预取算法 论文 中科大 吴峰光博士的论文
移动环境下查询位置相关数据(LDD)时因网络的断接性、低带宽和用户的移动性而导致查询结果过时失效,而数据预取能够显著提高数据的访问速度,缩短查询的响应时间。基于LDD 的预取策略如DDP、DHP等考虑了数据的空间位置...