基于注解实现缓存的框架 -- SpringCache

news/2024/5/5 11:07:29/文章来源:https://blog.csdn.net/weixin_53041251/article/details/126946994

目录

1、介绍

2、注解

3、 入门案例

3.1 环境准备

3.2 @CachePut注解

3.3 @CacheEvict注解

3.4 @Cacheable注解

3.4.1 测试

3.4.2 缓存非null值

4 、集成Redis


1、介绍

Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能,大大简化我们在业务中操作缓存的代码。

如果我们不知道SpringCache 这个技术,那在项目开发中还需要我们自己去实现缓存的逻辑,比如 数据在缓存中是否存在,没有就去数据库查询再加到缓存中。

那我们学会了如何使用 SpringCache 就不需要我们自己去手动去实现这些操作,通过 SpringCache 提供的注解就能大大的简化我们的这个缓存操作的代码,然后提高我们的开发效率。

Spring Cache 提供了一层抽象,底层可以切换不同的cache实现。具体就是通过CacheManager接口来统一不同的缓存技术。CacheManagerSpring提供的各种缓存技术抽象接口。

CacheManager

描述

EhCacheCacheManager

使用EhCache作为缓存技术

GuavaCacheManager

使用Google的GuavaCache作为缓存技术

RedisCacheManager

使用Redis作为缓存技术

2、注解

在SpringCache中提供了很多缓存操作的注解,常见的是以下的几个:

注解

说明

@EnableCaching

开启缓存注解功能

@Cacheable

在方法执行前spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中

@CachePut

将方法的返回值放到缓存中

@CacheEvict

将一条或多条数据从缓存中删除

spring boot项目中,使用缓存技术只需在项目中导入相关缓存技术的依赖包,并在启动类上使用@EnableCaching开启缓存支持即可。

例如,我想要使用Redis作为缓存技术,那我就只需要再项目导入Spring data Redis的maven坐标即可,它自己会帮我们进行整合。

3、 入门案例

接下来,我们通过一个入门案例来学习如何在项目开发中使用 SpringCache ,虽然使用起来比较简单,但是还是有一些细节问题值得我们来了解一下。

上面我们提到,SpringCache 可以集成不同的缓存技术,如RedisEhcache甚至我们可以使用Map来实现这个缓存数据, 接下来的案例,我们可以先使用最基础的 Map 方式演示一遍,然后再去使用 Redis。

SpringCache的基本功能是Spring核心(spring-context)中提供的,所以目前我们进行简单的SpringCache测试,是可以不用额外引入其他依赖的。


当然,我们后面需要用到 Redis 来进行 数据缓存 就要还需要导入下面两个坐标。

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

3.1 环境准备

1、我们可以在Controller注入一个CacheManager,在Debug时,我们可以通过CacheManager跟踪缓存中数据的变化。

2、 启动类上加@EnableCaching,代表当前项目开启缓存注解功能。

3.2 @CachePut注解

作用

将方法返回值,放入缓存。

value

缓存的名称, 每个缓存名称下面可以有很多key。

key

缓存的key ----------> 支持Spring的表达式语言SPEL语法

既然我们知道 @CachePut 的作用了,那大家最觉得 它适合放在哪一类的方法上比较合适?

很明显,那就是新增方法上,因为我们 将一条数据插到我们数据库中的表中了,对应的也应该要插入到缓存中。

大家可以看到我们上面key 的 写法 有一点点不一样,我们每次增加一个用户,都会缓存一个数据,所以这个Key 是不能写死的,我们是希望它是动态的,所以我写成上面那个样子。接下我们就来看看这个写法的介绍。

#user.id

#user指的是方法形参的名称, id指的是user的id属性 , 也就是使用user的id属性作为key 。

#user.name

#user指的是方法形参的名称, name指的是user的name属性 ,也就是使用user的name属性作为key 。

#result.id

#result代表方法返回值,该表达式 代表以返回对象的id属性作为key 。

#result.name

