redis ---->ehcache 來供程序查..."/>
溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

ehcache的三級(jí)緩存

發(fā)布時(shí)間:2020-07-04 09:01:17 來源:網(wǎng)絡(luò) 閱讀:925 作者:lifeneedyou 欄目:編程語(yǔ)言
開發(fā)架構(gòu)中,經(jīng)常把ehcache+redis兩集緩存來做配合。。通常ehcache+redis+mysql 來作為三層存儲(chǔ)架構(gòu),最后到數(shù)據(jù)庫(kù),然后db----->redis ---->ehcache 來供程序查詢使用。。
而ehcache本身也支持3級(jí)緩存 “堆內(nèi)內(nèi)存、堆外內(nèi)存、磁盤存儲(chǔ)”
作為本地緩存框架, Ehcache支持多層緩存模式,常用的有三種數(shù)據(jù)存儲(chǔ)介質(zhì):

1堆內(nèi)
直接在JVM堆中存儲(chǔ)JAVA對(duì)象,優(yōu)點(diǎn)是速度快;缺點(diǎn)是會(huì)增加GC的頻次和GC時(shí)間。

2堆外
在堆外內(nèi)存中存儲(chǔ)序列化的JAVA對(duì)象,優(yōu)點(diǎn)是不會(huì)增加GC;缺點(diǎn)是存取速度較慢,需要額外的時(shí)間處理序列化和反序列化。

3 磁盤
緩存數(shù)據(jù)到磁盤,優(yōu)點(diǎn)是掉電不會(huì)丟失數(shù)據(jù),可用空間更大;缺點(diǎn)是存取速度比堆外慢很多。

ehcache的三級(jí)緩存

4三種結(jié)構(gòu)一起使用,結(jié)構(gòu)如上圖。

5時(shí)序圖

在Ehcache的多層緩存結(jié)構(gòu)中,最底層被稱為Authoritative Tier,其余的緩存層被稱為Caching Tier。Authoritative Tier層數(shù)據(jù)是最全的,其余層的數(shù)據(jù)都是該層的數(shù)據(jù)子集,只是臨時(shí)存儲(chǔ)數(shù)據(jù)。

比如,堆內(nèi)+堆外模式中,堆外為Authoritative Tier。堆內(nèi)+堆外+磁盤模式中,磁盤為Authoritative Tier。

ehcache的三級(jí)緩存

ehcache的三級(jí)緩存

6 序列化

堆外和磁盤存儲(chǔ)時(shí),必須先將對(duì)象序列化為java.nio.ByteBuffer,Ehcache允許用戶按下面的代碼傳入自定義的序列化類。

7 轉(zhuǎn)一個(gè)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:";
}

}

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI