本文源码: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

推荐阅读:SpringBoot进阶系列

序号 文章标题
01 Boot2 整合 shard-jdbc 中间件,实现数据分库分表
02 Boot2 整合 JavaMail ,实现异步发送邮件功能
03 Boot2 整合 RocketMQ ,实现请求异步处理
04 Boot2 整合 Swagger2 ,构建接口管理界面
05 Boot2 整合 QuartJob ,实现定时器实时管理
06 Boot2 整合 Redis集群 ,实现消息队列场景
07 Boot2 整合 Dubbo框架 ,实现RPC服务远程调用
08 Boot2 整合 ElasticSearch框架,实现高性能搜索引擎
09 Boot2 整合 JWT 框架,解决Token跨域验证问题
10 Boot2 整合 FastDFS 中间件,实现文件分布管理
11 Boot2 整合 Shiro 框架,实现用户权限管理
12 Boot2 整合 Security 框架,实现用户权限管理
13 Boot2 整合 ClickHouse数据库,实现数据高性能查询分析
14 Boot2 整合 Drools规则引擎,实现高效的业务规则
15 Boot2 整合 多数据源,配置MybatisPlus增强插件
16 Boot2 整合 Zookeeper组件,管理架构中服务协调
17 Boot2 整合Nacos组件,环境搭建和入门案例详解
18 文件系统(01):基于Boot2框架,管理Excel和PDF
18 文件系统(02):基于Boot2框架,管理Xml和CSV
19 Boot2 整合 Kafka组件,应用案例和流程详解
20 Boot2 整合 ElasticJob框架,定制化管理流程
21 Boot2 整合JTA组件,多数据源事务管理
22 Boot2 整合FreeMarker模板,完成页面静态化处理
23 Boot2 整合MinIO中间件,实现文件便捷管理

SpringBoot2 整合Ehcache组件,轻量级缓存管理的更多相关文章

  1. SpringBoot2 整合JTA组件,多数据源事务管理

    本文源码:GitHub·点这里 || GitEE·点这里 一.JTA组件简介 1.JTA基本概念 JTA即Java-Transaction-API,JTA允许应用程序执行分布式事务处理,即在两个或多个 ...

  2. SpringBoot2 整合Kafka组件,应用案例和流程详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.搭建Kafka环境 1.下载解压 -- 下载 wget http://mirror.bit.edu.cn/apache/kafka/2.2 ...

  3. mybatis中二级缓存整合ehcache实现分布式缓存

    mybatis自带二级缓存,但是这个缓存是单服务器工作,无法实现分布式缓存.那么什么是分布式缓存呢?假设现在有两个服务器1和2,用户访问的时候访问了1服务器,查询后的缓存就会放在1服务器上,假设现在有 ...

  4. SpringBoot2 整合 Zookeeper组件,管理架构中服务协调

    本文源码:GitHub·点这里 || GitEE·点这里 一.Zookeeper基础简介 1.概念简介 Zookeeper是一个Apache开源的分布式的应用,为系统架构提供协调服务.从设计模式角度来 ...

  5. SpringBoot2 整合Nacos组件,环境搭建和入门案例详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.Nacos基础简介 1.概念简介 Nacos 是构建以"服务"为中心的现代应用架构,如微服务范式.云原生范式等服务基础 ...

  6. SpringBoot2 整合OAuth2组件,模拟第三方授权访问

    本文源码:GitHub·点这里 || GitEE·点这里 一.模式描述 授权服务 验证第三方服务的身份,验证邮箱用户的身份,记录和管理认证Token,为资源服务器提供Token校验.场景:第三方网站借 ...

  7. SpringBoot缓存管理(二) 整合Redis缓存实现

    SpringBoot支持的缓存组件 在SpringBoot中,数据的缓存管理存储依赖于Spring框架中cache相关的org.springframework.cache.Cache和org.spri ...

  8. 以Spring整合EhCache为例从根本上了解Spring缓存这件事(转)

    前两节"Spring缓存抽象"和"基于注解驱动的缓存"是为了更加清晰的了解Spring缓存机制,整合任何一个缓存实现或者叫缓存供应商都应该了解并清楚前两节,如果 ...

  9. Spring自定义缓存管理及配置Ehcache缓存

    spring自带缓存.自建缓存管理器等都可解决项目部分性能问题.结合Ehcache后性能更优,使用也比较简单. 在进行Ehcache学习之前,最好对Spring自带的缓存管理有一个总体的认识. 这篇文 ...

随机推荐

  1. C#-CLR note - 26线程

    开篇 async/wait的使用 static async Task Main(string[] args) { Console.WriteLine("start-- "); va ...

  2. md5加密密码

    using System.Security.Cryptography; public string GetStrMd5(string ConvertString) { MD5CryptoService ...

  3. 深入浅出ReentrantLock源码解析

    ReentrantLock不但是可重入锁,而且还是公平或非公平锁,在工作中会经常使用到,将自己对这两种锁的理解记录下来,希望对大家有帮助. 前提条件 在理解ReentrantLock时需要具备一些基本 ...

  4. 3.TCP协议

    一.TCP协议特点和报文段格式 面向连接的传输层协议 每一条TCP连接只能有两个端点 TCP提供可靠交付的服务,无差错,不丢失,不重复,按序到达 全双工通信 -> 发送缓冲:准备发送的数据&am ...

  5. IDEA添加注释常用的快捷键

    1.行注释Ctrl+/ 2.块注释Ctrl+Shift+/ 3.生成类注释 输入/**,然后按回车 (idea上没有生成类注释快捷键的,可以看这里 :idea生成类注释和方法注释的正确方法 ) 4.生 ...

  6. 题解 洛谷 P5465 【[PKUSC2018]星际穿越】

    首先考虑题目的性质,发现点向区间连的边为双向边,所以也就可以从一个点向右跳到区间包含该点的点,如图所示: 但事实上向后跳其实是不优的,可以有更好的方法来节省花费: 因此我们发现一个点跳到其前一个区间的 ...

  7. grpc 之 word2pdf使用

    ​ 做一个word转pdf的服务,采用grpc,使用libreoffice命令. 1.构建libreoffice镜像 FROM python:3.6 ENV TZ=Asia/Shanghai RUN ...

  8. maven项目打包到本地库 两种方式

    方式一 1.项目根路径下 maven clean package 或者 maven package ,根据是否需要跳过代码中的测试代码 加上 -DskipTests 2.mvn install:ins ...

  9. 详解 awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}每个字段的意思

    用这个列子说好了如果NF代表字段 那最后应该是7 才对啊 还有最后怎么都是1呢?END前面的是查看并发吧 后面是查看 tcp连接数 是这样吗?       awk下标采用字符串来表示可能你在其它语言见 ...

  10. 【laravel】用户认证之----手动认证用户

    模型 如果某个模型类需要用于认证,必须继承自 Illuminate\Foundation\Auth\User 基类,否则会报错.然后在这个模型类中使用 Notifiable Trait,里面提供了用户 ...