本都缓存能做什么?

  • 数据缓存在jvm中,大幅提升性能

为什么要用本地缓存?

  • 相对于IO操作,速度快,效率高
  • 相对于Redis,Redis是一种优秀的分布式缓存实现,受限于网卡等原因,远水救不了近火

本地缓存的缺点?

  • 节点重启、缓存丢失
  • 无法大量存储,受限于jvm
  • 集群多节点缓存不一致问题

什么时候使用?

  • 相同的结果被大量访问
  • 愿意消耗一些内存空间来提升速度
  • 缓存中存放的数据总量不会超出内存容量

主流缓存对比

SpringBoot中使用Ehcache的详细教程

EhCache 是一个纯 Java 的进程内缓存框架,具有快速、精干等特点,是 Hibernate 中默认的 CacheProvider。用惯了 Redis,很多人可能已经忘记了还有 EhCache 这么一个缓存框架

一、简介

EhCache 是一个纯 Java 的进程内缓存框架,具有快速、精干等特点,是 Hibernate 中默认CacheProvider。Ehcache 是一种广泛使用的开源 Java 分布式缓存。主要面向通用缓存,Java EE 和轻量级容器。它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个 gzip 缓存 servlet 过滤器,支持 REST 和 SOAP api 等特点。

特性

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

与 Redis 相比

  • EhCache 直接在jvm虚拟机中缓存,速度快,效率高;但是缓存共享麻烦,集群分布式应用不方便。
  • Redis 是通过 Socket 访问到缓存服务,效率比 EhCache 低,比数据库要快很多,处理集群和分布式缓存方便,有成熟的方案。如果是单个应用或者对缓存访问要求很高的应用,用 EhCache 。如果是大型系统,存在缓存共享、分布式部署、缓存内容很大的,建议用 Redis。
  • EhCache 也有缓存共享方案,不过是通过 RMI 或者 Jgroup 多播方式进行广播缓存通知更新,缓存共享复杂,维护不方便;简单的共享可以,但是涉及到缓存恢复,大数据缓存,则不合适。

二、引入 EhCache

1、引入依赖

在 pom.xml 文件中,引入 Ehcache 的依赖信息

<!-- ehcache依赖 -->
<dependency><groupId>net.sf.ehcache</groupId><artifactId>ehcache</artifactId><version>2.10.6</version>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency>

2、配置文件

创建 EhCache 的配置文件:ehcache.xml

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"><!--磁盘存储:将缓存中暂时不使用的对象,转移到硬盘,类似于Windows系统的虚拟内存path:指定在硬盘上存储对象的路径path可以配置的目录有:user.home(用户的家目录)user.dir(用户当前的工作目录)java.io.tmpdir(默认的临时目录)ehcache.disk.store.dir(ehcache的配置目录)绝对路径(如:d:\\ehcache)查看路径方法:String tmpDir = System.getProperty("java.io.tmpdir");--><diskStore path="java.io.tmpdir" /><!--defaultCache:默认的缓存配置信息,如果不加特殊说明,则所有对象按照此配置项处理maxElementsInMemory:设置了缓存的上限,最多存储多少个记录对象eternal:代表对象是否永不过期 (指定true则下面两项配置需为0无限期)timeToIdleSeconds:最大的发呆时间 /秒timeToLiveSeconds:最大的存活时间 /秒overflowToDisk:是否允许对象被写入到磁盘说明:下列配置自缓存建立起600秒(10分钟)有效 。在有效的600秒(10分钟)内,如果连续120秒(2分钟)未访问缓存,则缓存失效。就算有访问,也只会存活600秒。--><defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="600"timeToLiveSeconds="600" overflowToDisk="true" /><!--maxElementsInMemory,内存缓存中最多可以存放的元素数量,若放入Cache中的元素超过这个数值,则有以下两种情况1)若overflowToDisk=true,则会将Cache中多出的元素放入磁盘文件中2)若overflowToDisk=false,则根据memoryStoreEvictionPolicy策略替换Cache中原有的元素eternal,   缓存中对象是否永久有效timeToIdleSeconds, 缓存数据在失效前的允许闲置时间(单位:秒),仅当eternal=false时使用,默认值是0表示可闲置时间无穷大,若超过这个时间没有访问此Cache中的某个元素,那么此元素将被从Cache中清除timeToLiveSeconds, 缓存数据的总的存活时间(单位:秒),仅当eternal=false时使用,从创建开始计时,失效结束maxElementsOnDisk, 磁盘缓存中最多可以存放的元素数量,0表示无穷大overflowToDisk,  内存不足时,是否启用磁盘缓存diskExpiryThreadIntervalSeconds, 磁盘缓存的清理线程运行间隔,默认是120秒memoryStoreEvictionPolicy, 内存存储与释放策略,即达到maxElementsInMemory限制时,Ehcache会根据指定策略清理内存 共有三种策略,分别为LRU(最近最少使用)、LFU(最常用的)、FIFO(先进先出)--><cache name="user" maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" maxElementsOnDisk="10000000" overflowToDisk="true" memoryStoreEvictionPolicy="LRU" /></ehcache>

