ehcache的学习经历

本文介绍了EhCache的基本概念和特点,对比了EhCache与Redis的适用场景,并详细阐述了如何在Spring框架中配置和使用EhCache。此外,还提供了Shiro中EhCache的具体配置示例。

项目使用到了ehcache,自己学习了一下原理以及使用方式。

从几个方面来分析使用ehcache

1. 基本介绍

EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认CacheProvider

 

。Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAP api等特点。

Spring 提供了对缓存功能的抽象:即允许绑定不同的缓存解决方案(如Ehcache),但本身不直接提供缓存功能的实现。它支持注解方式使用缓存,非常方便。

2. 主要的特性有:

  1. 快速
  2. 简单
  3. 多种缓存策略
  4. 缓存数据有两级:内存和磁盘,因此无需担心容量问题
  5. 缓存数据会在虚拟机重启的过程中写入磁盘
  6. 可以通过RMI、可插入API等方式进行分布式缓存
  7. 具有缓存和缓存管理器的侦听接口
  8. 支持多缓存管理器实例,以及一个实例的多个缓存区域
  9. 提供Hibernate的缓存实现

3. 集成

可以单独使用,一般在第三方库中被用到的比较多(如mybatis、shiro等)ehcache 对分布式支持不够好,多个节点不能同步,通常和redis一块使用

4. ehcache 和 redis 比较

  • ehcache直接在jvm虚拟机中缓存,速度快,效率高;但是缓存共享麻烦,集群分布式应用不方便。
  • redis是通过socket访问到缓存服务,效率比ecache低,比数据库要快很多, 

处理集群和分布式缓存方便,有成熟的方案。如果是单个应用或者对缓存访问要求很高的应用,用ehcache。如果是大型系统,存在缓存共享、分布式部署、缓存内容很大的,建议用redis。

ehcache也有缓存共享方案,不过是通过RMI或者Jgroup多播方式进行广播缓存通知更新,缓存共享复杂,维护不方便;简单的共享可以,但是涉及到缓存恢复,大数据缓存,则不合适。

shiro的xml配置

<diskStore path="java.io.tmpdir"/>
	<!--  
		name:Cache的名称,必须是唯一的(ehcache会把这个cache放到HashMap里)。 
		maxElementsInMemory:内存中保持的对象数量。 
		maxElementsOnDisk:DiskStore中保持的对象数量,默认值为0,表示不限制。 
		eternal:是否是永恒数据,如果是,则它的超时设置会被忽略。 
		overflowToDisk:如果内存中数据数量超过maxElementsInMemory限制,是否要缓存到磁盘上。 
		timeToIdleSeconds:对象空闲时间,指对象在多长时间没有被访问就会失效。只对eternal为false的有效。默认值0,表示一直可以访问。 
		timeToLiveSeconds:对象存活时间,指对象从创建到失效所需要的时间。只对eternal为false的有效。默认值0,表示一直可以访问。 
		diskPersistent:是否在磁盘上持久化。指重启jvm后,数据是否有效。默认为false。 
		diskExpiryThreadIntervalSeconds:对象检测线程运行时间间隔。标识对象状态的线程多长时间运行一次。 
		diskSpoolBufferSizeMB:DiskStore使用的磁盘大小,默认值30MB。每个cache使用各自的DiskStore。 
		memoryStoreEvictionPolicy:如果内存中数据超过内存限制,向磁盘缓存时的策略。默认值LRU,可选FIFO、LFU。 
	
	-->
   <defaultCache  
    maxElementsInMemory="10000"  
    maxElementsOnDisk="0"  		 
    eternal="false"  			
    overflowToDisk="false"  
    diskPersistent="false"  
    timeToIdleSeconds="120"  
    timeToLiveSeconds="120"  
    diskSpoolBufferSizeMB="50"  
    diskExpiryThreadIntervalSeconds="120"  
    memoryStoreEvictionPolicy="LFU"  
    />  

在spring中的配置

	<bean id="ehcacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
        <property name="configLocation" value="classpath:config/ehcache.xml"/>
    </bean>

    <bean id="resourceCacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
        <property name="cacheManager" ref="ehcacheManager"/>
        <property name="transactionAware" value="true"/>
    </bean>

    <bean id="cache" factory-bean="resourceCacheManager" factory-method="getCache">
        <constructor-arg value="resource"/>
    </bean>
    <bean id="dictCache" factory-bean="resourceCacheManager" factory-method="getCache">
        <constructor-arg value="dictCache"/>
    </bean>

使用的时候加上Cacheable注解

 

@Cacheable 支持如下几个参数:

  • value:缓存位置名称,不能为空,如果使用EHCache,就是ehcache.xml中声明的cache的name, 指明将值缓存到哪个Cache中
  • key:缓存的key,默认为空,既表示使用方法的参数类型及参数值作为key,支持SpEL,如果要引用参数值使用井号加参数名,如:#userId,

一般来说,我们的更新操作只需要刷新缓存中某一个值,所以定义缓存的key值的方式就很重要,最好是能够唯一,因为这样可以准确的清除掉特定的缓存,而不会影响到其它缓存值 , 

本例子中使用实体加冒号再加ID组合成键的名称,如”user:1”、”order:223123”等

  • condition:触发条件,只有满足条件的情况才会加入缓存,默认为空,既表示全部都加入缓存,支持SpEL

 

  • @CachePut

与@Cacheable不同,@CachePut不仅会缓存方法的结果,还会执行方法的代码段。它支持的属性和用法都与@Cacheable一致。

  • @CacheEvict

与@Cacheable功能相反,@CacheEvict表明所修饰的方法是用来删除失效或无用的缓存数据。

@CacheEvict 支持如下几个参数:

    • value:缓存位置名称,不能为空,同上
    • key:缓存的key,默认为空,同上
    • condition:触发条件,只有满足条件的情况才会清除缓存,默认为空,支持SpEL
    • allEntries:true表示清除value中的全部缓存,默认为false

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值