#result代表方法返回值,该表达式 代表以返回对象的name属性作为key 。

接下来我们启动项目,然后通过postman请求访问UserController的方法, 最后通过断点的形式跟踪缓存数据。

第一次访问时,缓存中的数据是空的,因为save方法执行完毕后才会缓存数据。

第二次访问时,我们通过debug可以看到已经有一条数据了,就是上次保存的数据,已经缓存了,缓存的key就是用户的id。

咳咳!注意,我们上面的演示,最终的数据是缓存在 ConcurrentHashMap ,当我们将项目重启后,缓存中的数据就会消失,我们后面使用了Redis来缓存就不存在这样的问题了。

3.3 @CacheEvict注解

作用

清理指定缓存。

value

缓存的名称,每个缓存名称下面可以有多个key。

key

缓存的key ----------> 支持Spring的表达式语言SPEL语法。

既然我们知道 @CacheEvict 的作用了,那大家大概也知道它适合放在哪一类的方法上了。

那当然是删除方法和修改方法上,数据库的数据已经发生了变更,我们就需要将缓存中对应的数据删除掉,避免出现数据库数据与缓存数据不一致的情况。

key 的写法 :

#p0

代表第一个参数

#root.args[0]

代表第一个参数

#id

代表变量名为id的参数

接下来我们再进入测试,要想测试删除,就必须要有数据,所以我们先执行几次增加方法,保存数据到数据库的同时,也保存到缓存中。 然后我们在通过postman访问delete方法, 如下:

删除数据时,通过debug我们可以看到已经缓存的数据:

当执行完delete操作之后,我们再次保存一条数据,在保存的时候debug查看一下删除的ID值是否已经被删除。

3.4 @Cacheable注解

作用

在方法执行前,spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;

若没有数据,调用方法并将方法返回值放到缓存中。

value

缓存的名称,每个缓存名称下面可以有多个key。

key

缓存的key ----------> 支持Spring的表达式语言SPEL语法

了解了 @Cacheable 的作用,那大家应该都知道它适合放在 查询方法上了。

3.4.1 测试

我们可以重启服务,然后通过debug断点跟踪程序执行。

我们发现,第一次访问,会请求我们controller的方法,查询数据库。后面再查询相同的id,就直接获取到数据库,不用再查询数据库了,就说明缓存生效了。

 

我们在测试时,查询一个数据库不存在的id值,第一次查询缓存中没有,也会查询数据库。

而第二次再查询时,会发现,不再查询数据库了,而是直接返回,那也就是说如果根据ID没有查询到数据,那么会自动缓存一个null值。

3.4.2 缓存非null值

我们能不能做到,当查询到的值不为null时,再进行缓存,如果为null,则不缓存呢? 答案是可以的。

在@Cacheable注解中,提供了两个属性分别为: conditionunless

  1. condition : 表示满足什么条件, 再进行缓存 ;
  2. unless : 表示满足条件则不缓存 ; 与上述的condition是反向的 ;

我们在list方法中进行查询时,有两个查询条件,如果传递了id,根据id查询;

如果传递了name, 根据name查询,那么我们缓存的key在设计的时候,就需要既包含id,又包含name。 具体的代码实现如下:

测试结果就是 第一次查询时,需要查询数据库,在后续的查询中,就直接查询了缓存,不再查询数据库了。

4 、集成Redis

在使用上述默认的ConcurrentHashMap做缓存时,在我们服务重启之后,之前缓存的数据就全部丢失了,操作起来并不友好。在项目中使用,我们会选择使用redis来做缓存,主要需要操作以下几步:

1、pom.xml 文件引入依赖。

 

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

2、编写yml 文件。

3、 测试

重新启动项目,通过postman发送根据id查询数据的请求,然后通过redis的图形化界面工具,查看redis中是否可以正常的缓存数据。

 

 

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

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

相关文章

Java开发学习---Maven私服(二)本地仓库访问私服配置与私服资源上传下载