常用的memoryStoreEvictionPolicy(缓存算法)
关于常用的缓存算法主要有三种:

LRU:(Least Rencently Used)新来的对象替换掉使用时间算最近很少使用的对象。
LFU:(Least Frequently Used)替换掉按命中率高低算比较低的对象。
FIFO: (First In First Out)把最早进入二级缓存的对象替换掉。

<cache name="user"></cache>,我们是可以配置多个来解决我们不同业务处所需要的缓存策略的

默认情况下,EhCache 的配置文件名是固定的,ehcache.xml,如果需要更改文件名,需要在 application.yml 文件中指定配置文件位置,如:

spring:cache:type: ehcacheehcache:config: classpath:/ehcache.xml

指定了 EhCache 的配置文件位置

3、开启缓存

开启缓存的方式,也和 Redis 中一样,在启动类上添加 @EnableCaching 注解即可:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@SpringBootApplication
@EnableCaching
public class SbmApplication {public static void main(String[] args) {SpringApplication.run(SbmApplication.class, args);}
}

三、开始使用

1、@CacheConfig

这个注解在类上使用,用来描述该类中所有方法使用的缓存名称,当然也可以不使用该注解,直接在具体的缓存注解上配置名称,示例代码如下:

@Service
@CacheConfig(cacheNames = "user")
public class UserServiceImpl implements UserService {}

2、@Cacheable

这个注解一般加在查询方法上,表示将一个方法的返回值缓存起来,默认情况下,缓存的 key 就是方法的参数,缓存的 value 就是方法的返回值。示例代码如下:

@Override
@Cacheable(value = "user", key = "#id")
public User getUserById(Long id) {return userMapper.getUserById(id);
}

如果在类上没有加入 @CacheConfig,我们则需要使用 value 来指定缓存名称
这里如果需要多个 key 时,需要使用 “:” 来连接,如:

@Cacheable(value = "user", key = "#name+':'+#phone")

3、@CachePut

这个注解一般加在更新方法上,当数据库中的数据更新后,缓存中的数据也要跟着更新,使用该注解,可以将方法的返回值自动更新到已经存在的 key 上,示例代码如下:

@Override
@CachePut(value = "user", key = "#id")
public User updateUserById(User user) {return userMapper.updateUserById(user);
}

4、@CacheEvict

这个注解一般加在删除方法上,当数据库中的数据删除后,相关的缓存数据也要自动清除,该注解在使用的时候也可以配置按照某种条件删除( condition 属性)或者或者配置清除所有缓存( allEntries 属性),示例代码如下:

@Override
@CacheEvict(value = "user", key = "#id")
public void deleteUserById(Long id) {userMapper.deleteUserById(id);
}

四、总结

SpringBoot 中使用 Ehcache 比较简单,只需要简单配置,说白了还是 Spring Cache 的用法,合理使用缓存机制,可以很好地提高项目的响应速度。

SpringBoot 使用 Caffeine 本地缓存

https://blog.csdn.net/xiyang_1990/article/details/120004227

