一文玩转 EhCache 缓存框架!


Ehcache 介绍

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

主要特性:

  • 快速,简单

  • 多种缓存策略

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

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

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

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

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

  • 提供Hibernate的缓存实现

Show me the code

在 pom.xml 文件中添加 Ehcache 依赖

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

不需要配置version,SpringBoot的根pom已经对版本号做了统一声明!

配置文件:

在配置文件 application.yaml 中配置 ehcache 的相关参数,具体内容如下:

spring:application:name: spring-boot-bulking-ehcachecache:type: ehcacheehcache:config: classpath:/ehcache.xml

spring.cache.type 声明spring框架使用哪一种类型的缓存,因为spring框架提供了多种缓存可供选择。

添加 Ehcache 配置:

src/main/resources 目录下,创建配置文件ehcache.xml ,内容如下:

<ehcache name="test"><diskStore path="java.io.tmpdir"/><defaultCachemaxEntriesLocalHeap="1000"eternal="false"timeToIdleSeconds="300"timeToLiveSeconds="600"overflowToDisk="true"memoryStoreEvictionPolicy="LRU"></defaultCache><cache name="userCache"maxEntriesLocalHeap="200"eternal="false"timeToIdleSeconds="300"timeToLiveSeconds="600"overflowToDisk="true"></cache>
</ehcache>

参数含义:

  • diskStore:磁盘缓存位置

  • name:缓存名称

  • maxElementsInMemory:内存中最大缓存对象数

  • maxElementsOnDisk:硬盘中最大缓存对象数,若是0表示无穷大

  • eternal:true表示对象永不过期,此时会忽略timeToIdleSeconds和timeToLiveSeconds属性,默认为false

  • timeToIdleSeconds:设定允许对象处于空闲状态的最长时间,以秒为单位。当对象自从最近一次被访问后,如果处于空闲状态的时间超过了timeToIdleSeconds属性值,这个对象就会过期,EHCache将把它从缓存中清空。只有当eternal属性为false,该属性才有效。如果该属性值为0,则表示对象可以无限期地处于空闲状态

  • timeToLiveSeconds:设定对象允许存在于缓存中的最长时间,以秒为单位。当对象自从被存放到缓存中后,如果处于缓存中的时间超过了 timeToLiveSeconds属性值,这个对象就会过期,EHCache将把它从缓存中清除。只有当eternal属性为false,该属性才有效。如果该属性值为0,则表示对象可以无限期地存在于缓存中。timeToLiveSeconds必须大于timeToIdleSeconds属性,才有意义

  • overflowToDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。

  • diskSpoolBufferSizeMB:磁盘缓存区大小,默认为30MB。每个Cache都应该有自己的一个缓存区。

  • diskPersistent:是否缓存虚拟机重启期数据。

  • diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。

  • memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。

  • clearOnFlush:内存数量最大时是否清除。

开启缓存:

入口启动类添加注解 @EnableCaching

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class,DataSourceTransactionManagerAutoConfiguration.class})
@EnableCaching  // 开启缓存,Spring Boot 会自动配置缓存的 CacheManager
public class StartApplication {public static void main(String[] args) {SpringApplication.run(StartApplication.class, args);}
}

缓存业务使用:

@Component
@CacheConfig(cacheNames = "userCache")
public class UserService {@Cacheable(key = "#id")public User getUserById(Long id) {System.out.println("缓存中无值");User user = User.builder().id(id).userName("雪糕(" + id + ")").age(18).address("杭州").build();return user;}@CachePut(key = "#user.id")public User updateUser(User user) {user.setUserName("雪糕(new name)");return user;}@CacheEvict(key = "#id")public void deleteById(Long id) {System.out.println("db 删除数据,id=" + id);}
}
  • @CacheConfig  作用于类上,用来描述该类中所有方法使用的缓存名称。当然也可以不使用该注解,直接在具体方法上的缓存注解里配置名称

  • @Cacheable 用于查询方法上,表示将一个方法的返回值缓存起来。默认情况下,缓存的 key 就是方法的参数,缓存的 value 就是方法的返回值

  • @CachePut  更新操作,当数据库中的数据更新后,缓存中的数据也要跟着更新,使用该注解,可以将方法的返回值自动更新到已经存在的 key 上

  • @CacheEvict  删除操作,当数据库中的数据删除后,相关的缓存数据也要自动清除。

除了采用 @Cacheable@CachePut 等方法注解解耦式操作缓存外,我们也可以使用 CacheManager显示方式手动来操作缓存。

CacheManager

