ehcache是一个纯Java实现的进程内缓存实现,具有快速精简等特点。有单机版本、分布式实现版本。主要针对基于java开发的项目使用。支持磁盘持久化及磁盘load到内存。
介绍
EhCache是基于标志的开源缓存,有很好的性能,可扩展。因为功能强大、经过测试的、功能全而广泛的应用与Java开发的系统中。支持进程内、混合进程内/进程外继承部署。
特点
1、单机版本的ehcache是jvm进程内缓存,不走网卡,速度快、效率高。
2、冷热数据单独处理不方便,正常情况下数据都是放在内存中,超过配置阈值后才会进行持久化磁盘处理。
3、数据的持久化需要在配置文件中配置才会进行,否则ehcache关闭后会删除掉缓存的磁盘文件。
4、如果项目中缓存分类比较多,分类又需要单独配置参数的情况,则配置文件就会比较大,比较麻烦。
5、默认依赖于classpath下的ehcache.xml配置文件,如果名称不同则需要明确指明配置文件。
maven配置
1 2 3 4 5
| <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>2.10.3</version> </dependency>
|
Api使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| final CacheManager cacheManager = new CacheManager();
final Cache cache = cacheManager.getCache("hello-world");
final String key = "greeting";
final Element putGreeting = new Element(key, "Hello, World!");
cache.put(putGreeting);
final Element getGreeting = cache.get(key);
System.out.println(getGreeting.getObjectValue());
|
配置文件
配置文件样例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| <?xml version="1.0" encoding="UTF-8"?> <ehcache updateCheck="false" name="defaultCache"> <diskStore path="../temp/lehoon/ehcache"/>
<defaultCache maxEntriesLocalHeap="10000" eternal="false" overflowToDisk="true" timeToIdleSeconds="0" timeToLiveSeconds="86400" maxEntriesLocalDisk="100000" diskPersistent="false"> </defaultCache> <cache name="SYS_CACHE" maxEntriesLocalHeap="10000" eternal="false" timeToLiveSeconds="86400" maxEntriesLocalDisk="10000000" overflowToDisk="true" timeToIdleSeconds="0" diskPersistent="false"> </cache>
<cache name="BILLING" maxEntriesLocalHeap="10000" eternal="true" overflowToDisk="true" timeToIdleSeconds="0" diskPersistent="true"> <bootstrapCacheLoaderFactory class="net.sf.ehcache.store.DiskStoreBootstrapCacheLoaderFactory" properties="bootstrapAsynchronously=true"> </bootstrapCacheLoaderFactory> </cache> </ehcache>
|
使用常见问题
删除缓存对象方法
删除缓存cache对象的时候,使用CacheManager.removeCache方法,不能直接delete删除。
1 2 3 4 5 6 7 8 9 10 11 12
|
private void removeCache(Object ehCacheName) { String name = ehCacheName.toString(); if (cacheManager == null) { this.cacheManager = (CacheManager) SpringContextHolder.getBean("cacheManager"); }
cacheManager.removeCache(name); }
|
检查缓存是否可用状态
1 2 3 4 5 6 7 8 9
| @Override public boolean isAlive() { if (cacheManager == null) { cacheManager = (CacheManager) SpringContextHolder.getBean("cacheManager"); }
int status = cacheManager.getStatus().intValue(); return status == Status.STATUS_ALIVE.intValue(); }
|
缓存持久化及加载
缓存持久化是从内存持久化到磁盘,默认ehcache停止的时候会删除掉运行期间落盘的磁盘文件,因此需要配置告诉ehcache停止时候不需要删除缓存文件,配置参数如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| <?xml version="1.0" encoding="UTF-8"?> <ehcache updateCheck="false" name="defaultCache"> <diskStore path="../temp/lehoon/ehcache"/>
<cache name="BILLING" maxEntriesLocalHeap="10000" eternal="true" overflowToDisk="true" timeToIdleSeconds="0" diskPersistent="true"> </cache> </ehcache>
|
持久化的缓存在ehcache启动的时候加载到内存中去,需要增加配置bootstrapCacheLoaderFactory属性,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| <?xml version="1.0" encoding="UTF-8"?> <ehcache updateCheck="false" name="defaultCache"> <diskStore path="../temp/lehoon/ehcache"/>
<cache name="BILLING" maxEntriesLocalHeap="10000" eternal="true" overflowToDisk="true" timeToIdleSeconds="0" diskPersistent="true"> <bootstrapCacheLoaderFactory class="net.sf.ehcache.store.DiskStoreBootstrapCacheLoaderFactory" properties="bootstrapAsynchronously=true"> </bootstrapCacheLoaderFactory> </cache> </ehcache>
|