SpringBoot中使用Ehcache的详细教程相关推荐

  1. 【SpringBoot】在SpringBoot中使用Ehcache

    SpringBoot提供了对缓存的支持,通过在启动类中添加@EnableCaching注解自动化配置合适的缓存管理器(CacheManager),Spring Boot根据下面的顺序去侦测缓存提供者: ...

  2. SpringBoot+vue3对接支付宝支付详细教程

    SpringBoot+vue3对接支付宝支付详细教程 本人也是第一次做这个,是一个刚刚学习自学支付的萌新,目的是在于学习,只是为了记录自己的学习过程,怕以后会忘记,因为我没有企业账号,所以用的是自己的 ...

  3. 在MATLAB中手动安装MinGW64详细教程

    在MATLAB中手动安装MinGW64详细教程 话题背景 针对MATLAB官方License限制附件安装的问题,可以尝试线下手动自行安装 部分版本的Matlab由于License到期问题或者破解版限制 ...

  4. 【SpringBoot】27、SpringBoot中整合Ehcache实现热点数据缓存

    EhCache 是一个纯 Java 的进程内缓存框架,具有快速.精干等特点,是 Hibernate 中默认的 CacheProvider.用惯了 Redis,很多人可能已经忘记了还有 EhCache ...

  5. Python中安装PyOpenGL:详细教程

    Python中安装PyOpenGL:详细教程 如果你对Python编程有一定的了解,并且在计算机图形学领域有所涉猎,你可能会使用到PyOpenGL.PyOpenGL是Python的一个OpenGL绑定 ...

  6. 在matlab中导入excel,Matlab导入Excel文件中的数据的详细教程分享

    操作Matlab时还不会导入Excel文件中的数据?本文就介绍了Matlab导入Excel文件中的数据的操作内容,想要学习的朋友可以看一看下文哦,相信对大家会有所帮助的. 直接点击鼠标操作导入数据 打 ...

  7. 在Scrapy中如何利用Xpath选择器从网页中采集目标数据——详细教程(下篇)

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 二十四桥明月夜, 玉人何处教吹箫. ...

  8. Linux中虚拟机的安装详细教程

    Linux中虚拟机的安装详细教程 1 linux中虚拟机的安装 1.1 kvm安装条件 1.2 KVM虚拟化安装 1.3 KVM虚拟化相关信息 1.4 手动安装虚拟机步骤 1.5 脚本安装虚拟机 2 ...

  9. Windows中安装配置Maven详细教程

    前言 我们现在进行Java项目开发时,项目中一般都会有依赖包的存在,而这些依赖包一般都是利用Maven进行下载管理的.但很多小伙伴还不知道Maven怎么安装配置,所以壹哥专门编写一篇详细教程,教会大家 ...

最新文章

  1. 解决softmax后列和不为1的bug记录 :问题原因为 s为1维的,来除torch.exp(x)(64x10)时候,维数不对应,需要将s也要转换为2维的即维数为(64x1),才可以广播按行对应相除
  2. java上机练习01
  3. java选中一格_java-选中排序(新手)
  4. 忘记mysql数据库密码时进行修改方法
  5. java 看书浏览器官_JAVA读取文件流,设置浏览器下载或直接预览操作
  6. SDUT 1149 勾股定理第一弹 勾股数
  7. 最短路算法(3种算法)
  8. 设计FMEA步骤四:失效分析
  9. 湖南任务书 数据库服务渗透测试
  10. 域名显示服务器错误,域名解析出现错误是怎么回事?
  11. linux中竖线'|',双竖线‘||’,和的意思
  12. java中long最大值源码表示_通过JDK源码角度分析Long类详解
  13. 生物基础知识---CDS,基因,Matlab生物信息工具箱
  14. 【观察】揭开资产深海的隐秘角落,魔方安全的重构创新
  15. jack server无法启动
  16. 苹果新Apple TV出现Bug如何解决?
  17. sd卡--1--驱动
  18. 15篇大数据精品文章大合集
  19. 教师计算机网络知识培训内容,教师计算机培训总结范文
  20. PyQt5之QGraphics 008 QGraphicsItem四连杆机构动画

热门文章

  1. 中国智能互联炊具行业市场供需与战略研究报告
  2. 【思考】我为钱工作 OR 钱为我工作?
  3. linux文件做软连接,Linux建立软连接和硬链接
  4. 论文笔记:ESWC 2018 Modeling Relational Data with Graph Convolutional Networks
  5. 买电脑不要被骗了:最全的买笔记本…
  6. java中validate_validate的使用
  7. 面向对象编程案例—贪吃蛇小游戏
  8. ASP.NET CodeBehind
  9. Exception与RuntimeException
  10. 洛谷 P8552 Rabbit