SpringBoot集成缓存功能

1. 缓存规范

Java Caching定义了五个核心接口,分别是:CachingProvider、CacheManager、Cache、Entry和Expiry。

  • CachingProvider:定义了创建、配置、获取、管理和控制多个CacheManager。一个应用可以在运行期访问多个CachingProvider。
  • CacheManager:定义了创建、配置、获取、管理和控制多个唯一命名的Cache,这些Cache存在于CacheManager的上下文中。一个CacheManager仅被一个CachingProvider所拥有。
  • Cache:是一个类似Map的数据结构并临时存储以key为索引的值,一个Cache仅被一个CacheManager所拥有。
  • Entry:是一个储存在Cache中的key-value对。
  • Expiry:每一个储存在Cache中的条目有一个定义的有效期。一旦超过这个时间,条目为过期的状态。一旦过期,条目将不可访问、更新和删除。缓存有效期可以通过ExpiryPolicy设置。
    在这里插入图片描述

2. 缓存抽象

Spring从3.1开始定义了org.springframework.cache.Cache和org.springframework.cache.CacheManager接口来统一不同的缓存技术,并支持使用JCache(JSR-107)注解简化开发。

  • Cache接口为缓存的组件规范定义,包含缓存的各种操作集合。
  • Cache接口下Spring提供了各种xxxCache的实现,如RedisCache、EhcacheCache、ConcurrentMapCache等。
描述
Cache缓存接口,定义缓存操作,实现有RedisCache、EhcacheCache、ConcurrentMapCache等
CacheManager缓存管理器,管理各种缓存(Cache)组件
@Cacheable主要针对方法配置,能够根据方法的请求参数对其结果进行缓存
@CacheEvict清空缓存
@CachePut保证方法被调用,又希望结果被缓存
@EnableCaching开启基于注解的缓存
keyGenerator缓存数据时key的生成策略
serialize缓存数据时value的序列化策略
@Cacheing指定多个缓存策略

3. 缓存装配

Spring Boot提供的缓存自动配置都记录在CacheAutoConfiguration中,其中CacheConfigurationImportSelector最为关键,它帮助我们导入常用缓存组件,组件如下:

  • org.springframework.boot.autoconfigure.cache.GenericCacheConfiguration
  • org.springframework.boot.autoconfigure.cache.JCacheCacheConfiguration
  • org.springframework.boot.autoconfigure.cache.EhCacheCacheConfiguration
  • org.springframework.boot.autoconfigure.cache.HazelcastCacheConfiguration
  • org.springframework.boot.autoconfigure.cache.InfinispanCacheConfiguration
  • org.springframework.boot.autoconfigure.cache.CouchbaseCacheConfiguration
  • org.springframework.boot.autoconfigure.cache.RedisCacheConfiguration
  • org.springframework.boot.autoconfigure.cache.CaffeineCacheConfiguration
  • org.springframework.boot.autoconfigure.cache.SimpleCacheConfiguration
  • org.springframework.boot.autoconfigure.cache.NoOpCacheConfiguration

使用缓存时只需要导入对应的实现即可,Spring Boot自动帮我们装配。

4. 简单缓存

使用Spring Boot提供的基于Map的内存级缓存

4.1 依赖管理

引入Spring Boot缓存场景启动器,默认导入的就是SimpleCacheConfiguration配置,是基于Map的内存级缓存

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

4.2 开启缓存

通过@EnableCacheing注解开启基于注解的缓存

@EnableCaching  // 开启基于注解的缓存
@SpringBootApplication
public class SimpleCacheServiceApplication {public static void main(String[] args) {// 启动应用程序SpringApplication.run(SimpleCacheServiceApplication.class, args);}
}

4.3 Cacheable

@Cacheable:先查询缓存数据,如果存在直接取出缓存数据返回,如果不存在就执行目标方法,将方法返回值存入缓存,常用于查询数据。

  • 注解属性
属性描述
cacheNames缓存的名字
key缓存索引,默认使用方法参数值
keyGenerator缓存索引生成器,与key属性二选一
cacheManager缓存管理器
condition满足条件进行缓存
unless满足条件不进行缓存
sync是否使用异步,默认为false
@Override
@Cacheable(cacheNames = "user", key = "#userId")
public User findUserInformationByUserId(Integer userId) {log.info("通过用户编号查询用户信息......");return new User(userId, "Jack", LocalDateTime.now(), true);
}
  • 第一次调用:先查询缓存,此时缓存中不存在数据,执行目标方法后将目标方法返回数据存入缓存
    在这里插入图片描述

  • 第二次调用:先查询缓存,此时缓存存在数据不执行目标方法
    在这里插入图片描述

4.4 CachePut

@CachePut:每次都先执行目标方法,将方法返回值存入缓存,常用于添加数据和修改数据。

