最新内容建议直接访问原文: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图片缓存,使用简单,支持预取,支持多种缓存算法,支持不同网络类型,扩展性强
相关推荐
- 支持多种数据类型,包括字符串、数字和对象。 5. **基于对象的文件缓存**: - 以文件或对象格式缓存数据,提供更高灵活性。 - 适用于存储非结构化或半结构化数据,如图像、视频或日志文件。 - 支持流式读写,...
- 针对不同的数据类型,如空间数据、时间序列数据、多媒体数据及文本数据,数据挖掘技术会有所不同,应用在元数据预取上也会有所区分。 4. 组预取策略 - 组预取通过预测访问模式,将一组元数据作为一个单元进行...
《基于深度学习的数据预取质量优化算法设计与实现》这篇毕业论文主要探讨了如何利用深度学习来提升数据预取的质量,以减少存储访问延迟带来的性能损失。数据预取是一种技术,它通过预测并提前加载处理器即将需要的...
- **技术背景**:传统的Web缓存技术主要依赖于时间局部性(即用户近期访问过的页面在将来一段时间内可能会再次被访问),而Web预取技术则进一步扩展到了空间局部性,即用户访问某一网页时可能还会访问与其相关的其他...
(4)预取和写后策略:预测未来可能需要的数据并预先加载到缓存,同时处理写操作时要考虑如何同步更新各级缓存,确保数据一致性。 (5)自适应性:系统能根据当前负载、网络状况和数据分布自动调整缓存大小、缓存...
例如,可以使用监督学习算法,如决策树、随机森林或支持向量机,通过历史访问记录作为训练数据,学习文件访问的特征和模式。非监督学习方法,如聚类和关联规则挖掘,也可以帮助发现文件访问的隐藏关联。深度学习模型...
- **粒度与方法**: 根据具体的数据类型、访问模式以及性能要求来确定分片的大小和策略。 - **分片策略**: 包括范围分片、哈希分片及复合分片等,旨在优化数据分布和负载均衡。 **数据复制** - **目的**: 提升数据...
异构性指的是物联网设备种类繁多,产生的数据格式各异,需要能够兼容多种数据类型和结构的存储系统;实时性强调数据的即时处理能力;动态性则体现在物联网环境的快速变化和更新。 针对这些特点,本文可能涵盖了以下...
此外,该框架还具备自我调节与控制的能力,可以根据实际运行情况进行调整,具有良好的可扩展性。 ##### 系统组成结构 ABWC框架主要包括以下六个核心组件: 1. **切点拦截器(PointInterceptor)**:负责拦截前端...
- **分片策略**:Memcached支持多服务器分片,可使用一致性哈希算法确保数据均匀分布。 - **过期时间设置**:通过`set()`方法的第三个参数设置缓存的生命周期,避免无限期存储。 - **预取机制**:通过`getMulti()...
2. **硬件预取器**:现代处理器包含多个专门针对不同存储层次的硬件预取器,每个都有独立的预取算法。然而,预取器的正确组合对性能影响显著,不恰当的预取可能导致性能下降或缓存冲突。 3. **机器学习预取策略**:...
在当今的IT行业,分布式存储技术因其高性价比和良好的可扩展性而得到广泛应用。分布式缓存技术作为分布式存储技术的一个重要组成部分,对于提升系统整体性能起着至关重要的作用。张胜利和陈莉君的研究提出了一种新的...
- **模型选择**:对象存储系统通常支持多种数据一致性模型,如强一致性、最终一致性等。 - **影响分析**:不同的数据一致性模型会对性能和数据完整性产生不同程度的影响。例如,强一致性模型虽然能够保障数据的...
- **预取和淘汰算法**:例如LRU算法,用于预测和管理缓存中数据的使用频率,提高命中率。 **3.2 基于存储的缓存** - **存储利用**:利用持久性存储(如SSD或HDD)作为缓存媒介,提供更大容量且低成本的数据存储。 -...
此外,随着网络流量的持续增长,路由器缓存容量的问题也不仅仅是技术挑战,它还涉及到路由器设计的可扩展性问题。在未来的全光路由器设计中,光缓存问题的解决将显得尤为重要。研究者们需要开发出新的缓存管理技术,...
#### 二、元数据类型及组织方式 元数据可以根据其描述的对象和功能分为多种类型,并采用不同的组织方式来优化其管理和使用。 ##### 文件组织元数据 - **描述**: 包含文件在存储系统中的物理位置信息,如文件块分配...
Ceph是一个广泛使用的开源分布式文件系统,它以其高可用性、可扩展性和数据安全性著称。在大数据存储场景中,读操作占据了重要地位,而且通常比写操作对延迟更敏感,因此优化读操作的性能对于提升整体系统效率至关...
- **可扩展性**:能够应对不断增加的用户量和数据量。 - **一致性**:确保客户端获取的数据是最新的。 - **容错性**:当部分缓存失效时,系统仍然可以正常运行。 - **智能性**:能够根据用户行为自动调整缓存...
实验使用Python语言实现了Tomasulo算法。主要分为以下几个部分: 1. Mem类:代表内存,包含初始化内存、设置和获取内存值的函数。内存被初始化为零值数组,可通过set和get函数对单个位置的值进行操作,或者通过set...