天天看點

PreloadDataCache支援預取的資料緩存,使用簡單,支援多種緩存算法,支援不同網絡類型,擴充性強

主要特性:(1).使用簡單 (2).可自動預取新資料 (3).可選擇多種緩存算法(包括fifo、lifo、lru、mru、lfu、mfu等15種)或自定義緩存算法 (4).省流量性能佳(有且僅有一個線程擷取資料) (5).支援不同類型網絡處理 (6)緩存可序列化到本地 緩存可從檔案中恢複 (7).擴充性強 (8). 包含map的大多數接口

1、使用

測試場景:擷取每個資料需用時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) 序列化

使用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滿時删除元素類型