`
hylxinlang
  • 浏览: 129108 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

PreloadDataCache数据缓存使用

 
阅读更多

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

本文主要介绍一个支持自动向前或向后获取新数据的缓存的使用及功能。Android图片内存缓存可见ImageCache

 

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

 

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

 

1、使用

引入TrineaAndroidCommon@GithubTrineaAndroidCommon@GoogleCode作为你项目的library,或是自己抽取其中的PreloadDataCache@GitPreloadDataCache@GoogleCode部分使用。

测试场景:获取每个数据需用时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满时删除元素类型

分享到:
评论

相关推荐

    ASP.NET数据缓存技术

    在这个主题中,我们将深入探讨ASP.NET数据缓存的原理、使用方法以及优化策略。 1. 缓存的基本概念 缓存是一种存储技术,用于暂时存储经常访问的数据,以便快速获取。在ASP.NET中,数据缓存分为两种主要类型:页面...

    JS前端数据缓存,用于富交互的前端数据缓存

    例如,`DataStore.js`可能是一个实现数据缓存的库,它封装了上述的存储方式,提供统一的API供开发者使用。开发者可以使用`DataStore.get()`和`DataStore.set()`等方法来读写数据,而无需关心底层实现。同时,`...

    android数据缓存

    - LRU(Least Recently Used):最近最少使用的缓存策略,当缓存空间满时,删除最近最少使用的数据。 - TTL(Time To Live):数据存活时间,设定数据在缓存中存储的最大时长,过期后自动清理。 3. **缓存实现...

    ASP.NET数据缓存

    为了从缓存中获取数据,我们可以使用`HttpRuntime.Cache.Get`方法: ```vb Dim cachedValue As Object = HttpRuntime.Cache.Get(cacheKey) If cachedValue IsNot Nothing Then ' 使用缓存的数据 End If ``` 除了...

    分页缓存

    本篇文章将深入探讨如何使用Java来实现分页缓存,并介绍在读取过程中如何优先从缓存获取数据。 首先,理解分页的基本概念是必要的。在Web应用中,当用户浏览大量数据时,通常会采用分页的方式来显示,而不是一次性...

    数据缓存技术

    3. 分布式环境:在分布式系统中,可能需要使用分布式缓存来实现跨服务器的数据共享,这需要额外的配置和协调机制。 4. 性能监控:定期检查缓存的命中率和内存使用情况,以便调整缓存策略。 综上所述,数据缓存技术...

    数据缓存framework

    在iOS开发中,正确地使用数据缓存不仅可以提升应用的性能,还可以降低服务器压力,优化用户体验。因此,理解和熟练掌握如"MNTCacheManager.framework"这样的缓存框架,对于提高应用质量至关重要。开发者应当根据具体...

    Android 数据缓存工具类

    6. **过期策略**:除了简单的基于时间的过期,还可以实现基于容量的过期策略,如LRU(Least Recently Used),当缓存达到一定大小后,优先淘汰最近最少使用的数据。 对于JSON数据,我们还需要考虑反序列化和序列化...

    ios 自定义数据缓存

    3. **读取数据**:当需要从缓存中获取数据时,使用SELECT语句查询对应的数据。可以使用`executeQuery:withArgumentsInArray:`方法,然后遍历结果集,将JSON字符串还原为原始对象。 4. **更新和删除数据**:根据需求...

    finereport缓存问题

    数据延迟是指缓存中的数据可能不是最新的数据,而缓存同步是指在服务器集群中,各个服务器之间的缓存需要同步化。 二、模板结果共享缓存 模板结果共享缓存是指 FineReport 报表系统中的一种缓存技术,旨在提高报表...

    .net 框架,数据缓存类

    本文将深入探讨.NET框架中的数据缓存机制,以及`DataCache`类的使用。 数据缓存的目标是减少不必要的数据库交互,从而降低服务器负载,提升响应速度。在.NET框架中,微软提供了多种缓存解决方案,包括ASP.NET缓存、...

    DataTable缓存数据操作

    DataTable 缓存数据操作 DataTable 缓存数据操作是 ADO.NET 中的一种数据存储机制,主要用于缓存和操作数据。 DataTable 是 DataSet 中的组成部分,用于存储数据。 DataSet 是一个内存中的关系数据库,用于存储数据...

    MSSQL 数据缓存到本地示例

    在实际应用中,使用MSSQL的本地数据缓存需要考虑以下几点: 1. **容量规划**:根据本地内存资源和应用需求,合理设置缓存大小。 2. **缓存一致性**:确保本地缓存与服务器数据的一致性,防止数据不一致问题。 3. **...

    js数据缓存插件

    JS对数据做缓存,应用场景,有的时候通过ajax去获取一些不是经常变动数据的时候,不用每次去请求,直接从缓存中去读取 1. 将数据设置到缓存: JsCache.set(key,value,expirs), expirs也可以不设置,默认是60秒 2. ...

    Android缓存——将数据以对象的方式缓存到本地

    在Android开发中,数据缓存是一项重要的技术,它能够提高应用程序的性能和用户体验。当用户访问数据时,如果数据已经被缓存,系统可以快速地从本地读取,避免了网络延迟或频繁数据库查询带来的影响。本示例"Android...

    数据缓存和图片缓存

    1. LRU(Least Recently Used):最近最少使用的替换策略,当缓存满时,优先淘汰最近最久未使用的数据。 2. LFU(Least Frequently Used):使用频率最低的替换策略,淘汰使用频率最低的数据。 3. FIFO(First In ...

    缓存应用程序页面和数据

    在C#中实现数据缓存,可以使用多种框架和库,如Redis或Memcached作为分布式缓存解决方案,它们提供更强大的缓存管理和性能。这些系统通常用于大型、高并发的应用程序,能跨多个服务器共享数据,避免单点性能瓶颈。 ...

    数据缓存的一个工具类

    数据缓存的一个工具类,方便攻城狮对一些基本数据类型进行数据缓存,特别还加了对集合的缓存,更加方便对app数据处理

    C++数据结构与算法之双缓存队列实现方法详解

    双缓存队列的应用场景主要在于需要高效处理数据的场景,例如,在发送端持续向接收端发送数据包的场景中,可以使用双缓存队列来避免数据丢失的问题。同时,双缓存队列也可以应用于其他需要高效处理数据的场景中。 ...

    本地缓存与分布式缓存优缺点,使用

    本地缓存与分布式缓存优缺点、使用场景 缓存是计算机系统中的一种优化技术,通过将频繁访问的数据存储在内存中,以减少对外部存储设备的访问次数,提高系统的响应速度和性能。本文将详细介绍本地缓存与分布式缓存的...

Global site tag (gtag.js) - Google Analytics