转载

巧记java本地缓存encache

在JVM缓存中有一个经常使用的缓存框架,就是 encache ,所以这里对encache进行一些介绍,本文是基于版本3.8来介绍一些新特性。 encache 主要由三个组件组成 CacheManagerCacheCacheConfiguration 。单台cahce层次结构如下:

巧记java本地缓存encache

CacheManager结构

巧记java本地缓存encache

Cache结构

巧记java本地缓存encache

CacheConfiguration配置结构

巧记java本地缓存encache

encache的分层结构

在正式使用 encache 的时候,我们先来了解一下其缓存策略,也就是其缓存的值究竟是存在哪里的,这有助于我们理解 encache 。其有三种缓存策略分别是堆内缓存、堆外缓存、磁盘缓存,分别对应的分层结构配置是 heapoffheapdisk

如何使用?

引入依赖:

<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,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,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,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, String.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() 就会将缓存自动刷新到磁盘,启动时会将磁盘中的数据进行加载。

原文  https://juejin.im/post/5da1a2ca6fb9a04df00edf25
正文到此结束
Loading...