ehcache的使用备忘录

 

前言

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多播方式进行广播缓存通知更新,缓存共享复杂,维护不方便;简单的共享可以,但是涉及到缓存恢复,大数据缓存,则不合适。

所以在不同场景使用不同的工具是提高开发效率的不二法则,这里我仅简单描述了使用方式,具体实现需要结合具体项目做对应的调整。请各位看官一起探讨一起再进行深入研究。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无殇的无奈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值