1. 程式人生 > 程式設計 >巧記java本地快取encache

巧記java本地快取encache

JVM快取encache

在JVM快取中有一個經常使用的快取框架,就是encache,所以這裡對encache進行一些介紹,本文是基於版本3.8來介紹一些新特性。encache主要由三個元件組成CacheManagerCacheCacheConfiguration。單臺cahce層次結構如下:

image

CacheManager結構

image

Cache結構

image

CacheConfiguration配置結構

image

encache的分層結構

在正式使用encache的時候,我們先來瞭解一下其快取策略,也就是其快取的值究竟是存在哪裡的,這有助於我們理解encache。其有三種快取策略分別是堆內快取、堆外快取、磁碟快取,分別對應的分層結構配置是heap

offheapdisk

如何使用?

引入依賴:

<dependency>
    <groupId>org.ehcache</groupId>
    <artifactId>ehcache</artifactId>
    <version>3.8.0</version>
</dependency>
複製程式碼

如果使用到叢集:

<dependency>
     <groupId>org.ehcache</groupId>
     <artifactId>ehcache-clustered</artifactId>
     <version>3.8.0</version>
</dependency>
複製程式碼

用java程式碼配置

我們可以使用java程式碼來獲取Cache例項。

CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder()//宣告一個cacheBuilder
            .withCache("myCache",CacheConfigurationBuilder
                        .newCacheConfigurationBuilder(String.class,String.class,ResourcePoolsBuilder.heap(20)))//宣告一個容量為20的堆內快取
.build(true); Cache<String,String> myCache = cacheManager.getCache("myCache",String.class);//獲取這個cache myCache.put("key1","v1");//使用 System.out.println(myCache.get("key1")); //移除 cacheManager.removeCache("myCache"); cacheManager.close(); 複製程式碼

用xml配置

使用一個xml來配置一個CacheManager,xml配置見cache.xml。構造程式碼如下:

 //獲取配置資源
        URL configUrl =  new XmlGetStarted().getClass().getResource("/cache.xml");
        //從xmlConfig構造一個CacheManger並且初始化
        Configuration xmlConfig = new XmlConfiguration(configUrl);
        CacheManager cacheManager = CacheManagerBuilder.newCacheManager(xmlConfig);
        cacheManager.init();
        Cache<String,String> cache = cacheManager.getCache("c1",String.class);
        cache.put("K","V");
        System.out.println(cache.get("K"));
複製程式碼

建立一個支援叢集的CacheManager

Encache可以藉助terracotta支援叢集。以下是支援叢集的程式碼:

CacheManagerBuilder<PersistentCacheManager> clusteredCacheManagerBuilder =
                CacheManagerBuilder.newCacheManagerBuilder()
                        .with(ClusteringServiceConfigurationBuilder.cluster(URI.create("terracotta://localhost/my-application"))
                                .autoCreate(c -> c));
        PersistentCacheManager cacheManager = clusteredCacheManagerBuilder.build(true);
        cacheManager.close();
複製程式碼

資料更新

在配置CacheConfiguration時,我們可以配置快取的Expiry,也就是過期策略,具體配置程式碼如下:

CacheConfigurationBuilder
                .newCacheConfigurationBuilder(String.class,ResourcePoolsBuilder.heap(20))
                .withExpiry(ExpiryPolicyBuilder.timeToIdleExpiration(Duration.ofHours(20)));
複製程式碼

encache過期策略有三種,分別是:
timeToLiveExpiration:從建立cache entry開始計算,一段時間後過期
timeToIdleExpiration : 從最後一次訪問cache entry開始計算,只有heap裡的cache entry生效
noExpiration : 永不過期

將快取資料序列化到磁碟

可以使用encache分層結構的disk來序列化資料。

long begin = System.currentTimeMillis();
        PersistentCacheManager persistentCacheManager = CacheManagerBuilder.newCacheManagerBuilder()
                .with(CacheManagerBuilder.persistence(new File(getStoragePath(),"myData")))//序列化到磁碟的路徑
                .withCache("persistent-cache",CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class,ResourcePoolsBuilder.newResourcePoolsBuilder()
                                .disk(500,MemoryUnit.MB,true)
                        )//宣告單個cache的配置
                )
                .build(true);

        Cache<Long,String> cache = persistentCacheManager.getCache("persistent-cache",Long.class,String.class);
        for (int i=0;i<SIZE;i++){
            cache.put(Long.valueOf(i),String.valueOf(i));
            System.out.println(cache.get(Long.valueOf(i)));
        }
        System.out.println("cost time:"+(System.currentTimeMillis()-begin));
        persistentCacheManager.close();
複製程式碼

這樣,在persistentCacheManager.close()就會將快取自動重新整理到磁碟,啟動時會將磁碟中的資料進行載入。