前言:
如今我们对“ehcache缓存到硬盘再读取”可能比较珍视,小伙伴们都需要了解一些“ehcache缓存到硬盘再读取”的相关内容。那么小编也在网摘上网罗了一些有关“ehcache缓存到硬盘再读取””的相关文章,希望同学们能喜欢,你们一起来了解一下吧!ehcache是一个纯Java实现的进程内缓存实现,具有快速精简等特点。有单机版本、分布式实现版本。主要针对基于java开发的项目使用。支持磁盘持久化及磁盘load到内存。
介绍
EhCache是基于Java的开源缓存,有很好的性能,可扩展。因为功能强大、经过测试的、功能全而广泛的应用与Java开发的系统中。支持进程内、混合进程内/进程外继承部署。
1.1 特点
1、单机版本的ehcache是jvm进程内缓存,不走网卡,速度快、效率高。
2、冷热数据单独处理不方便,正常情况下数据都是放在内存中,超过配置阈值后才会进行持久化磁盘处理。
3、数据的持久化需要在配置文件中配置才会进行,否则ehcache关闭后会删除掉缓存的磁盘文件。
4、如果项目中缓存分类比较多,分类又需要单独配置参数的情况,则配置文件就会比较大,比较麻烦。
5、默认依赖于classpath下的ehcache.xml配置文件,如果名称不同则需要明确指明配置文件。
1.2 maven配置
<dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>2.10.3</version></dependency>
1.3 Api使用
// 创建一个manager对象final CacheManager cacheManager = new CacheManager();// 创建一个cache对象,类似与mapfinal Cache cache = cacheManager.getCache("hello-world");// 定义一个缓存对象的key值final String key = "greeting";// 创建一个缓存的基本存储对象Elementfinal Element putGreeting = new Element(key, "Hello, World!");// 把实际的缓存对象放入到cache对象中去cache.put(putGreeting);// 从缓存中读取缓存内容final Element getGreeting = cache.get(key);// 打印缓存的内容System.out.println(getGreeting.getObjectValue());1.4 配置文件
<?xml version="1.0" encoding="UTF-8"?><ehcache updateCheck="false" name="defaultCache"> <diskStore path="../temp/lehoon/ehcache"/> <!-- maxEntriesLocalHeap:堆内存中最大缓存对象数 eternal:对象是否永久有效,一但设置了,timeout将不起作用 overflowToDisk:当缓存达到maxElementsInMemory值是,是否允许溢出到磁盘 timeToIdleSeconds:当缓存闲置n秒后销毁 timeToLiveSeconds:当缓存存活n秒后销毁 maxEntriesLocalDisk:硬盘最大缓存个数 diskPersistent:磁盘缓存在JVM重新启动时是否保持 --> <!-- 默认缓存配置-当不配置缓存信息时使用此配置 --> <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>使用常见问题2.1 删除缓存对象方法
删除缓存cache对象的时候,使用CacheManager.removeCache方法,不能直接delete删除。
/** * 删除cache对象 * @param ehCacheName */private void removeCache(Object ehCacheName) { String name = ehCacheName.toString(); if (cacheManager == null) { this.cacheManager = (CacheManager) SpringContextHolder.getBean("cacheManager"); } cacheManager.removeCache(name);}2.2 检查缓存是否可用状态
@Overridepublic boolean isAlive() { if (cacheManager == null) { cacheManager = (CacheManager) SpringContextHolder.getBean("cacheManager"); } int status = cacheManager.getStatus().intValue(); return status == Status.STATUS_ALIVE.intValue();}
2.3 缓存持久化及加载
缓存持久化是从内存持久化到磁盘,默认ehcache停止的时候会删除掉运行期间落盘的磁盘文件,因此需要配置告诉ehcache停止时候不需要删除缓存文件,配置参数如下:
<?xml version="1.0" encoding="UTF-8"?><ehcache updateCheck="false" name="defaultCache"> <diskStore path="../temp/lehoon/ehcache"/> <!-- maxEntriesLocalHeap:堆内存中最大缓存对象数 eternal:对象是否永久有效,一但设置了,timeout将不起作用 overflowToDisk:当缓存达到maxElementsInMemory值是,是否允许溢出到磁盘 timeToIdleSeconds:当缓存闲置n秒后销毁 timeToLiveSeconds:当缓存存活n秒后销毁 maxEntriesLocalDisk:硬盘最大缓存个数 diskPersistent:磁盘缓存在JVM重新启动时是否保持 --> <!-- 订单缓存,通过eternal=true配持久化缓存文件 --> <cache name="BILLING" maxEntriesLocalHeap="10000" eternal="true" overflowToDisk="true" timeToIdleSeconds="0" diskPersistent="true"> </cache></ehcache>
持久化的缓存在ehcache启动的时候加载到内存中去,需要增加配置bootstrapCacheLoaderFactory属性,如下
<?xml version="1.0" encoding="UTF-8"?><ehcache updateCheck="false" name="defaultCache"> <diskStore path="../temp/lehoon/ehcache"/> <!-- maxEntriesLocalHeap:堆内存中最大缓存对象数 eternal:对象是否永久有效,一但设置了,timeout将不起作用 overflowToDisk:当缓存达到maxElementsInMemory值是,是否允许溢出到磁盘 timeToIdleSeconds:当缓存闲置n秒后销毁 timeToLiveSeconds:当缓存存活n秒后销毁 maxEntriesLocalDisk:硬盘最大缓存个数 diskPersistent:磁盘缓存在JVM重新启动时是否保持 --> <!-- 订单缓存 通过bootstrapCacheLoaderFactory参数配置启动加载到内存 --> <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>
标签: #ehcache缓存到硬盘再读取