什么是EhCache 缓存

简介: 什么是EhCache 缓存

EhCache 缓存-提高检索效率的利器


缓存-官方文档


文档地址: https://mybatis.org/mybatis-3/zh/sqlmap-xml.html#cache


EhCache 缓存


配置文档: https://www.cnblogs.com/zqyanywn/p/10861103.html


基本介绍


  1. EhCache 是一个纯Java 的缓存框架,具有快速、精干等特点。
  2. MyBatis 有自己默认的二级缓存(前面我们已经使用过了),但是在实际项目中,往往使用的是更加专业的第三方缓存产品作为MyBatis 的二级缓存,EhCache 就是非常优秀的缓存产品。

473a828e64d4497384367f8c1982b975.png


配置和使用EhCache


  1. 加入相关依赖, 修改pom.xml
<dependencies>
        <!--引入ehcache核心库/jar-->
        <dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache-core</artifactId>
            <version>2.6.11</version>
        </dependency>
        <!--引入需要使用的slf4j-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>
        <!--引入mybatis整合ehcache库/jar-->
        <dependency>
            <groupId>org.mybatis.caches</groupId>
            <artifactId>mybatis-ehcache</artifactId>
            <version>1.2.1</version>
        </dependency>
 </dependencies>


  1. mybatis-config.xml 仍然打开二级缓存
<settings>
<!-- 开启二级缓存,默认就是打开-->
<setting name="cacheEnabled" value="true"/>
</settings>


  1. 加入src\main\resources\ehcache.xml 配置文件
    文档说明: https://www.taobye.com/f/view-11-23.html
<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
    <!--
       diskStore:为缓存路径,ehcache分为内存和磁盘两级,此属性定义磁盘的缓存位置。参数解释如下:
       user.home – 用户主目录
       user.dir  – 用户当前工作目录
       java.io.tmpdir – 默认临时文件路径
     -->
    <diskStore path="java.io.tmpdir/Tmp_EhCache"/>
    <!--
       defaultCache:默认缓存策略,当ehcache找不到定义的缓存时,则使用这个缓存策略。只能定义一个。
     -->
    <!--
      name:缓存名称。
      maxElementsInMemory:缓存最大数目
      maxElementsOnDisk:硬盘最大缓存个数。
      eternal:对象是否永久有效,一但设置了,timeout将不起作用。
      overflowToDisk:是否保存到磁盘,当系统宕机时
      timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
      timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。
      diskPersistent:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
      diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
      diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
      memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。
      clearOnFlush:内存数量最大时是否清除。
      memoryStoreEvictionPolicy:可选策略(清除策略)有:LRU(最近最少使用,默认策略)、FIFO(先进先出)、LFU(最少访问次数)。
      FIFO,first in first out,这个是大家最熟的,先进先出。
      LFU, Less Frequently Used,就是上面例子中使用的策略,直白一点就是讲一直以来最少被使用的。如上面所讲,缓存的元素有一个hit属性,hit值最小的将会被清出缓存。
      LRU,Least Recently Used,最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。
   -->
    <defaultCache
            eternal="false"
            maxElementsInMemory="10000"
            overflowToDisk="false"
            diskPersistent="false"
            timeToIdleSeconds="1800"
            timeToLiveSeconds="259200"
            memoryStoreEvictionPolicy="LRU"/>
</ehcache>


在XxxMapper.xml 映射文件启用EhCache , 当然原来MyBatis 自带的缓存配置就注销了

    <!--配置/启用ehcache-->
    <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>


修改MonsterMapperTest.java , 增加测试方法, 完成测试。

