SpringBoot2 整合Ehcache组件,轻量级缓存管理的原理解析

作者:知了一笑 时间:2022-02-07 22:04:34 

本文源码:GitHub·点这里 || GitEE·点这里

一、Ehcache缓存简介

1、基础简介

EhCache是一个纯Java的进程内缓存框架,具有快速、上手简单等特点,是Hibernate中默认的缓存提供方。

2、Hibernate缓存

Hibernate * 缓存机制简介:

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

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

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

3、EhCache缓存特点

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

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

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

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

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

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

  • 提供Hibernate的缓存实现;

4、对比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://www.cnblogs.com/cicada-smile/p/13464061.html

标签:SpringBoot,Ehcache,组件
0
投稿

猜你喜欢

  • 如何用java程序(JSch)运行远程linux主机上的shell脚本

    2023-11-24 12:35:58
  • 解决maven没有打包xml文件的问题

    2023-11-27 14:51:01
  • Java8 Stream流的常用方法汇总

    2023-07-17 17:56:59
  • Java实现二叉搜索树的插入、删除功能

    2023-07-15 20:54:53
  • 浅谈C#六大设计原则

    2023-05-02 16:29:58
  • Java基于深度优先遍历的随机迷宫生成算法

    2022-06-01 22:18:50
  • 一篇文章带你玩转Spring bean的终极利器

    2022-08-20 10:47:33
  • 基于springboot的flowable工作流实战流程分析

    2022-11-28 08:27:09
  • java编译器和JVM的区别

    2023-07-18 20:34:48
  • Mybatis环境配置及测试详解

    2023-11-24 07:06:25
  • Java 将PPT幻灯片转为HTML文件的实现思路

    2022-12-12 12:00:35
  • Java基于ArrayList实现群主发红包功能

    2022-04-06 20:34:09
  • java 实现MD5加密算法的简单实例

    2023-07-19 21:53:56
  • 学生视角看Java 面向对象的继承本质

    2022-04-23 21:51:10
  • 举例详解用Java实现web分页功能的方法

    2021-07-27 10:50:19
  • SpringBoot整合Security安全框架实现控制权限

    2022-10-03 14:37:15
  • C#开发中常用的加密解密方法汇总

    2021-09-06 23:35:49
  • 在 Java 中将Object 转换为 Int的四种方法

    2023-05-05 21:37:30
  • Spring boot中filter类不能注入@Autowired变量问题

    2023-04-24 14:17:41
  • Java实现的计算最大下标距离算法示例

    2022-02-09 19:14:37
  • asp之家 软件编程 m.aspxhome.com