`

Ehcache(03)-Ehcache中储存缓存的方式

 
阅读更多

Ehcache中储存缓存的方式

 

目录

1     堆内存(MemoryStore

1.1     指定可用内存

1.2     驱除策略

1.3     元素过期

2     非堆内存(BigMemory

3     磁盘(DiskStore

3.1     指定可用容量

3.2     元素过期

 

       Ehcache中对于缓存的存储主要有三种方式:分别是堆内存、非堆内存和磁盘。其中非堆内存是针对于企业版Ehcache才有的功能,它可以不受Java GC的影响,能够创建很大的缓存。

 

1       堆内存(MemoryStore

       我们通常所有的MemoryStore实际上就是堆内存存储。MemoryStore总是可用的,所有的元素都可以储存在MemoryStore中。MemoryStore是线程安全的,相比另外两种储存方式而言其访问速度也是最快的。通常我们在往缓存里面添加元素的时候,其首先就是存放在MemoryStore里面的,但是我们又不能说连续不断的往MemoryStore里面存放元素,这就涉及到到底能放多少元素的问题。

 

1.1         指定可用内存

       Ehcache规定我们在使用一个Cache时必须在CacheManager级别指定可用的内存大小或者是在Cache级别指定可用的内存大小或所允许存放的元素的最大数量。在CacheManager级别指定的内存大小是其内部所有Cache一起所能使用的内存的最大量。CacheManager级别指定内存大小是通过maxBytesLocalHeap来指定的,如:

Xml代码   收藏代码
  1. <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  2.    xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"  
  3.    maxBytesLocalHeap="500M">  
  4.     
  5. </ehcache>  

 

       上面指定了我们的CacheManager所能使用的最大内存是500MCacheManager级别指定了内存大小后我们在Cache上也可以指定其能使用的最大内存,但不能指定其所能存储元素的最大数量。另外,如果我们的CacheManager没有指定可用的内存大小,我们可以通过maxBytesLocalHeapCache级别指定可用的内存大小,或者通过maxEntriesLocalHeapCache级别指定允许储存元素的最大数量,但是maxEntriesLocalHeapmaxBytesLocalHeap不能同时使用。如下在CacheManager级别使用maxBytesLocalHeap,然而在Cache级别使用maxEntriesLocalHeap是不行的。

Xml代码   收藏代码
  1. <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  2.    xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"  
  3.    maxBytesLocalHeap="500M">  
  4.     
  5.    <cache name="ttt" maxEntriesLocalHeap="10000"/>  
  6.     
  7. </ehcache>  

 

 

       如下在Cache级别同时使用maxBytesLocalHeapmaxEntriesLocalHeap也是不行的。

Xml代码   收藏代码
  1. <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  2.    xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">  
  3.     
  4.    <cache name="ttt" maxBytesLocalHeap="50M" maxEntriesLocalHeap="10000"/>  
  5.     
  6. </ehcache>  

 

 

1.2     驱除策略

       那么当我们内存中的元素大小或者数量超过了预设的大小之后怎么办呢?这个时候如果我们设置了允许溢出,如overflowToDiskoverflowToOffHeap,则会把某些元素溢出到对应的储存器中。如果不允许溢出,则会先删除原有的某些元素。至于是哪个元素溢出、哪个元素删除则在不存在超时的情况下与我们的内存驱除策略有关,这是通过CachememoryStoreEvictionPolicy属性来指定的。其可选值有LRULFUFIFO,默认是LRU。但是如果有过期元素存在的话则会优先驱除已经过期的元素,然后再考虑驱除策略memoryStoreEvictionPolicy

       LRULeast Recently Used:最近最少使用。当我们把一个元素储存到Cache中或者从Cache中取出时都会更新该元素的最后使用时间。当采用最近最少使用原则进行驱除时会优先把最后使用时间最早的元素进行驱除。

       LFULeast Frequently Used:最不常使用的。每次我们从Cache中获取一个元素时都会更新该元素的hitCount属性值加1。当采用最不常使用原则进行驱除时hitCount属性值最小的元素将优先驱除。

       FIFOFirst In First Out:先进先出。当采用这种驱除原则时将优先驱除最先储存的元素。

 

1.3     元素过期

       在上文中我们已经知道在不存在元素过期的情况下,驱除哪个元素是与我们的内存驱除策略有关的。但如果存在过期元素的话则会优先驱除已经过期的元素。关于控制元素是否过期我们可以通过cache的几个属性来定义。

       timeToIdleSeconds:单位是秒,表示一个元素在不被请求的情况下允许在缓存中存在的最长时间。默认值是0,表示不限制。

       timeToLiveSeconds:单位是秒,表示一个元素不管有没有被使用,其在缓存中允许存在的最长时间。默认是0,表示不限制。一般timeToLiveSeconds要比timeToIdleSeconds长,否则就timeToIdleSeconds就失去意义了。

       eternalboolean类型,表示是否永恒,默认为false。当设为true时,表示缓存中的元素永远不会过期,timeToIdleSecondstimeToLiveSeconds就失去作用了。这个时候元素就只能由驱除策略来进行驱除了。

       当我们的元素过期以后,为了保持Cache的性能,Ehcache不一定马上就会将过期的元素删除或者驱除到其它存储容器中,它可能还在原来的位置。之所以说不一定是因为有可能当一个元素过期时恰好Cache需要删除元素或者驱除元素到其它存储容器中,这个时候我们的过期元素将优先被删除或者驱除。另外,当我们在请求一个元素的时候,如果Ehcache发现该元素已经过期的话也会立刻将该元素删除。

Xml代码   收藏代码
  1. <cache name="ttt" maxBytesLocalHeap="50M" timeToIdleSeconds="600"  
  2.    timeToLiveSeconds="3600" memoryStoreEvictionPolicy="LFU" />  

 

       在上面的配置中,我们指定了该Cache允许元素不被请求的时间是10分钟,最大存活时间是1小时,使用的驱除策略是LFU(最不常使用)。

 

2       非堆内存(BigMemory

       非堆内存存储是针对于企业版才有的功能,它可以不受Java GC的影响,能够创建很大的缓存。BigMemory保存的都是一个个的字节,在保存元素的时候Ehcache会对元素进行序列化再保存到BigMemory中,然后在读取的时候又会把读取到的字节进行反序列化。所以存放在其中的元素的keyvalue都必须是能够序列化的。

 

 

 

3       磁盘(DiskStore

       磁盘存储可以存储内存中驱除过来的元素,也可以在系统重启的时候将内存中的缓存信息保存起来,供系统重新启动后使用。磁盘存储是非必须的,但是使用DiskStore的时候我们需要指定一个磁盘目录来存放缓存信息。这可以在ehcache.xml文件中的ehcahce元素下的定义一个diskStore元素并指定其path属性。由diskStore元素是定义在ehcache元素下我们看出diskStoreCacheManager范围内是共享的,其是线程安全的。如果我们没有定义diskStore元素时,DiskStore会使用默认的目录作为其存储目录,该目录就是java.io.tmpdir,即Java的临时目录。当然我们也可以指定一个绝对路径。当我们指定diskStore元素的path为以下值时会被替换为实际对应的目录:

l  user.home:用户的家目录。

l  user.dir:用户的当前工作目录。

l  java.io.tmpdirJava临时目录。

l  在命令行指定的属性,如“java -Dehcache.disk.store.dir=D:\\abc …..”。

       子目录的话可以这样指定:user.home/ehcache

       此外需要注意的是因为DiskStore是把信息存放在磁盘上的,所以我们存放在磁盘上的元素必须是可以序列化的。CacheManagerDiskStore路径一旦设置好了之后将不能再更改。如果硬是更改了,那么我们的CacheManager需要基于新的路径重新建立。

3.1     指定可用容量

       指定可用容量的时候我们可以在CacheManager级别通过maxBytesLocalDisk来指定。而在Cache级别我们可以通过maxBytesLocalDiskmaxEntriesLocalDisk来指定。因为DiskStore是可选的,所以这些属性也都是可选的。另外不像MemoryStore那样,我们在Cache级别上可以同时指定maxBytesLocalDiskmaxEntriesLocalDisk。如:

Xml代码   收藏代码
  1. <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  2.    xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"  
  3.    maxBytesLocalDisk="50G">  
  4.    
  5.    <diskStore path="d:\\ehcache"/>  
  6.    
  7.    <cache name="ttt" maxBytesLocalHeap="100M" maxBytesLocalDisk="50G" maxEntriesLocalDisk="10000"/>  
  8.     
  9. </ehcache>  

 

       DiskStore中驱除元素跟MemoryStore中驱除元素的规则是不一样的。当往DiskStore中添加元素且此时DiskStore中的容量已经超出限制时将采用LFU(最不常用)驱除规则将对应的元素进行删除,而且该驱除规则是不可配置的

 

3.2     元素过期

       DiskStore中的元素过期跟MemoryStore中的元素过期是同样定义的。对于每一个Cache而言都拥有一个线程用于检查并移除其中的过期元素。至于多久检查一次,我们可以通过cache元素的diskExpiryThreadIntervalSeconds 属性来指定,默认是每两分钟检查一次。

 

 

(注:本文是基于Ehcache2.8.1所写。)

摘自:http://haohaoxuexi.iteye.com/blog/2114769

分享到:
评论

相关推荐

    ehcache.rar ehcache-core-2.6.10.jar依赖包

    ehcache-core-2.6.10.jar依赖包 MyBatiesEhCache二级缓存 Ehcache是一种广泛使用的开源Java分布式...它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAP api等特点

    Ehcache分布式缓存与其在SpringBoot应用

    EhCache 是一个纯 Java 的进程内缓存框架,具有快速、精干等特点,是 Hibernate 中默认的 CacheProvider。Ehcache 是一种广泛使用的开源 Java 分布式缓存。主要面向通用缓存,Java EE 和轻量级容器。它具有内存和...

    mybatis-ehcache-1.0.0.jar下载

    2. 二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。3. 对于缓存数据更新机制,当某一个作用域(一级缓存...

    ehcache-core_2.7.0_API (CHM格式)

    Java缓存框架 EhCache EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。 从之前发布其他chm文件下载用户的反映看,有不少朋友反映下载后打开无法显示,这一般不是...

    ehcache.jar(含源码)

    EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。 Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。它具有内存和磁盘存储,...

    EHCache缓存

    ehcache是一个用Java实现的使用简单,高速,实现线程安全的缓存管理类库,ehcache提供了用内存,磁盘文件存储,以及分布式存储方式等多种灵活的cache管理方案,是hibernate中默认的CacheProvider。

    ehcache 2.8.3 API

    EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。Ehcache是一种广泛使用的开 源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。它具有内存和磁盘存储,...

    spring+ehcache实例demo

    EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。 Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。它具有内存和磁盘存储,...

    ehcache模糊批量移除缓存的方法

    本篇文章主要介绍了ehcache模糊批量移除缓存的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Spring Boot的EhCache缓存使用.docx

    当我们不指定具体其他第三方实现的时候,Spring Boot的Cache模块会使用ConcurrentHashMap来存储。而实际生产使用的时候,因为我们可能需要更多其他特性,往往就会采用其他缓存框架,所以接下来我们会分几篇分别介绍...

    SpringBoo2.x,整合Ehcache3.x

    SpringBoo2.x整合Ehcache3.x作为缓存底层存储。

    EHcache 缓存使用 手动存储 配置到SSH

    从sebService获得数据,分页显示,如果不用缓存刚每显示都很慢。配置文件自动清空缓存。

    整合spring 和ehcache

    配置ehcache缓存,存储内存的设置,与spring 的整合等

    springmvc+ehcache 实例

    maven +springmvc+ehcache实例 项目下载下来 直接运行 首页 有存储数据 获取数据 两个按钮 可以清晰看到ehcache作为缓存的效果

    Ehcache Java 缓存框架.rar

    本地缓存中仅存储一些固定不变、或者不常变化的数据。 通过过期重新加载、定时refresh等策略定时更新本地的缓存,忍受数据有一定时间内的不一致。 对于少量更新的场景,借助MQ构建更新机制,有变更就发到MQ中然后...

    j2cache:java 2级缓存 get->>ehcache->>redis->>>database

    key存储方式 以下两个方法为例: setn(region,key,value) //不通知其他节点清空消息 set(region,key,value) set(key,value) . 为了一个redis服务器,多个项目公用,key前缀添加namespace . region:为模块或者特定缓存...

    cachet:抽象缓存框架 - 支持 Ehcache、Infinispan 和 Memcached 库

    支持 Ehcache、Infinispan 和 Memcached 缓存库。 ####目标: 为现有的缓存框架(如 JCS 和 Hazelcast)提供支持。 为客户端配置 API 提供支持。 提供对 Tree Cache API 的支持。 实现像缓存这样的高性能树。 ##...

    c24-sample-ehcache:示例项目显示了具有EHCache的C24的缓存功能

    这是一个示例项目,显示了使用以C24-io二进制格式(SDO)序列化的Java对象在ehcache中的存储和查询功能。 获取样例项目 该项目可从C24公共Git存储库中获得 克隆它: git clone ...

    ehcache.zip

    EhCache 是一个纯Java的进程内缓存框架,快速、简单,Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。它具有内存和磁盘存储两种方式。

    ehcache基本原理

    ehcache是一个用Java实现的使用简单,高速,实现线程安全的缓存管理类库,ehcache提供了用内存,磁盘文件存储,以及分布式存储方式等多种灵活的cache管理方案。同时ehcache作为开放源代码项目,采用限制比较宽松的...

Global site tag (gtag.js) - Google Analytics