  • 注解属性
属性描述
cacheNames缓存的名字
key缓存索引,默认使用方法参数值
keyGenerator缓存索引生成器,与key属性二选一
cacheManager缓存管理器
condition满足条件进行缓存
unless满足条件不进行缓存
@Override
@CachePut(cacheNames = "user", key = "#user.userId")
public Boolean insertUserInformation(User user) {log.info("业务层 - 添加用户信息......");return true;
}

4.5 CacheEvict

@CacheEvict:在执行目标方法之后清除缓存,也可以指定在执行目标方法之前清除缓存,常用于删除数据。

  • 注解属性
属性描述
cacheNames缓存的名字
key需要清除缓存的索引,默认使用方法参数值
keyGenerator缓存索引生成器,与key属性二选一
cacheManager缓存管理器
condition满足条件进行清除缓存
allEntries是否清除全部缓存,默认为false
beforeInvocation是否在目标方法执行之前清除缓存,默认为false
@Override
@CacheEvict(cacheNames = "user", key = "#userId")
public Boolean deleteUserInformationByUserId(Integer userId) {log.info("业务层 - 删除用户信息......");return true;
}

4.6 Caching

@Caching:方法级注解,可以指定复杂的缓存策略。

4.7 CacheConfig

@CacheConfig:类级注解,配置该类缓存策略的一些公共属性,比如缓存名称、缓存管理器、缓存索引生成策略

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

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

相关文章

RAG技术在教育领域的应用

一、引言 点击可以查看最新资源 随着人工智能技术的飞速发展&#xff0c;教育领域正迎来一场深刻的变革。大型语言模型&#xff08;LLM&#xff09;和检索增强生成&#xff08;Retrieval-Augmented Generation&#xff0c;RAG&#xff09;技术的结合&#xff0c;为教育领域注入…

分治乘法详细讲解

我绝对不会告诉你我是因为太蒻了&#xff0c;不会 FFT 才搞这个的。 我用一下别人的图没什么问题吧 看得懂吧&#xff1f;比如 X 123456 , Y 987654 X123456,Y987654 X123456,Y987654&#xff0c;则 n 3 , A 123 , B 456 , C 987 , D 654 n3,A123,B456,C987,D654 n3…

C语言习题~day33

1.以下程序运行时&#xff0c;若输入1abcedf2df输出结果是&#xff08;&#xff09; #include <stdio.h> int main() { char a 0, ch; while ((ch getchar()) ! \n) { if (a % 2 ! 0 && (ch > a && ch < z)) ch ch - a A; a; putchar(ch); }…

Web前端电话咨询:深度解析与实用指南

Web前端电话咨询&#xff1a;深度解析与实用指南 在数字化时代&#xff0c;Web前端技术日新月异&#xff0c;对于许多企业和个人而言&#xff0c;通过电话咨询了解前端技术的最新动态和解决方案已成为一种高效且便捷的方式。本文将从四个方面、五个方面、六个方面和七个方面&a…

Web学习_SQL注入_联合查询注入

UNION 操作符用于合并两个或多个 SELECT 语句的结果集&#xff0c; UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句 中的列名&#xff0c;并且UNION 内部的 SELECT 语句必须拥有相同数量的 列。 联合查询注入就是利用union操作符&#xff0c;将攻击者希望查询的语句…

jmeter性能优化之mysql监控sql慢查询语句分析

接上次博客&#xff1a;基础配置 多用户登录并退出jmx文件&#xff1a;百度网盘 提取码&#xff1a;0000 一、练习jmeter脚本检测mysql慢查询 随意找一个脚本(多用户登录并退出)&#xff0c;并发数设置300、500后分别查看mysql监控平台 启动后查看&#xff0c;主要查看mysql…

406. 根据身高重建队列(中等)

406. 根据身高重建队列 1. 题目描述2.详细题解3.代码实现3.1 Python3.2 Java 1. 题目描述 题目中转&#xff1a;406. 根据身高重建队列 2.详细题解 做一道题之前先静心&#xff0c;默念三遍一切反动派都是纸老虎。已知一个队列&#xff0c;队列中每个数据表示一个属性&#xf…

【qt】启动窗口的玩法

启动窗口的玩法 一.应用场景二.界面类设计窗口三.main中创建四.窗口显示标识五.功能实现1.读取注册表2.md5加密3.登录实现4.保存注册表5.功能演示 六.鼠标事件拖动窗口1.找到鼠标事件的函数2.点击事件3.移动事件4.释放事件 七.总结 一.应用场景 一般我们的软件和应用都会一个登…

实战项目《负载均衡在线OJ系统》

一、项目灵感来源 在日常做题的过程中&#xff0c;我们总会去力扣和牛客网上去做题&#xff0c;但是从来没有想过网站是如何加载给用户的&#xff0c;以及在提交代码时&#xff0c;是如何得知我们的代码是否正确。基于这样的原因&#xff0c;也是学习到一定程度的知识后&#x…

P11 品牌管理

P75 品牌分类关联和级联更新 第一步 1、把renren-fast-vue\src\views\modules下的common和product模块复制到vue中 2、mybatisplus的分页插件&#xff0c;来调整品牌管理页面的页数不对问题 product新建config/MybatisPlusConfig.java文件&#xff0c;参照官网&#xff0c;…

【人工智能】AI绘画工具基本介绍

AI绘画工具是一种利用人工智能技术&#xff0c;特别是深度学习和神经网络&#xff0c;来生成图像的软件或在线服务。这些工具能够根据用户的指令或描述&#xff0c;创造出各种风格的图像&#xff0c;包括但不限于风景、人物、动物、抽象艺术等。AI绘画工具的出现&#xff0c;极…

python中的循环语句

while循环 基本语法格式 while 条件&#xff1a; 循环体 条件为真&#xff0c;则执行循环体代码 条件为假&#xff0c;则结束循环 打印 1-10的整数 死循环有时候也是必须的&#xff0c; while语句的语法&#xff1a; &#xff08;1&#xff09;变量的初始化&#xff0c;…

你知道又美又飒的英歌队头槌女孩吗?无标题

今天是文化和自然遗产日&#xff0c;本“ 人民体验官 ”推广人民日报官方微博文化产品《 16岁英歌队头槌女孩又美又飒》。 截图&#xff1a;来源“ 人民体验官 ”推广平台 郑梓欣是汕头潮阳西门女子英歌队的“头槌”。在2024年春节英歌舞展演巡游活动中&#xff0c;汕头潮阳西…

MySQL第二种实现方式:现在有一个生产计划,甲乙丙3个品类共16个产品,生产时间6天,每天甲品类可以生产1张单,乙3张,丙1张,请用MySQL写出H列的效果

接上篇&#xff1a;链接: 现在有一个生产计划&#xff0c;甲乙丙3个品类共16个产品&#xff0c;生产时间6天&#xff0c;每天甲品类可以生产1张单&#xff0c;乙3张&#xff0c;丙1张&#xff0c;请用MySQL写出H列的效果 第二种写法&#xff1a; -- 使用WITH子句创建CTE WITH…

Spark参数配置不合理的情况

1.1 内存设置 &#x1f4be; 常见的内存设置有两类&#xff1a;堆内和堆外 &#x1f4a1; 我们作业中大量的设置 driver 和 executor 的堆外内存为 4g&#xff0c;造成资源浪费 &#x1f4c9;。 通常 executor 堆外内存在 executor.cores1 的时候&#xff0c;1g 足够了&…

UltraEditUEStudio软件最新版下载及详细安装教程

UEStudio简介&#xff1a; UEStudio建立在上文本编辑器UltraEdit的功能基础上&#xff0c;并为团队和开发人员提供了其他功能&#xff0c;例如深度Git集成。您可以直接在UEStudio中克隆&#xff0c;签出&#xff0c;更新&#xff0c;提交&#xff0c;推入/拉入等操作&#xff…

再回首:我的创作纪念日3周年回顾

机缘 我与CSDN三周年博客纪念 大家好&#xff01;今天&#xff0c;我非常高兴地在这里向大家分享我与CSDN三周年博客纪念的喜悦和成果。在这三年里&#xff0c;我坚持不懈地在CSDN上分享了我的技术成果和心得&#xff0c;积累了超过2000篇的博客文章。这一路上&#xff0c;我…

Invalid JSON text:“Invalid value.“ at position 0 in value for column ‘user.info

你们好&#xff0c;我是金金金。 场景 我正在练习mybatis-plus&#xff0c;在插入一条数据的时候报错了&#xff0c;错误信息如上图 排查 排查之前我先贴一下代码 以下为数据库字段类型 在插入的过程中报错&#xff1a;Data truncation: Invalid JSON text: "Invalid val…

python中的函数递归

函数递归&#xff0c;就是一个函数&#xff0c;自己调用自己。 如上图所示&#xff0c;是一段通过定义函数&#xff0c;编写函数体来实现for循环。实现的是从1到n的累乘。即求n的阶乘&#xff0c; 如上图所示&#xff0c;是一段函数的递归来实现1到n的累乘操作&#xff0c;将1*…

opencv快速安装以及各种查看版本命令

安装opencv并查看其版本&#xff0c;直接通过一个可执行文件实现。 #!/bin/bashwget https://codeload.github.com/opencv/opencv/zip/3.4 -O opencv-3.4.zip && unzip opencv-3.4.zip && cd opencv-3.4 && \mkdir build && cd build &&a…