PreloadDataCache支持预取的数据缓存,使用简单,支持多种缓存算法,支持不同网络类型,扩展性强

主要特性:(1).使用简单 (2).可自动预取新数据 (3).可选择多种缓存算法(包括FIFO、LIFO、LRU、MRU、LFU、MFU等15种)或自定义缓存算法 (4).省流量性能佳(有且仅有一个线程获取数据) (5).支持不同类型网络处理 (6)缓存可序列化到本地 缓存可从文件中恢复 (7).扩展性强 (8). 包含map的大多数接口

适用:Java和Android开发中获取数据较耗时的应用,如网络通讯、响应慢数据获取,在类似网易新闻、花瓣这类应用中可以起到很好的效果。对于图片缓存可直接使用ImageCache

1、使用

引入TrineaAndroidCommon@Github(欢迎star和fork^_^)作为你项目的library(如何拉取代码及添加公共库),或是自己抽取其中的PreloadDataCache@Github部分使用。

测试场景:获取每个数据需用时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表示会被先删除

Java


1

2

3

4

5

6

7

8

9


public class RemoveTypePriorityHigh<T> implements CacheFullRemoveType<T> {

private static final long serialVersionUID = 1L;

@Override

public int compare(CacheObject<T> obj1, CacheObject<T> obj2) {

return (obj2.getPriority() > obj1.getPriority()) ? 1 : ((obj2.getPriority() == obj1.getPriority()) ? 0 : -1);

}

}

(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满时删除元素类型

时间: 2025-01-31 05:48:19

PreloadDataCache支持预取的数据缓存,使用简单,支持多种缓存算法,支持不同网络类型,扩展性强的相关文章

E-MapReduce的Presto组件默认支持访问oss数据

阿里云E-MapReduce从EMR-2.1.0版本镜像开始,Presto组件默认就支持访问oss数据了,不再需要引导操作额外支持. 如何使用 创建集群,版本选择EMR-2.1.0,软件勾选Presto,等待创建成功. 验证 hive创建oss数据表 下文举了创建数据在oss上的uservisits表的例子,请将表名,字段,oss信息替换为您oss数据对应的信息hive 进入hive cli vpc网络可以使用MetaService不需要指定ak等信息: CREATE EXTERNAL TABL

KDnuggets调查|数据科学家最常用的10种算法

最新的KDnuggets调查统计了数据科学家们实际工作中最常使用的算法,在大多数学术和产业界,都有惊人发现哦! 根据Gregory Piatetsky, KDnuggets,最新的调查问题是:在最近的12个月中,你在实际数据科学相关应用中用到了那些模型/算法? 于是就有了以下基于844份答卷的结果. ◆ ◆ ◆ 排名前十的算法和它们在投票者中所占比例 图1:数据科学家最常用的10大算法,所有算法见文末表格   每个受访者平均用到了8.1种算法,这相比于 2011 的相似调查显示的结果有了巨大的增

数据科学家最常用的10种算法

最新的KDnuggets调查统计了数据科学家们实际工作中最常使用的算法,在大多数学术和产业界,都有惊人发现哦! 根据Gregory Piatetsky, KDnuggets,最新的调查问题是:在最近的12个月中,你在实际数据科学相关应用中用到了那些模型/算法? 于是就有了以下基于844份答卷的结果. ◆ ◆ ◆ 排名前十的算法和它们在投票者中所占比例 图1:数据科学家最常用的10大算法,所有算法见文末表格 每个受访者平均用到了8.1种算法,这相比于 2011 的相似调查显示的结果有了巨大的增长.

Memcached分布式内存对象缓存系统简单的使用过程分析

风信网(ithov.com)原创文章:Memcached是一套分布式内存对象缓存系统,用于在动态系统中减少数据库负载,进而提升系统性能.Memcached在很多时候都作为数据库的前端cache使用,因为它比数据库少了很多SQL解析.磁盘操作等开销,而且使用内存来管理数据,所以它可以提供比直接读取数据库更好的性能.另外,Memcached也经常作为服务器之间数据共享的存储媒介.学习完本章,相信读者能够对Memcached有一个全面的了解,使构建一套属于自己的分布式内存对象缓存系统变成很简单的事情.

如何在Java程序中访问mysql数据库中的数据并进行简单的操作_Mysql

在上篇文章给大家介绍了Myeclipse连接mysql数据库的方法,通过本文给大家介绍如何在Java程序中访问mysql数据库中的数据并进行简单的操作,具体详情请看下文. 创建一个javaProject,并输入如下java代码: package link; import java.sql.*; /** * 使用JDBC连接数据库MySQL的过程 * DataBase:fuck, table:person: * 使用myeclipse对mysql数据库进行增删改查的基本操作. */ public

python中json格式数据输出的简单实现方法_python

主要使用json模块,直接导入import json即可. 小例子如下: #coding=UTF-8 import json info={} info["code"]=1 info["id"]=1900 info["name"]='张三' info["sex"]='男' list=[info,info,info] data={} data["code"]=1 data["id"]=190

js方法数据验证的简单实例_javascript技巧

实例如下: //input标签只能正数字 <input onkeyup="this.value=this.value.replace(/[^1-9]/g,'')" > //只能输入正整数 function CheckNum(thisobj) { if (thisobj.value == "0") { } else { var firstNum = thisobj.value.toString().substring(0, 1); if (thisobj.

让数据生活更简单:百度云

在这个日新月异的互联网时代,移动.办公.娱乐设备呈现多样化的趋势,一个人可以同时拥有手机.笔记本.平板电脑等设备,在某种程度上提高了人们的办事和生活效率,不过当中却有一个越来越值得人们重视的问题,那就是如何让各个设备之间的数据保持高度一致,彻底摆脱繁琐的数据转移工作.在数据互通方面,不得不说国内知名的互联网服务商--百度,走在了这一领域的前端,旗下推出一款云服务应用<百度云>,凭借其良好的服务质量和体验效果赢得了众多用户的青睐,数据备份.移动和共享都能够轻松实现.近些年来,从电视,到互联网,再

用集群脚本功能让2.0.0及之前版本的包月集群presto支持读取oss数据

参照 集群脚本功能介绍,本文介绍如何用集群脚本功能让2.0.0及之前版本的包月集群presto支持读取oss数据. 准备脚本 下载 脚本,放在您的oss合适的目录里. 运行脚本 集群列表页面点击对应集群的查看详情按钮 左侧菜单单击集群脚本,进入该集群的集群脚本执行界面 单击右上角创建并执行,进入创建界面. 选择刚才的脚本,设置名字,执行的节点默认,点击执行,完成添加并执行操作. 集群脚本列表可以看到新创建的集群脚本,点击刷新可以更新集群脚本的状态. 等待集群脚本完成 验证 hive建表 下文举了