Java的缓存使用-Ehcache
Ehcache是一个开源的、基于标准的缓存,用于提高性能、卸载数据库和简化可伸缩性。作为一个健壮的、经过验证的、功能齐全的解决方案,它是当今最广泛使用的基于java的缓存。您可以使用Ehcache作为一个通用缓存或一个用于Hibernate的二级缓存。你还可以将它与诸如ColdFusion、谷歌应用引擎和Spring等第三方产品整合在一起。
怎么使用Ehcache
1、首先从http://ehcache.org/downloads下载Ehcache。
从Ehcache 1.7.1开始,Ehcache依靠SLF4J(http://www.slf4j.org)来记录日志。SLF4J是一种可以选择具体日志实现的日志框架。有关配置细节,请参阅Ehcache操作指南中的“日志”。
2、使用Java 1.5及以上。
3、将Ehcache jar放置在类路径中或者添加Maven仓库坐标到pom文件。
4、编写配置文件ehcache.xml并将其放置在类路径classpath下。
5、可以选择配置适当的日志级别,如Ehcache操作指南中所描述的 "Logging" 。
6、现在你可以在程序中使用了。
<!--
CacheManager的配置
==========================
一个ehcache.xml文件对应一个CacheManager缓存管理
在<ehcache>标签下的属性有:
* name - 一个可选的CacheManager名称。名称是可选的,主要使用用于文档或区分Terracotta集群缓存状态。与Terracotta集群缓存,缓存器名称和缓存名称的组合唯一标识a特定的缓存存储在Terracotta集群内存中。
* updateCheck - 一个可选的布尔标志,指定这个CacheManager是否应该检查在互联网上使用Ehcache的新版本。如果不指定,updateCheck = " true "。
* dynamicConfig - 可选设置,可用于禁用缓存的动态配置与此相关缓存管理器。默认情况下,这将被设置为true——即动态配置启用。动态可配置的缓存可以有它们的TTI、TTL和最大磁盘内存容量在运行时通过缓存的配置对象更改。
* monitoring - 一个可选设置,确定CacheManager是否应该使用系统MBean服务自动注册的SampledCacheMBean。
* maxBytesLocalHeap - 可选设置,限制了缓存器管理的缓存的内存使用情况最多使用本地VM堆的指定字节数。
* maxBytesLocalOffHeap - 可选设置,限制了CacheManager管理的缓存的offHeap使用,使用本地VM的offHeap内存的最大字节数。
* maxBytesLocalDisk - 可选设置,限制缓存器管理的缓存的磁盘使用,使用本地磁盘的最大字节数。
这里有一个CacheManager级别资源调优的例子,它将使用高达400M的堆和2G的offHeap:
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ehcache.xsd"
updateCheck="true" monitoring="autodetect"
dynamicConfig="true" maxBytesLocalHeap="400M" maxBytesLocalOffHeap="2G">
-->
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true" monitoring="autodetect" dynamicConfig="true">
<!--
DiskStore的配置
=======================
diskStore元素是可选的。要关闭磁盘存储路径创建,请注释掉下面的diskStore元素。
如果没有配置它,并且创建了一个需要磁盘存储的缓存,那么将发出警告,并将自动使用java.io.tmpdir。
diskStore只有一个属性——"path"。它是通往目录的路径,其中将创建任何必需的磁盘文件。
下面的属性被翻译:
* user.home - 用户的主目录
* user.dir - 用户的当前工作目录
* java.io.tmpdir - 默认的临时文件路径
* ehcache.disk.store.dir - 通常在命令行上指定的系统属性
例如. java -Dehcache.disk.store.dir=/u01/myapp/diskdir ...
子目录可以在属性(例如java.io.tmpdir/one)下指定
-->
<diskStore path="java.io.tmpdir"/>
<!--
Cache的配置
===================
以下的属性是必须的。
name:
设置缓存的名称。这是用来识别缓存的。它必须是唯一的。
maxEntriesLocalHeap:
设置将在内存中创建的对象的最大数量。0表示没有限制。没有限制意味着Integer.MAX_SIZE(2147483647),除非缓存是用Terracotta服务器分发的,在这种情况下,它受到资源的限制。
maxEntriesLocalDisk:
设置在DiskStore中维护的对象的最大数量,默认值为0,这意味着无限。
eternal:
设置元素是否为永久。如果是永久的,超时被忽略,否则元素永远不会过期。
以下属性和元素是可选的。
maxEntriesInCache:
这个特性只适用于Terracotta分布式缓存。设置可以存储在集群中的条目的最大数量。0表示没有限制。请注意,如果资源使用需要,集群缓存仍然会执行驱逐。这个属性可以在缓存运行时动态修改。
overflowToOffHeap:
(boolean) 这个特性只能在Ehcache的企业版本中使用。当设置为true时,允许缓存利用堆外内存存储来提高性能。非堆内存不受Java GC的影响。默认值为false。
maxBytesLocalHeap:
定义缓存可以从VM堆中使用多少字节。如果一个缓存管理器已经定义了maxBytesLocalHeap,这个缓存的指定数量将是从CacheManager中删除。其他缓存将共享其余的缓存。
此属性的值为<number>k|K|m|M|g|G千字节(K | K),兆(M | m),或千兆字节(G | G)。
例如,maxBytesLocalHeap = " 2g " allots 2千兆字节的堆内存。如果指定maxBytesLocalHeap,则不能使用maxEntriesLocalHeap属性。
maxBytesLocalOffHeap:
该特性仅在Ehcache的企业版本中可用。设置此缓存可使用的非堆内存的数量,并将保留。
这个设置将把overflowToOffHeap设置为true。显式设置为false以禁用溢出行为。
maxBytesLocalDisk:
对于maxBytesLocalHeap,指定这个缓存将使用的磁盘存储的限制。
timeToIdleSeconds:
在元素到期之前设置空闲时间。也就是说,在元素到期之前,只有在元素不是永恒的时候才使用。可选属性。值为0意味着一个元素可以无限地空闲。默认值为0。
timeToLiveSeconds:
设置在元素到期之前存活的时间。即在创建时间和元素到期之间的最大时间。只有在元素不是永恒的时候才使用。可选属性。值为0意味着元素可以无限地活下去。默认值为0。
diskExpiryThreadIntervalSeconds:
磁盘过期线程之间的秒数。默认值是120秒。
diskSpoolBufferSizeMB:
这是为一个spool缓冲区分配DiskStore的磁盘大小。写入到该区域,然后异步写入磁盘。默认大小是30MB。每个spool缓冲区仅被其缓存使用。如果出现OutOfMemory错误,请考虑降低这个值。为了提高DiskStore性能,考虑增加它。在DiskStore中跟踪级别的日志记录将会显示是否出现了重新设置。
clearOnFlush:
在缓存中调用flush()时,是否应该清除MemoryStore。默认值是true,即MemoryStore将被清除。
memoryStoreEvictionPolicy:
如果内存中数据超过内存限制,向磁盘缓存时的策略。默认值LRU(最近最少使用),可选FIFO(先进先出)、LFU(最不经常使用)
copyOnRead:
当从缓存中读取一个元素时是否被复制。默认值是false。
copyOnWrite:
当被添加到缓存时,是否复制一个元素。默认值是false。
缓存持久性通过持久性子元素配置。持久性元素的属性为:
strategy:
配置缓存提供的持久性类型。这一定是下列值之一:
* localRestartable - 启用RestartStore并将所有缓存条目(堆和/或堆)复制到磁盘。此选项提供了磁盘上容错缓存持久性的快速可重新启动性。它仅供企业Ehcache用户使用。
* localTempSwap - 当缓存满时,交换缓存条目(on-heap and/or off-heap)到磁盘。“localTempSwap”不是持久的。
* none - 不保存高速缓存条目。
* distributed - Defers到< terracotta >配置的持久性设置。此选项不适用于独立。
synchronousWrites:
当在缓存中设置为true的写操作时,直到操作数据成功并刷新到磁盘存储后才返回。此选项只有在使用"localRestartable"策略使用时才有效,默认值为false。
下面的示例配置显示了为localTempSwap restar变性配置的缓存。
<cache name="persistentCache" maxEntriesLocalHeap="1000">
<persistence strategy="localTempSwap"/>
</cache>
缓存元素还可以包含以相同格式的工厂类和属性的子元素。定义子元素是:
* cacheEventListenerFactory - 允许侦听器进行缓存事件的注册,例如put、remove、update和expire。
* bootstrapCacheLoaderFactory - 指定一个BootstrapCacheLoader,它被一个初始化的缓存调用,以预先填充它本身。
* cacheExtensionFactory - 指定一个CacheExtension,这是一个通用的连接类的机制,它包含一个对缓存生命周期的引用的引用。
* cacheExceptionHandlerFactory - 指定CacheExceptionHandler,当缓存异常发生时调用它。
* cacheLoaderFactory - 指定缓存器,它既可以异步地同时使用,也可以同步地将对象加载到缓存中。可以添加多个cacheLoaderFactory元素,在这种情况下,加载器会形成一个按顺序执行的链。如果加载器返回空值,则调用链中的下一个。
* copyStrategy - 指定完全限定类实现net.sf.ehcache.store.compound.CopyStrategy)。这个策略将被用于在默认情况下的copyOnRead和copyOnWrite。
缓存级资源调优的例子:
<cache name="memBound" maxBytesLocalHeap="100m" maxBytesLocalOffHeap="4g" maxBytesLocalDisk="200g" />
</cache>
<!--
示例xa启用缓存命名为xaCache
<cache name="xaCache"
maxEntriesLocalHeap="500"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
diskExpiryThreadIntervalSeconds="1"
transactionalMode="xa_strict">
</cache>
-->
<!--
示例在读写缓存命名copyCache使用默认(显式配置为例)ReadWriteSerializationCopyStrategy net.sf.ehcache.store.compound.CopyStrategy的类可以是任何实现
<cache name="copyCache"
maxEntriesLocalHeap="500"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
diskExpiryThreadIntervalSeconds="1"
copyOnRead="true"
copyOnWrite="true">
<copyStrategy class="net.sf.ehcache.store.compound.ReadWriteSerializationCopyStrategy" />
</cache>
-->
<!--
仅对Enterprise Ehcache来说,演示了一个具有内存、非堆和磁盘存储的分层缓存。在本例中,内存(on - memory)存储仅限10,000个项…例如,对于1k项目,将使用10MB内存,而非堆存储则限制为4GB,磁盘空间大小是无限的。
<cache name="tieredCache"
maxEntriesLocalHeap="10000"
eternal="false"
timeToLiveSeconds="600"
overflowToOffHeap="true"
maxBytesLocalOffHeap="4g"
diskExpiryThreadIntervalSeconds="1">
<persistence strategy="localTempSwap"/>
</cache>
-->
<!--
仅对Enterprise Ehcache来说,演示了一个具有内存和堆外存储的restartable缓存。
<cache name="restartableCache"
maxEntriesLocalHeap="10000"
eternal="true"
overflowToOffHeap="true"
maxBytesLocalOffHeap="4g"
<persistence strategy="localRestartable"/>
</cache>
-->
</ehcache>