一、本地仓库访问私服配置 我们通过IDEA将开发的模块上传到私服&#xff0c;中间是要经过本地Maven的 本地Maven需要知道私服的访问地址以及私服访问的用户名和密码 私服中的仓库很多&#xff0c;Maven最终要把资源上传到哪个仓库? Maven下载的时候&#xff0c;又需要携带用…

花了 3000 美元,我在 SaaStr 大会学到了什么?——码农驱动的 SaaS 增长之路

Michael Yuan&#xff0c;WasmEdge Runtime 创始人SaaStr 是 SaaS 领域最具影响力的大会之一。 历经疫情阴霾&#xff0c;SaaStr 盛会2022年再次归来。尽管 SaaS 估值如过山车一般疯涨又跌落&#xff0c;但即使在当下所谓的萧条中&#xff0c;SaaS 公司和产品的收入也在以前所未…

点成分享 | 带你了解移液器的原理及其分类

移液器&#xff0c;全称叫微量移液器&#xff0c;也叫移液枪、取样枪&#xff0c;是实验室定量移取微量液体体积的精密仪器&#xff0c;一次可量取0.1μL-10mL的液体&#xff0c;可实现精准的液体配比转移&#xff0c;多用于环境检测、医学实验室、生物技术实验室、食品检测实验…

一次明白 JDBC,ORM,JPA,SpringDataJPA 之间的关系

java持久层框架访问数据库一般有两种方式&#xff1a; 以SQL为核心&#xff0c;封装JDBC操作&#xff0c;如&#xff1a;MyBatis以java实体类为核心&#xff0c;将实体类和数据库表之间映射的ORM框架&#xff0c;比如&#xff1a;Spring Data JPA和Hibernate 接下来就是详细的…

青岛大学数据结构与算法——第4章

一 概述 串数组广义表 二 串 串定义&#xff1a;定义、串名、串值、串长、子串/真子串、字符位置、空格串 案例&#xff1a;病毒感染检测 串类型定义、存储结构及其运算 定义&#xff1a;ADT String 操作&#xff1a;strAssign、strCompare、strLength、concat、其他 存储…

39. 组合总和

39. 组合总和题目dfs思路一&#xff1a;dfs思路二&#xff1a;题目 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这…

相关性分析热力图(PythonMatlab代码实现)

目录 1 热力图 1.1 简介 1.2 语法 2 算例1&#xff08;Python代码实现&#xff09; 2.1 算例 2.2 Python代码 2.3 运行结果 3 算例2&#xff08;Python代码实现&#xff09; 4 算例3&#xff08;Python代码实现&#xff09; 4.1 算例 4.2 Python代码 4.3 运行结果 5…

Sovit3D智慧园区:数字孪生园区大屏一体化管理平台

建设背景 随着全球物联网、移动互联网、云计算、大数据等新一轮信息技术的迅速发展和深入应用&#xff0c;推动产业升级和发展数字经济成为重要发力点。而产业园区作为产业升级转型的重要载体&#xff0c;建设智慧园区的需求高速增长。智慧园区在加强信息基础设施建设的同时&a…

网络编程-TCP

软件结构分类 C/S结构 &#xff1a;全称为Client/Server结构&#xff0c;是指客户端和服务器结构。常见程序有&#xff31;&#xff31;、迅雷等软件 B/S结构 &#xff1a;全称为Browser/Server结构&#xff0c;是指浏览器和服务器结构。常见浏览器有谷歌、火狐等 网络编程三要…

Unity Editor 扩展入门1

教程来源:https://www.youtube.com/watch?v=491TSNwXTIg&t=204s 一个点击物体修改材质颜色的简单editor扩展工具 using UnityEngine; using UnityEditor;public class ExampleWindow : EditorWindow {[MenuItem("Window/Colorizer")]public static void ShowWi…

入行数字IC验证后会做些什么?需要哪些必备技能?