Spring定义了CacheManagerCache接口统一不同的缓存技术。其中CacheManager是Spring提供的各种缓存技术的抽象接口,而Cache接口包含缓存的读、写、删等各种操作。

针对不同的缓存技术,需要实现不同的CacheManager,Spring预先定义了主流缓存框架的cacheManger实现类

CacheManager描述
SimpleCacheManager使用简单的Collection来存储缓存,主要用于测试
ConcurrentMapCacheManager使用ConcurrentMap作为缓存技术(默认)
NoOpCacheManager测试用
EhCacheCacheManager使用EhCache作为缓存技术,以前在hibernate的时候经常用
GuavaCacheManager使用google guava的GuavaCache作为缓存技术
HazelcastCacheManager使用Hazelcast作为缓存技术
JCacheCacheManager使用JCache标准的实现作为缓存技术,如Apache Commons JCS
RedisCacheManager使用Redis作为缓存技术
CaffeineCacheManager使用Caffeine作为缓存技术

Spring Boot 为我们预留接口扩展,方便我们自动配置 EhCache、Redis、Guava、ConcurrentMap等缓存,默认使用ConcurrentMapCacheManager。Spring Boot的application.yaml配置文件,使用spring.cache前缀属性进行配置。

本文我们使用 EhCache 缓存,代码示例如下:

@Component
public class UserCacheManager {@Resourceprivate CacheManager cacheManager;public User getUserById(Long id) {Cache cache = cacheManager.getCache("userCache");User user = cache.get(id, User.class);if (user == null) {System.out.println("缓存中无值");user = User.builder().id(id).userName("雪糕(" + id + ")").age(18).address("杭州").build();cache.put(id, user);}return user;}public User updateUser(User user) {user.setUserName("雪糕(new name)");Cache cache = cacheManager.getCache("userCache");cache.put(user.getId(), user);return user;}public void deleteById(Long id) {Cache cache = cacheManager.getCache("userCache");cache.evict(id);System.out.println("db 删除数据,id=" + id);}
}

演示代码地址

https://github.com/aalansehaiyang/spring-boot-bulking  模块:spring-boot-bulking-ehcache


往期推荐

Spring为什么建议构造器注入?


超级详细的Spring Boot 注解总结


Spring中的重试功能!嗯,有点东西



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/544725.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

avr uart打印_AVR | 在16x2 LCD上打印HELLO WORLD

avr uart打印We would learn the connection to the LCD first as the connections is a bit complex and here we are using an 8-bit LCD. 我们将首先学习到LCD的连接&#xff0c;因为连接有点复杂&#xff0c;这里我们使用的是8位LCD 。 Simulation 模拟 Explanation 说明…

SQLite CodeFirst、Migration 的趟坑过程 [附源码]

负二、配置说明 最近想做个东西&#xff0c;用到了SQLite&#xff0c;按照之前的方法步骤搭建的结果失败了&#xff0c;因为SQLite的版本升级了&#xff0c;导致Migration自动迁移各种报错&#xff0c;而且我查了一下自动迁移的包貌是不再更新了。——2018年1月24日 能正常使用…

linux中lvm的缩减

问题提出&#xff1a;服务器硬盘做成了lvm&#xff0c;但是/home目录空间较大&#xff0c;于是想缩减一下&#xff0c;分配给其他目录。实验环境&#xff1a;操作系统&#xff1a;redhat企业版&#xff0c;硬盘已经做成了lvm。问题解决&#xff1a;操作前的注意事项&#xff1a…

SpringBoot 过滤器、拦截器、监听器对比及使用场景!

来源 | blog.csdn.net/qq_38020915/article/details/116431612作者 | dingwen_blog一、关系图理解二、区别1.过滤器过滤器是在web应用启动的时候初始化一次, 在web应用停止的时候销毁可以对请求的URL进行过滤, 对敏感词过滤挡在拦截器的外层实现的是 javax.servlet.Filter 接口…

Java StringBuilder length()方法与示例