测试ehCache缓存使用效果

    @Test
    public void ehCacheTest() {
        //查询id=3的monster
        Monster monster = monsterMapper.getMonsterById(3);
        //会发出SQL, 到db查询
        System.out.println("monster=" + monster);
        //这里关闭sqlSession, 一级缓存[数据]失效.=> 将数据放入到二级缓存 (ehcache)
        if (sqlSession != null) {
            sqlSession.close();
        }
        //重新获取sqlSession
        sqlSession = MyBatisUtils.getSqlSession();
        //重新获取了monsterMapper
        monsterMapper = sqlSession.getMapper(MonsterMapper.class);
        //再次查询id=3的monster
        System.out.println("--虽然前面关闭了sqlSession,因为配置二级缓存(ehcache), " +
                "当你再次查询相同的id时, 不会再发出sql, 而是从二级缓存(ehcache)获取数据----");
        Monster monster2 = monsterMapper.getMonsterById(3);
        System.out.println("monster2=" + monster2);
        //再次查询id=3的monster, 仍然到二级缓存(ehcache), 获取数据, 不会发出sql
        Monster monster3 = monsterMapper.getMonsterById(3);
        System.out.println("monster3=" + monster3);
        if (sqlSession != null) {
            sqlSession.close();
        }
    }


EhCache 缓存-细节说明


如何理解EhCache 和MyBatis 缓存的关系

  1. 1.MyBatis 提供了一个接口Cache【如下图,找到org.apache.ibatis.cache.Cache ,关联源码包就可以看到Cache 接口】。


image.png

2.只要实现了该Cache 接口,就可以作为二级缓存产品和MyBatis 整合使用,Ehcache 就是实现了该接口。


3.MyBatis 默认情况(即一级缓存)是使用的PerpetualCache 类实现Cache 接口的,是核心类。


4.当我们使用了Ehcahce 后,就是EhcacheCache 类实现Cache 接口的,是核心类。


image.png

5. 我们看一下源码,发现缓存的本质就是Map<Object,Object>。


5f999ac077d74c4eb50f2d28d9178d2f.png

相关文章
|
6月前
|
存储 缓存 监控
SpringBoot配置第三方专业缓存技术Ehcache
SpringBoot配置第三方专业缓存技术Ehcache
54 1
|
6月前
|
缓存 监控 负载均衡
Java一分钟之-Ehcache:分布式缓存系统
【6月更文挑战第17天】**Ehcache是Java的开源缓存库,支持本地和分布式缓存,提供负载均衡、数据复制和容错能力。常见问题包括网络分区导致的数据不一致、缓存雪崩和配置不当引起的性能瓶颈。解决策略涉及选择强一致性策略、设置合理缓存过期时间和监控调整配置。使用Ehcache需添加相关依赖,并配置分布式缓存,如示例所示,通过CacheManager创建和管理缓存。实践中,持续监控和优化配置至关重要。**
154 1
|
6月前
|
缓存 Java
修改缓存供应商--EhCache
修改缓存供应商--EhCache
|
缓存 NoSQL Java
分布式系列教程(01) -Ehcache缓存架构
分布式系列教程(01) -Ehcache缓存架构
322 0
|
7月前
|
SQL 缓存 Java
Hibernate - 整合Ehcache二级缓存使用详解
Hibernate - 整合Ehcache二级缓存使用详解
78 0
|
存储 缓存 NoSQL
EhCache缓存
在查询数据的时候,数据大多来自数据库,通常会基于SQL语句的方式与数据库交互,数据库一般会基于本地磁盘IO的形式将数据读取到内存,返回给Java服务端,Java服务端再将数据响应给客户端,做数据展示。
213 0
|
缓存 NoSQL Java
SpringBoot-26-缓存Ehcache的使用
spring缓存(cache)是在Spring3.1开始引入的,但是其本身只提供了缓存接口,不提供具体缓存的实现,其实现需要第三方缓存实现(Generic、EhCache、Redis等)。EhCache、Redis比较常用,使用Redis的时候需要先安装Redis服务器。
106 0
|
XML 缓存 Java
|
存储 缓存 NoSQL
Java Cache 缓存方案详解及代码-Ehcache
Java Cache 缓存方案详解及代码-Ehcache
615 0
|
6天前
|
存储 缓存 NoSQL
解决Redis缓存数据类型丢失问题
解决Redis缓存数据类型丢失问题
121 85