Java Ehcache缓存框架入门级使用实例
程序员文章站
2024-02-14 17:48:10
前言
java缓存实现方案有很多,最基本的自己使用map去构建缓存,或者使用memcached或redis,但是上述两种缓存框架都要搭建服务器,而map自行构建的缓存可能...
前言
java缓存实现方案有很多,最基本的自己使用map去构建缓存,或者使用memcached或redis,但是上述两种缓存框架都要搭建服务器,而map自行构建的缓存可能没有很高的使用效率,那么我们可以尝试一下使用ehcache缓存框架。
ehcache主要基于内存缓存,磁盘缓存为辅的,使用起来方便。下面介绍如何在项目中使用ehcache
入门使用教程
1.maven引用
<dependency> <groupid>net.sf.ehcache</groupid> <artifactid>ehcache</artifactid> <version>2.10.4</version> </dependency>
2.在classpath下建立一个ehcache.xml
<?xml version="1.0" encoding="utf-8"?> <ehcache> <!--timetoidleseconds 当缓存闲置n秒后销毁 --> <!--timetoliveseconds 当缓存存活n秒后销毁 --> <!-- 缓存配置 name:缓存名称。 maxelementsinmemory:缓存最大个数。 eternal:对象是否永久有效,一但设置了,timeout将不起作用。 timetoidleseconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。 timetoliveseconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。 overflowtodisk:当内存中对象数量达到maxelementsinmemory时,ehcache将会对象写到磁盘中。 diskspoolbuffersizemb:这个参数设置diskstore(磁盘缓存)的缓存区大小。默认是30mb。每个cache都应该有自己的一个缓冲区。 maxelementsondisk:硬盘最大缓存个数。 diskpersistent:是否缓存虚拟机重启期数据 whether the disk store persists between restarts of the virtual machine. the default value is false. diskexpirythreadintervalseconds:磁盘失效线程运行时间间隔,默认是120秒。 memorystoreevictionpolicy:当达到maxelementsinmemory限制时,ehcache将会根据指定的策略去清理内存。默认策略是lru(最近最少使用)。你可以设置为fifo(先进先出)或是lfu(较少使用)。 clearonflush:内存数量最大时是否清除。 --> <!-- 磁盘缓存位置 --> <diskstore path="java.io.tmpdir/easylink-mall-web/ehcache"/> <!-- 默认缓存 --> <defaultcache maxelementsinmemory="10000" eternal="false" timetoidleseconds="120" timetoliveseconds="120" maxelementsondisk="10000000" diskexpirythreadintervalseconds="120" memorystoreevictionpolicy="lru"> <persistence strategy="localtempswap"/> </defaultcache> <!-- 商户申请数据缓存 数据缓存40分钟 --> <cache name="merchant-apply-cache" eternal="false" timetoidleseconds="2400" timetoliveseconds="2400" maxentrieslocalheap="10000" maxentrieslocaldisk="10000000" diskexpirythreadintervalseconds="120" overflowtodisk="false" memorystoreevictionpolicy="lru"> </cache> </ehcache>
3.与spring的cachemanager结合使用
<?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:cache="http://www.springframework.org/schema/cache" xsi:schemalocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd"> <!-- 支持缓存注解 --> <cache:annotation-driven cache-manager="cachemanager" /> <!-- 默认是cachemanager --> <bean id="cachemanager" class="org.springframework.cache.ehcache.ehcachecachemanager"> <property name="cachemanager" ref="cachemanagerfactory"/> </bean> <!-- cache管理器配置 --> <bean id="cachemanagerfactory" class="org.springframework.cache.ehcache.ehcachemanagerfactorybean"> <property name="configlocation" value="classpath:ehcache.xml"/> <property name="shared" value="true" /> </bean> </beans>
4.代码使用
import org.junit.test; import org.junit.runner.runwith; import org.springframework.beans.factory.annotation.autowired; import org.springframework.cache.cache; import org.springframework.cache.cachemanager; import org.springframework.test.context.contextconfiguration; import org.springframework.test.context.junit4.springjunit4classrunner; import com.baomidou.mybatisplus.toolkit.idworker; import com.easylink.mall.entity.merchant; @runwith(springjunit4classrunner.class) @contextconfiguration(locations = "classpath:spring/spring.xml") public class ehcachetest { @autowired private cachemanager cachemanager; @test public void execute() { // 获取商户申请缓存容器 cache cache = cachemanager.getcache("merchant-apply-cache"); merchant merchant = new merchant(); long id = idworker.getid(); merchant.setid(id); merchant.setname("缓存测试"); // 将商户申请数据添加至缓存中 // key : id value : object cache.put(id, merchant); // 获取商户申请数据 // 方法1 merchant cachemerchant1 = (merchant) cache.get(id).get(); system.out.println(cachemerchant1.getname()); // 方法2 merchant cachemerchant2 = cache.get(id, merchant.class); system.out.println(cachemerchant2.getname()); // 将商户申请数据从缓存中移除 cache.evict(id); } }
5.注意事项
cache.get(key) 和cache.get(key, class);方法,由于不知道你存入的key是什么类型,所以get的时候不会做key的类型检查,如上述例子中
long id = idworker.getid(); cache.put(id, merchant); merchant cachemerchant2 = cache.get(id, merchant.class);
put进去时的key是long类型的,get的时候也只能传入对应long类型的key才能获取到对应的value,如果传入的是string类型的key,即使两个key的值是一致的,也会导致无法获取到对应的value。这个情况很容易发生在对request请求的参数,由于是string字符串类型,但是忘了做类型转换就直接把这个string当做key去获取对应的value。导致获取不到,请同学们要注意,亲身经历,血与泪的教训。
总结
以上就是我自己总结的ehcache入门级用法,ehcache是个不错的内存缓存框架,如果没使用过的话,可以尝试使用。希望对大家的学习有所帮助,也希望大家多多支持。
下一篇: java简单冒泡排序实例解析
推荐阅读
-
Java Ehcache缓存框架入门级使用实例
-
Spring Boot 简单使用EhCache缓存框架的方法
-
ehcache开源缓存框架_动力节点Java学院整理
-
ehcache开源缓存框架_动力节点Java学院整理
-
ThinkPHP3.2.3框架Memcache缓存使用方法实例总结
-
springboot2.X 整合 J2cache 一级缓存 ehcache3 二级缓存 redis (含使用demo实例)
-
实例讲解分布式缓存软件Memcached的Java客户端使用
-
详解Java的Hibernate框架中的缓存与原生SQL语句的使用
-
Java的MyBatis框架中XML映射缓存的使用教程
-
Ehcache 2.5.2 发布,Java分布式缓存框架