官方文档:Ehcache getting started
maven 依赖
<dependency><groupId>org.ehcache</groupId><artifactId>ehcache</artifactId><version>3.5.2</version>
</dependency>
官方例子说明
import org.ehcache.Cache;
import org.ehcache.CacheManager;
import org.ehcache.config.builders.CacheConfigurationBuilder;
import org.ehcache.config.builders.CacheManagerBuilder;
import org.ehcache.config.builders.ResourcePoolsBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class GettingStartedEhcache {
public static void main(String[] args){/*** 利用CacheManagerBuilder的静态方法(newCacheManagerBuilder())创建一个CacheManagerBuilder实例*/CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder()/*** 利用builder实例的withCache定义一个别名为preConfigured的缓存,缓存存储的数据中,key为Long类型的数据,value为String类型的数据* 这个缓存在CacheManager对象调用init()时创建* withCache()方法会返回一个新的CacheManagerBuilder实例*/.withCache("preConfigured",CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.heap(10)))/*** 利用builder实例创建CacheManager实例*/.build();/*** CacheManager实例只有经过初始化后才能执行获取缓存对象、创建缓存对象*/cacheManager.init();/*** 根据缓存名称、键值对的类型获取缓存管理器中对应的缓存对象*/Cache<Long, String> preCache = cacheManager.getCache("preConfigured", Long.class, String.class);/*** 利用缓存管理器创建名为myCache的新缓存对象*/Cache<Long, String> myCache = cacheManager.createCache("myCache",CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.heap(10)));/*** 在名为myCache的缓存对象中存入键为1值为da one的键值对*/myCache.put(1L, "da one");/*** 在名为myCache的缓存对象中取键为1的value值*/String value = myCache.get(1L);System.out.println(value);/*** 从缓存管理器中移除名为preConfigured的缓存对象*/cacheManager.removeCache("preConfigured");/*** 关闭缓存管理器*/cacheManager.close();}
}
初始化CacheManager
实例对象有两种方式:
第一种就是上面代码中通过CacheManager
实例对象调用init()
cacheManager.init();
第二种就是在CacheManagerBuilder
实例对象调用build()
创建CacheManager
对象时通过布尔类型的参数来控制是否初始化CacheManager
对象
CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder().withCache("preConfigured", CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.heap(10))).build(true);
从源码中我们可以看出当init值为true时,会在新创建的CacheManager
对象上调用init()
public class CacheManagerBuilder<T extends CacheManager> implements Builder<T> {
private final ConfigurationBuilder configBuilder;private final Set<Service> services;public T build(boolean init) {T cacheManager = this.newCacheManager(this.services, this.configBuilder.build());if(init) {cacheManager.init();}return cacheManager;}public T build() {return this.build(false);}
当利用put()
往一个缓存对象(Cache
)中存放键值对时,键与值的类型必须与缓存对象(Cache
)定义时指定的键与值的类型保持一致,在同一个缓存对象中键必须是唯一的
/*** 定义myCache时,其key被指定为Long类型,value被指定为String类型* 所以此处的第一个参数类型为Long,第二个参数类型为String*/
myCache.put(1L, "da one");
当利用get()
从一个缓存对象(Cache
)中获取指定key对应的value值时,如果该key无对应的value,则返回null
String value = myCache.get(2L);//此处返回的值为null
当利用缓存管理器的removeCache()
移除一个指定的缓存对象时,缓存管理器不仅会移除对这个缓存对象的引用,还会将这个缓存对象关闭。这缓存对象将释放它所持有的全部临时资源(如:内存),对这个缓存对像的引用将无法使用
cacheManager.removeCache("myCache");
//Exception in thread "main" java.lang.IllegalStateException: State is UNINITIALIZED
System.out.println(myCache.get(1L));
为了释放一个缓存管理器中全部缓存对象所持有的临时资源(如:线程/内存),可以调用缓存管理器的close()
cacheManager.close();