您好,登錄后才能下訂單哦!
1堆內
直接在JVM堆中存儲JAVA對象,優點是速度快;缺點是會增加GC的頻次和GC時間。
2堆外
在堆外內存中存儲序列化的JAVA對象,優點是不會增加GC;缺點是存取速度較慢,需要額外的時間處理序列化和反序列化。
3 磁盤
緩存數據到磁盤,優點是掉電不會丟失數據,可用空間更大;缺點是存取速度比堆外慢很多。
4三種結構一起使用,結構如上圖。
5時序圖
在Ehcache的多層緩存結構中,最底層被稱為Authoritative Tier,其余的緩存層被稱為Caching Tier。Authoritative Tier層數據是最全的,其余層的數據都是該層的數據子集,只是臨時存儲數據。
比如,堆內+堆外模式中,堆外為Authoritative Tier。堆內+堆外+磁盤模式中,磁盤為Authoritative Tier。
6 序列化
堆外和磁盤存儲時,必須先將對象序列化為java.nio.ByteBuffer,Ehcache允許用戶按下面的代碼傳入自定義的序列化類。
7 轉一個demo
import java.io.File;
import org.ehcache.Cache;
import org.ehcache.PersistentCacheManager;
import org.ehcache.UserManagedCache;
import org.ehcache.config.builders.CacheConfigurationBuilder;
import org.ehcache.config.builders.CacheManagerBuilder;
import org.ehcache.config.builders.ResourcePoolsBuilder;
import org.ehcache.config.builders.UserManagedCacheBuilder;
import org.ehcache.config.units.EntryUnit;
import org.ehcache.config.units.MemoryUnit;
public class Main {
public static void main(String[] args) {
PersistentCacheManager persistentCacheManager = CacheManagerBuilder.newCacheManagerBuilder()
.with(CacheManagerBuilder.persistence(getStoragePath() + File.separator + "myData"))
.withCache("threeTieredCache",
CacheConfigurationBuilder.newCacheConfigurationBuilder(Integer.class, String.class,
ResourcePoolsBuilder.newResourcePoolsBuilder()
.heap(10, EntryUnit.ENTRIES) //堆
.offheap(1, MemoryUnit.MB) //堆外
.disk(20, MemoryUnit.GB) //磁盤
)
).build(true);
Cache<Integer, String> threeTieredCache = persistentCacheManager.getCache("threeTieredCache", Integer.class, String.class);
//讀
for (int i=0;i<=20000;i++){
threeTieredCache.put(i, "$"+i);
}
//寫
for (int i=0;i<=200000;i++){
String value = threeTieredCache.get(i);
System.out.println("get at "+i+":"+value);
}
persistentCacheManager.close();
}
private static String getStoragePath() {
// TODO Auto-generated method stub
return "d:";
}
}
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。