想必大家眼中的验证工程师就是整天对着电脑敲代码&#xff0c;这是大家对这个岗位的固定印象。其实真实情况并不是这样&#xff0c;那么入行数字IC验证后会做些什么&#xff1f;需要哪些必备技能&#xff1f;下面就一起来了解一下吧。 什么是IC验证工程师&#xff1f; 回答这…

15天深度复习JavaWeb的详细笔记(四)——HTML、CSS

Demo04-HTML、CSS 1&#xff0c;HTML 1.1 介绍 HTML 是一门语言&#xff0c;所有的网页都是用HTML 这门语言编写出来的&#xff0c;也就是HTML是用来写网页的&#xff0c;像京东&#xff0c;12306等网站有很多网页。HTML(HyperText Markup Language)&#xff1a;超文本标记语…

阿里云 window下 nginx 安装https证书的配置。

首先我这里使用的是阿里云免费的https证书。 免费证书可以申请20个&#xff0c;每个的有效期为1年。 我这里使用的是nginx部署&#xff0c;所以下载nginx的 证书压缩包 下载下来之后解压&#xff0c;有两个文件一个是&#xff0c; 一个是xxx.pem ,另一个是xxxx.key. nginx 配…

企业文件加密系统价格—公司文件加密系统多少钱?

企业文件加密系统多少钱&#xff1f;怎么收费&#xff1f;一般是根据需要购买的台数进行收费的。 现在市面上有很多做文件加密系统的厂商&#xff0c;每家收费标准都不一样&#xff0c;在百度搜索文件加密系统的价格&#xff0c;就会发现价格有几百到1000/台的不等。企业文件加…

详细讲解FuzzBench如何添加新的Fuzzer

最近几天一直在弄FuzzBench添加新的fuzzer&#xff0c;在添加过程中遇到各种问题&#xff0c;在此做详细记录。 拉取fuzzbench到本地 这一部分可以直接参考此链接FuzzBench预备条件 1.拉取代码到本地 git clone https://github.com/google/fuzzbench cd fuzzbench git submo…

我上线了一个炫酷的项目实战教程网站,主流技术一网打尽~

之前经常遇到小伙伴问我&#xff0c;之前写的某篇技术文章在哪里。又或者是拿着很早以前的部署文档问我&#xff0c;按这个文章怎么部署不起来。其实他们如果上过我的实战教程网站的话&#xff0c;估计就不会有这些问题了&#xff0c;我的原创文章基本都会同步上去。今天和大家…

孙宇晨:区块链行业势必迎来光明的未来

近日&#xff0c;波场TRON创始人孙宇晨受邀在米尔肯研究院&#xff08;Milken Institute&#xff09;官方网站上发表了题为《区块链行业势必迎来光明的未来》的署名文章。孙宇晨在文章中表示&#xff0c;作为一种新兴的颠覆性技术&#xff0c;加密行业的发展之路并非一帆风顺。…

Fat Tree 分析

本文是源于USTC Advance Computer Network 的课程内容做的总结 论文来源&#xff1a;A scalable, commodity data center network architecture 本文将分析Fat Tree的 拓扑结构、编址方案和路由算法三个方面。 拓扑结构 该文章中从传统数据中心通信的问题提出了FatTree的拓扑…

机器学习——聚类(K-Means)

机器学习——聚类(K-Means)那是什么 无监督学习——聚类聚类是基于相似对象将一组对象分组为类/类别的过程。聚类是一部分 无监督学习 .这种方法通常用于确定业务决策,特别是在基于来自集群的数据预测来预测正确的业务策略时。聚类还可用于异常检测、客户细分和改善客户服务…

食品行业中的 AI 和 ML 用例

食品行业中的 AI 和 ML 用例人工智能和机器学习为每个行业的进步铺平了道路。这些技术的使用帮助他们优化和自动化流程,降低成本和时间要求,减少人为错误的可能性。让我们了解采用基于 AI 和 ML 的技术如何使食品行业受益。Photo by 阿诺塞诺纳 on 不飞溅 由农民和各种企业…