SpringBoot2整合Ehcache组件实现轻量级缓存管理

作者:知了一笑 时间:2022-06-18 18:11:16 

目录
  • 一、Ehcache缓存简介

    • Hibernate缓存

    • EhCache缓存特点

    • 对比Redis缓存

  • 二、集成SpringBoot框架

    • 1、核心依赖

    • 2、加载配置

    • 3、配置详解

  • 三、注解用法

    • 四、源代码地址

      一、Ehcache缓存简介

      Hibernate缓存

      Hibernate * 缓存机制简介:

      一级缓存:基于Session级别分配一块缓存空间,缓存访问的对象信息。Session关闭后会自动清除缓存。

      二级缓存:是SessionFactory对象缓存,可以被创建出的多个 Session 对象共享,二级缓存默认是关闭的,如果要使用需要手动开启,并且依赖EhCache组件。

      * 缓存:查询缓存,配置开启该缓存的情况下,重复使用一个sql查询某个范围内的数据,会进行缓存。

      EhCache缓存特点

      • 快速,简单,并且提供多种缓存策略;

      • 缓存数据有两级:内存和磁盘,无需担心容量问题;

      • 缓存数据会在虚拟机重启的过程中写入磁盘;

      • 可以通过RMI、可插入API等方式进行分布式缓存;

      • 具有缓存和缓存管理器的侦听接口;

      • 支持多缓存管理器实例,以及一个实例的多个缓存区域;

      • 提供Hibernate的缓存实现;

      对比Redis缓存

      Ehcache:直接在Jvm虚拟机中缓存,速度快,效率高,不适合处理大规模缓存数据,在分布式环境下,缓存数据共享操作复杂;

      Redis:作为独立的缓存中间件,在分布式缓存系统中非常好用,缓存数据共享,有效支撑大量数据缓存,支持哨兵模式,或者集群模式的高可用成熟方案;

      二、集成SpringBoot框架

      1、核心依赖


      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-cache</artifactId>
      </dependency>
      <dependency>
          <groupId>net.sf.ehcache</groupId>
          <artifactId>ehcache</artifactId>
      </dependency>

      2、加载配置

      基础配置


      spring:
        cache:
          ehcache:
            config: classpath:ehcache.xml

      启动类注解


      @EnableCaching
      @SpringBootApplication
      public class Application {
          public static void main(String[] args) {
              SpringApplication.run(Application.class,args) ;
          }
      }

      3、配置详解


      <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">

          <!-- 操作系统缓存的临时目录,内存满后写入该目录 -->
          <diskStore path="java.io.tmpdir"/>

          <defaultCache
                  maxElementsInMemory="1000"
                  eternal="false"
                  timeToIdleSeconds="120"
                  timeToLiveSeconds="120"
                  maxElementsOnDisk="10000000"
                  diskExpiryThreadIntervalSeconds="120"
                  memoryStoreEvictionPolicy="LRU">
              <persistence strategy="localTempSwap"/>
          </defaultCache>

          <cache name="userEntity"
                 maxElementsInMemory="1000"
                 eternal="false"
                 timeToIdleSeconds="120"
                 timeToLiveSeconds="120"
                 maxElementsOnDisk="10000000"
                 diskExpiryThreadIntervalSeconds="120"
                 memoryStoreEvictionPolicy="LRU">
              <persistence strategy="localTempSwap"/>
          </cache>
      </ehcache>

      配置参数说明

      • maxElementsOnDisk:磁盘缓存中最多可以存放的元素数量;

      • eternal:缓存中对象是否永久有效;

      • timeToIdleSeconds:当eternal=false时使用,缓存数据有效期(单位:秒),时间段内没有访问该元素,将被清除;

      • timeToLiveSeconds:缓存数据的存活时间;

      • maxElementsInMemory:内存中最多可以存放的元素数量,overflowToDisk=true,则会将Cache中多出的元素放入磁盘文件中,若overflowToDisk=false,则根据memoryStoreEvictionPolicy策略替换Cache中原有的元素;

      • diskExpiryThreadIntervalSeconds:磁盘缓存的清理线程运行间隔;

      • memoryStoreEvictionPolicy:缓存释放策略,LRU会优先清理最少使用的缓存;

      • localTempSwap:持久化策略,当堆内存或者非堆内存里面的元素已经满了的时候,将其中的元素临时的存放在磁盘上,重启后就会消失;

      三、注解用法


      @Service
      public class CacheService {

          private static final Logger LOGGER = LoggerFactory.getLogger(CacheService.class);

          @Resource
          private UserMapper userMapper ;

          @Cacheable(value="userEntity")  // 在缓存有效期内,首次查询才访问数据库
          public UserEntity getById (Integer id){
              // 通过日志,标识方法是否执行
              LOGGER.info("getById..."+id);
              return userMapper.selectById(id) ;
          }

          @CacheEvict(value="userEntity",key = "#id") //该ID数据更新,清空该ID缓存
          public void updateUser(Integer id) {
              UserEntity user = new UserEntity() ;
              user.setId(id);
              user.setUserName("myCache");
              userMapper.updateById(user);
          }
      }

      @Cacheable:注解标记在一个方法上,也可以标记在一个类上,标记在一个方法上表示该方法支持缓存,该方法被调用后将其返回值缓存起来,下次同样的请求参数执行该方法时可以直接从缓存中获取结果,而不需要再次执行该方法。

      @CacheEvict:注解标记在需要清除缓存元素的方法或类上的,当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作,并且可以按照指定属性清除。

      四、源代码地址

      GitHub·地址
      https://github.com/cicadasmile/middle-ware-parent
      GitEE·地址
      https://gitee.com/cicadasmile/middle-ware-parent

      来源:https://mp.weixin.qq.com/s/4DxEMZURjRyszzCuhI9SGw

      标签:SpringBoot,Ehcache,轻量级缓存管理
      0
      投稿

      猜你喜欢

    • JFreeChart插件实现的折线图效果实例

      2023-09-21 02:20:03
    • 基于Java随机生成手机短信验证码的实例代码

      2023-12-22 02:50:49
    • mybatis-plus 如何判断参数是否为空并作为查询条件

      2022-09-14 22:05:03
    • intellij idea使用git stash暂存一次提交的操作

      2023-03-08 08:30:11
    • 线程池中使用spring aop事务增强

      2021-08-06 06:37:19
    • kafka并发写大消息异常TimeoutException排查记录

      2023-11-27 23:07:11
    • 关于springboot集成阿里云短信的问题

      2023-08-23 09:46:15
    • Java实战之基于swing的QQ邮件收发功能实现

      2023-11-15 01:34:26
    • 使用javaMail实现发送邮件

      2023-01-20 21:22:26
    • SpringBoot获取配置文件内容的几种方式总结

      2023-11-24 18:10:48
    • Mybatis结果生成键值对的实例代码

      2023-11-28 15:50:58
    • 基于java集合中的一些易混淆的知识点(详解)

      2023-08-29 03:06:26
    • 老生常谈java中cookie的使用

      2023-11-11 04:37:59
    • 深度解析Java中ArrayList的使用

      2023-06-16 23:26:01
    • SpringDataJpa如何使用union多表分页条件查询

      2023-05-16 04:28:49
    • 合并有序数组的实现(java与C语言)

      2023-08-16 13:45:40
    • Java简单计时的实现案例(可以用来限时循环)

      2023-02-01 21:39:19
    • Spring Boot thymeleaf模板引擎的使用详解

      2022-07-27 07:42:54
    • Java如何实现http接口参数和返回值加密

      2023-08-23 12:28:37
    • 聊一聊SpringBoot服务监控机制

      2023-02-09 02:47:48
    • asp之家 软件编程 m.aspxhome.com