前言
Ehcache是一种基于标准的开源缓存,可以提高性能、减轻数据库负担并简化可伸缩性。它是使用最广泛的基于Java的缓存工具。它和redis、memcache一样都提供有缓存的功能,但是重点来了:Ehcache是一个进程内缓存工具,它直接在jvm虚拟机中缓存,速度快,效率高。
一、Ehcache是什么?
Ehcache是第一个引入缓存数据持久化存储的开源java缓存框架,主要面向通用缓存,Java EE和轻量级容器。缓存的数据可以在机器重启后从磁盘上重新获得,根据需要将缓存刷到磁盘。
Ehcache虽然支持分布式缓存,但是缓存共享麻烦,集群分布式应用不方便,redis性能更高,redis是通过socket访问到缓存服务,效率比ecache低,比数据库要快很多。在需要使用本地缓存的时候,ehcache是一个很好用的工具,它比redis这些外存工具,具有更快的读写速度,并且也提供了丰富的功能。
二、使用步骤
1.echache.xml配置
代码如下(示例):
<?xml version="1.0" encoding="UTF-8"?>
<ehcache updateCheck="false" name="Cache">
<!--diskStore磁盘缓存位置-->
<diskStore path="java.io.tmpdir/ehcache"/>
<defaultCache
maxElementsInMemory="100"
eternal="false"
timeToIdleSeconds="180"
timeToLiveSeconds="360"
overflowToDisk="false" />
<cache name="postCaches"
eternal="false"
maxElementsOnDisk="999"
maxElementsInMemory="50"
overflowToDisk="true"
timeToIdleSeconds="60"
timeToLiveSeconds="120"
memoryStoreEvictionPolicy="LRU"/>
<cache name="userCaches"
eternal="false"
maxElementsOnDisk="999"
maxElementsInMemory="50"
overflowToDisk="true"
timeToIdleSeconds="60"
timeToLiveSeconds="120"
memoryStoreEvictionPolicy="LRU"/>
</ehcache>
1、diskStore:磁盘缓存位置
2、maxElementsInMemory:缓存中允许创建的最大对象数,0代表无限个。
3、eternal:缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期。默认为false,如果为true表示永远有效,timeToIdleSeconds和timeToLiveSeconds就不生效。
3、timeToIdleSeconds:缓存数据的钝化时间,简而言之就是缓存中对象闲置时间。如果该值是 0 就意味着元素可以停顿无穷长的时间。这个值应当小于timeToLiveSeconds
4、timeToLiveSeconds:缓存数据的生存时间,即对象存活周期。如果该值是0就意味着元素可以停顿无穷长的时间。
5、overflowToDisk:内存不足时,是否启用磁盘缓存。
6、memoryStoreEvictionPolicy:缓存满了之后的淘汰算法。LRU和FIFO算法这里就不做介绍。LFU算法直接淘汰使用比较少的对象,在内存保留的都是一些经常访问的对象。对于大部分网站项目,该算法比较适用。
7、diskPersistent:是否持久化到磁盘,如果持久化到磁盘,重启的时候未过期的缓存对象还会加载回来,这里我们没用到,因为我们不需要持久化。
如果应用需要配置多个不同命名并采用不同参数的Cache,可以相应修改配置文件,增加需要的Cache配置即可。这里我们是有两个cache,name="postCaches"和name="userCaches"
2.JAVA代码使用方式
代码如下(示例):
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
public class Demo {
public static void main(String[] args) throws InterruptedException {
// 实例化一个CacheManager默认从类路径下加载ehcahe.xml,根据自己路径来取。
CacheManager cacheManager = CacheManager.create(“/ehcache.xml”);
// 获取postCaches
Cache cache = cacheManager.getCache("postCaches");
// 实例一个元素,
Element element = new Element("name", "test");
// 把这个元素放到postCaches
cache.put(element);
Element value = cache.get("name");
// 这个要注意,如果设置磁盘持久化,这个操作,会实时的将该缓存刷到磁盘,如果未设置,元素就刷没有了
//cache.flush();
cacheManager.shutdown();
}
}
这是使用类的方式获取echache配置文件,并使用echache的方式。
注解方式如下:
@Slf4j
@SpringBootApplication
@EnableCaching
public class BootApplication {
public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(BootApplication.class, args);
String serverPort = context.getEnvironment().getProperty("server.port");
log.info("mblog started at http://localhost:" + serverPort);
}
}
如果想用Ehcache缓存,在启动类上需要开启缓存机制:@EnableCaching,否则缓存会不起作用。
@Cacheable(value = CACHE_NAME_B, key = "'user_'+ #id")
@Override
public User selectByPrimaryKey(String id) {
return userDao.selectByPrimaryKey(id);
}
在我们使用的时候,在对应方法上加上注解。
三、总结:
ehcache 是一个非常轻量级的缓存实现,ehcache直接在jvm虚拟机中缓存,速度快,效率高;但是缓存共享麻烦,集群分布式应用不方便。如果是单个应用或者对缓存访问要求很高的应用,用ehcache。但如果是大型系统,存在缓存共享、分布式部署、缓存内容很大的,建议用redis。虽然ehcache也有缓存共享方案,但是它是通过RMI或者Jgroup多播方式进行广播缓存通知更新,缓存共享复杂,维护不方便;简单的共享可以,但是涉及到缓存恢复,大数据缓存,则不合适。
所以在不同场景使用不同的工具是提高开发效率的不二法则,这里我仅简单描述了使用方式,具体实现需要结合具体项目做对应的调整。请各位看官一起探讨一起再进行深入研究。