目录
2.1 使用EhCacheCacheManager —— 仅支持2.x版本
2.2 使用JCacheCacheManager —— 仅支持3.x版本
EhCache是一个以Java实现的开源本地缓存框架,但也支持分布式部署。它符合JSR107标准,具有简单、高性能的特点,官方宣称是为大型高并发系统设计,广泛地与Hibernate、Spring等开源框架结合使用。由于EhCache 3.x分布式部署需要结合Terracotta服务器使用,这里就不再介绍了。
EhCache目前的最新版本是3.7.0(需要Java 8以上版本),文中除非显式说明,否则本文的介绍均基于该版本。
1.基本使用
使用时,需要使用Maven引入ehcache包:
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>3.7.0</version>
</dependency>
EhCache的核心是CacheManager,每个CacheManager可包含多个Cache。因此,EhCache的创建过程就是CacheManager和Cache的配置过程,3.x版本有如下几种配置方式:
1.1 XML配置
首先需要创建一个XML配置文件,这里在resource目录下创建名为config.xml的文件,以下是示例配置:
<?xml version="1.0" encoding="UTF-8"?>
<ehcache:config
xmlns:ehcache="http://www.ehcache.org/v3">
<ehcache:cache alias="myCache">
<ehcache:key-type>java.lang.String</ehcache:key-type>
<ehcache:value-type>java.lang.String</ehcache:value-type>
<ehcache:expiry>
<ehcache:tti unit="minutes">20</ehcache:tti>
</ehcache:expiry>
<ehcache:heap>200</ehcache:heap>
</ehcache:cache>
</ehcache:config>
config标签代表一个CacheManager定义,cache代表一个Cache定义,key-type和value-type分别代表键和值的类型,这里全部是String类型,expiry代表缓存存活时间设置,这里设置了TTI为20分钟,heap代表缓存容量,默认为entries,即存放多少个缓存对象,如果选择B、KB、MB、GB等,就是不限数量,但是限制缓存总大小。
其他的标签及其作用可参见:XML配置
然后读取配置文件,创建缓存管理器和缓存对象:
URL url=getClass().getResource("config.xml");
Configuration conf=new XmlConfiguration(url);
CacheManager cacheManager=CacheManagerBuilder.newCacheManager(conf);
cacheManager.init();
Cache cache=cacheManager.getCache("myCache",String.class,String.class);
cache.put("hello","world");
System.out.println(cache.get("hello"));
cacheManager.close();
该段代码会输出“world”。
因为都是存储键值对,所以Cache的API和Map差不多。CacheManager需要显式关闭,也可以使用try-resource形式,实现自动关闭:
try(CacheManager cacheManager=CacheManagerBuilder.newCacheManager(conf)){
...
}catch(Exception e){
...
}
1.2 硬编码
XML配置虽然容易理解,但也很麻烦,尤其是Cache的键、值类型已经在XML中定义过了,实例化时还要再定义一次,多此一举,完全可以舍弃XML,直接使用硬编码形式配置缓存,下面的配置效果和上面的XML配置完全一致:
CacheConfiguration conf=CacheConfigurationBuilder
.newCacheConfigurationBuilder(String.class,String.class, ResourcePoolsBuilder.heap(200L))
.withExpiry(ExpiryPolicyBuilder.timeToLiveExpiration(Duration.ofMinutes(20L)))
.build();
CacheManager manager=CacheManagerBuilder.newCacheManagerBuilder()
.withCache("myCache",conf)
.build(true);
Cache cache=manager.getCache("myCache",String.class,String.class);
cache.put("hello","world");
System.out.println(cache.get("hello"));
manager.close();
实际上就是把XML配置变成了一个CacheConfiguration对象而已,使用起来还是挺麻烦的
1.3 直接创建Cache
如果是创建大量有共性的缓存,使用前两种方式或许还不错,但是如果创建的缓存不多,或者没什么共同点,那么还不如在创建Cache的时候再指定其特性,可以使用UserManagedCache:
UserManagedCache cache= UserManagedCacheBuilder
.newUserManagedCacheBuilder(String.class,String.class)
.withExpiry(ExpiryPolicyBuilder.timeToLiveExpiration(Duration.ofMinutes(20L)))
.withResourcePools(ResourcePoolsBuilder.heap(200L))
.build(true);
cache.put("hello","world");
System.out.println(cache.get("hello"));
可以看到,这种方式代码量少了不少,看着很简洁。
2.结合Spring使用
缓存一般不会单独使用,而是配合其它框架,EhCache最常见的使用场景就是作为Hibernate等ORM组件的二级缓存,不过和Spring的结合也不少见,Spring Cache就为其提供了支持。