JVM缓存encache
在JVM缓存中有一个经常使用的缓存框架,就是encache
,所以这里对encache进行一些介绍,本文是基于版本3.8来介绍一些新特性。encache
主要由三个组件组成CacheManager
、Cache
和CacheConfiguration
。单台cahce层次结构如下:
CacheManager结构
Cache结构
CacheConfiguration配置结构
encache的分层结构
在正式使用encache
的时候,我们先来了解一下其缓存策略,也就是其缓存的值究竟是存在哪里的,这有助于我们理解encache
。其有三种缓存策略分别是堆内缓存、堆外缓存、磁盘缓存,分别对应的分层结构配置是heap
、offheap
、disk
。
如何使用?
引入依赖:
<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()
就会将缓存自动刷新到磁盘,启动时会将磁盘中的数据进行加载。