基于SpringBoot项目搭建ehcache内置缓存

1、Ehcache使用介绍

Ehcache是用来管理缓存的一个工具,其缓存的数据可以是存放在内存里面的,也可以是存放在硬盘上的。其核心是CacheManager,一切Ehcache的应用都是从CacheManager开始的。它是用来管理Cache(缓存)的,一个应用可以有多个CacheManager,而一个CacheManager下又可以有多个Cache。Cache内部保存的是一个个的Element,而一个Element中保存的是一个key和value的配对,相当于Map里面的一个Entry。

2、Ehcache的主要特性

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

3、Ehcache缓存过期策略

当缓存需要被清理时(比如空间占用已经接近临界值了),需要使用某种淘汰算法来决定清理掉哪些数据。常用的淘汰算法有下面几种:
FIFO:First In First Out,先进先出。判断被存储的时间,离目前最远的数据优先被淘汰。
LRU:Least Recently Used,最近最少使用。判断最近被使用的时间,目前最远的数据优先被淘汰。
LFU:Least Frequently Used,最不经常使用。在一段时间内,数据被使用次数最少的,优先被淘汰。

4、ehcache 和 redis 比较

ehcache直接在jvm虚拟机中缓存,速度快,效率高;但是缓存共享麻烦,集群分布式应用不方便。

redis是通过socket访问到缓存服务,效率比ecache低,比数据库要快很多,
处理集群和分布式缓存方便,有成熟的方案。如果是单个应用或者对缓存访问要求很高的应用,用ehcache。如果是大型系统,存在缓存共享、分布式部署、缓存内容很大的,建议用redis。

5、代码演示

5.1、ehcache依赖

<dependency>
    <groupId>org.ehcache</groupId>
    <artifactId>ehcache</artifactId>
    <version>3.8.1</version>
</dependency>

5.2、SpringBoot配置文件

这里的配置文集是基于SpringBoot-2.2.0版本配置的。

#配置端口号
server:
  port: 8080
spring:
  datasource: #配置数据库相关信息
    url: jdbc:mysql://localhost:3306?useUnicode=true&characterEncoding=UTF-8
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456
    tomcat:
      test-while-idle: true
      test-on-borrow: true
      validation-query: select 1 from dual
      min-evictable-idle-time-millis: 1800000
      time-between-eviction-runs-millis: 300000
  cache: #配置JVM缓存,设置为ehcache, 并设置ehcache配置文件
    ehcache:
      config: classpath:ehcache_demo_01.xml 

5.3、ehcache配置文件

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
    <!-- 设置缓存磁盘存储位置 -->
    <diskStore path="java.io.tmpdir/ehcache-rmi-4000" />
    <!-- 默认缓存 -->
    <defaultCache maxElementsInMemory="1000" eternal="true"
                  timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true"
                  diskSpoolBufferSizeMB="30" maxElementsOnDisk="10000000"
                  diskPersistent="true" diskExpiryThreadIntervalSeconds="120"
                  memoryStoreEvictionPolicy="LRU">
    </defaultCache>
    <!-- 设置测试用缓存 -->
    <cache name="userCache" maxElementsInMemory="1000" eternal="false"
           timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true"
           diskSpoolBufferSizeMB="30" maxElementsOnDisk="10000000"
           diskPersistent="false" diskExpiryThreadIntervalSeconds="120"
           memoryStoreEvictionPolicy="LRU">
        <cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory" />
        <!-- 用于在初始化缓存,以及自动设置 -->
        <bootstrapCacheLoaderFactory class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory" />
    </cache>
</ehcache>

必填属性说说明:

1、name: Cache的名称,必须是唯一的(ehcache会把这个cache放到HashMap里)。
2、maxElementsInMemory:在内存中缓存的element的最大数目。
3、maxElementsOnDisk:在磁盘上缓存的element的最大数目,默认值为0,表示不限制。
4、eternal:设定缓存的elements是否永远不过期。如果为true,则缓存的数据始终有效,如果为false那么还要根据timeToIdleSeconds,timeToLiveSeconds判断。
5、overflowToDisk: 如果内存中数据超过内存限制,是否要缓存到磁盘上。

选填属性说明:

1、timeToIdleSeconds: 对象空闲时间,指对象在多长时间没有被访问就会失效。只对eternal为false的有效。默认值0,表示一直可以访问。
2、timeToLiveSeconds: 对象存活时间,指对象从创建到失效所需要的时间。只对eternal为false的有效。默认值0,表示一直可以访问。
3、diskPersistent: 是否在磁盘上持久化。指重启jvm后,数据是否有效。默认为false。
4、diskExpiryThreadIntervalSeconds: 对象检测线程运行时间间隔。标识对象状态的线程多长时间运行一次。
5、diskSpoolBufferSizeMB: DiskStore使用的磁盘大小,默认值30MB。每个cache使用各自的DiskStore。
6、memoryStoreEvictionPolicy: 如果内存中数据超过内存限制,向磁盘缓存时的策略。默认值LRU,可选FIFO、LFU。

5.4、Spring注解使用

第一步:首先在SpringBoot启动类上加上注解

@EnableCaching:表示开启JVM内存

例:

SrpingBoot启动类

第二步:在Dao层的类名上加上注解

@CacheConfig(cacheNames = “userCache”) :表示创建缓存配置
@Cacheable :表示加了该注解的方法可以缓存

例:

注解

5.5、最后说明

这样搭建就成功了,调用方式还是按照往常的调用方式,就可以做最简单的测试了。
这里还没有写到如何更新缓存、使用缓存、删除缓存等,只是讲解了如何在SpringBoot内置缓存。


版权声明:本文为gfk3009原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。