StringBuilder类的length()方法 (StringBuilder Class length() method) length() method is available in java.lang package. length()方法在java.lang包中可用。 length() method is used to return the length of this sequence (i.e. it counts the number of characters …

进程通信:匿名管道和命名管道

一、进程间通信方式 管道( pipe )&#xff1a;管道是一种半双工的通信方式&#xff0c;数据只能单向流动&#xff0c;而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。有名管道 (named pipe) &#xff1a; 有名管道也是半双工的通信方式&#xff0c…

Jenkins Build Radiators(构建发射源)

为什么80%的码农都做不了架构师&#xff1f;>>> information radiators&#xff08;信息发射源&#xff09;的概念通常被用在敏捷的圈子里。 据敏捷专家Alistair Cockburn所说&#xff1a; 一个信息发射源是一个贴在一个地方的显示器&#xff0c;当人们工作或路过时…

线程池是如何重复利用空闲的线程来执行任务的?

来源&#xff1a;blog.csdn.net/anhenzhufeng/article/details/88870374在Java开发中&#xff0c;经常需要创建线程去执行一些任务&#xff0c;实现起来也非常方便&#xff0c;但如果并发的线程数量很多&#xff0c;并且每个线程都是执行一个时间很短的任务就结束了&#xff0c…

strictmath_Java StrictMath nextAfter()方法与示例

strictmathStrictMath类的nextAfter()方法 (StrictMath Class nextAfter() method) Syntax: 句法&#xff1a; public static double nextAfter(double starts , double directions);public static float nextAfter(float starts , double directions);nextAfter() method is …

C# 将程序添加开机启动的三种方式

前言 最近在研究程序随系统启动&#xff0c;发现在 win7 上因为权限的问题&#xff0c;写注册表的时候总是会出现问题&#xff0c;写不进去导致的不能自动启动&#xff0c;随后决定仔细的看一看这方面的问题。 查资料过程中主要发现有三种方式可以添加到启动&#xff0c;分别…

SpringBoot 中的 3 种条件装配!

一、介绍在实际的项目开发中&#xff0c;我们往往需要根据不同的环境做出不同的配置&#xff0c;例如&#xff1a;在开发环境下&#xff0c;我们会使用内存数据库以便快速启动服务并进行开发调试&#xff0c;在test环境、生产环境&#xff0c;会使用对应环境的数据库。如果我们…

java中intvalue_Java Short类intValue()方法及示例

java中intvalue短类intValue()方法 (Short class intValue() method) intValue() method is available in java.lang package. intValue()方法在java.lang包中可用。 intValue() method is used to return the value denoted by this Short object converted to type int (by c…

C# Winform 窗体美化(目录)

最近在看 C# Winform 的窗体美化&#xff0c;发现一些很有用的美化皮肤库&#xff0c;学习过后也把一些资料整理一下。 一、IrisSkin 换肤库&#xff08;IrisSkin4&#xff09; 二、LayeredSkin 界面库&#xff08;LayeredSkinDemo&#xff09; 三、不规则窗体&#xff08;G…

图说 mysql 事务隔离级别

转载于:https://blog.51cto.com/kingbox/1657916

@Autowired报错的4种解决方案和原因分析!

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;上图的报错信息相信大部分程序员都遇到过&#xff0c;奇怪的是虽然代码报错&#xff0c;但丝毫不影响程序的正常执行&#x…

C# Winform 窗体美化(一、IrisSkin 换肤库)

IrisSkin 换肤库 IrisSkin 是为Microsoft Visual Studio dotNET开发的最易用的界面增强dotNET(WinForm)组件包。能完全自动的为应用程序添加支持换肤功能。[百度百科] 1、文件 IrisSkin4.dll - 544 KB各种 .ssk 格式的皮肤文件&#xff08;一般在网上搜的是13个皮肤的压缩包…

java double方法_Java Double类compare()方法与示例

java double方法双类compare()方法 (Double class compare() method) compare() method is available in java.lang package. compare()方法在java.lang包中可用。 compare() method is used to check equality or inequality of the given two double values or in other word…

MySQL开发规范

命名规范> 库名、表名、字段名必须使用小写字母并采用下划线分割> 库名、表名、字段名禁止超过32个字符&#xff0c;须见名知意 * 库名、表名、字段名支持最多64个字符&#xff0c;统一规范、易于辨识以及减少传输量不要超过32> 库名、表名、字段名禁止使用MySQL…

厉害了,Spring中bean的12种定义方法!

前言在庞大的java体系中&#xff0c;spring有着举足轻重的地位&#xff0c;它给每位开发者带来了极大的便利和惊喜。我们都知道spring是创建和管理bean的工厂&#xff0c;它提供了多种定义bean的方式&#xff0c;能够满足我们日常工作中的多种业务场景。那么问题来了&#xff0…

C# Winform 窗体美化(二、LayeredSkin 界面库)

二、LayeredSkin 界面库 概况 这部分资源是 Winform 美化最多的了&#xff0c;效果还不错&#xff0c;使用时只需引入 LayeredSkin.dll - 696 KB 即可。 网上能找到的最后 LayeredSkin 版本应该是 LayeredSkin Demo2014-12-10.zip&#xff0c;之后作者就整合成一个更加强大的…