通过实例学习:使用Spring Cache实现实际场景的缓存策略

news2024/11/29 3:08:12

文章目录

  • 前言
  • 一、Spring Cache 常用注解
    • 1.@Cacheable:
    • 2.@CachePut:
    • 3.@CacheEvict:
    • 4.@CacheConfig:
    • 5.@EnableCathing:
  • 二、使用步骤
    • 1.引入依赖
    • 2.配置
    • 3.@EnableCaching的使用:
    • 4.@Cacheable的使用:
    • 5.@CachePut的使用:
    • 6.@CacheEvict的使用:
  • 总结


前言

Spring Cache 是 Spring 框架中的一个模块,提供了对缓存的支持。
它的目标是提高应用程序的性能和响应速度,通过缓存数据来避免频繁的数据访问和计算。
Spring Cache 的主要特点和功能包括:
😊1.缓存注解:Spring Cache
提供了一组注解,如@Cacheable、@CachePut、@CacheEvict,用于在方法级别声明缓存行为。
通过简单的注解配置,你可以指定方法的返回值是否应该被缓存、缓存的键以及缓存的名称。

🔧2. 多种缓存实现支持:
Spring Cache 支持多种常见的缓存实现,如基于内存的实现(如 Caffeine、Ehcache)、分布式缓存(如
Redis、Memcached)等。你可以根据需求选择适合的缓存提供商,并进行简单的配置将其集成到你的应用程序中。

🎛️ 3.灵活的缓存策略
Spring Cache提供了灵活的缓存策略支持。你可以通过自定义键生成器、条件判断和缓存注解属性等方式,
来定制缓存的行为。这样可以根据具体的业务需求来管理缓存的更新、过期和失效等情况。

🔀4.缓存管理器:
Spring Cache 使用缓存管理器来管理缓存实例。
你需要配置相应的缓存管理器,并将其与缓存提供商进行关联。

😄通过使用Spring Cache, 你可以减少对数据库或其他耗时操作的频繁访问,从而提高应用程序的性能和响应速度。
它可以帮助你简化缓存的使用和管理,提供了一种便捷的方式来集成缓存功能到你的Spring 应用程序中。😄


一、Spring Cache 常用注解

1.@Cacheable:

用于标记方法的结果应该被缓存。当方法被调用时,Spring Cache 会首先检查缓存中是否存在已缓存的结果,如果存在,则直接返回缓存结果,否则执行方法并将结果放入缓存。你可以通过指定缓存的名称和键来进一步控制缓存的行为。

2.@CachePut:

用于标记方法的结果应该被缓存,并将结果放入缓存中。与 @Cacheable 不同,@CachePut 会每次都执行方法,并将结果放入缓存中,以保证缓存的更新。同样,你可以通过指定缓存的名称和键来进行更精确的控制。

3.@CacheEvict:

用于标记方法,表示将缓存中的指定数据移除。通过指定缓存的名称和键,@CacheEvict 可以帮助你在方法调用后从缓存中移除指定的数据。

4.@CacheConfig:

用于在类级别上指定缓存的公共配置。通过将常见的缓存配置放在类级别上,能够简化方法级别的注解,并提高代码的可读性。

5.@EnableCathing:

开启缓存注解,通常加在启动类上。

二、使用步骤

1.引入依赖

pom文件:

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

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

2.配置


spring.redis.database=1
spring.redis.host=localhost
spring.redis.port=6379

#设置缓存组件类型
spring.cache.type=redis
#设置缓存过期时间
spring.cache.redis.time-to-live=3600000
#指定默认前缀,如果此处我们指定了前缀则使用我们指定的前缀,推荐此处不指定前缀
#spring.cache.redis.key-prefix=CACHE_
#是否开始前缀,建议开启
spring.cache.redis.use-key-prefix=true
#是否缓存空值,防止缓存穿透
spring.cache.redis.cache-null-values=true

3.@EnableCaching的使用:

在启动类上开启基于注解的缓存

@SpringBootApplication
// 开启基于注解的缓存
@EnableCaching
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

到此,spring cache的基础配置就完成啦!以下是spring cache的实际使用场景

4.@Cacheable的使用:

用于标记方法的结果应该被缓存。当方法被调用时,Spring Cache 会首先检查缓存中是否存在已缓存的结果,如果存在,则直接返回缓存结果,否则执行方法并将结果放入缓存。你可以通过指定缓存的名称和键来进一步控制缓存的行为。
步骤一:
在控制层里新增一个查询方法:

@RestController
public class MyCache {
    @Resource
    private UserMapper userMapper;
    
    @GetMapping("/query/{id}")
    @Cacheable(cacheNames = "user",key = "#id",unless = "#result == null")
    public User getById(@PathVariable Long id){
        User user = userMapper.selectById(id);
        return user;
    }
}

步骤二:
查询存在的值:
在这里插入图片描述
redis中出现新增值:
在这里插入图片描述
步骤三:
查询不存在的值:
在这里插入图片描述
结果并没有存入redis,测试正确
在这里插入图片描述

5.@CachePut的使用:

用于标记方法的结果应该被缓存,并将结果放入缓存中。与 @Cacheable 不同,@CachePut 会每次都执行方法,并将结果放入缓存中,以保证缓存的更新。同样,你可以通过指定缓存的名称和键来进行更精确的控制

@RestController
public class MyCache {
    @Resource
    private UserMapper userMapper;

    // @CachePut的5种写法:
    @CachePut(cacheNames = "user",key = "#user.id")
//    // 对象导航:key名insert::返回对象的id(result是固定的)
//    @CachePut(cacheNames = "insert",key = "#result.id")
//    // 下标从零开始,代表第几个参数;有三种写法:p,a,root.args[0]
//    @CachePut(cacheNames = "insert",key = "#p0.id")
//    @CachePut(cacheNames = "insert",key = "#a0.id")
//    @CachePut(cacheNames = "insert",key = "#root.args[0].id")
    @PostMapping("/insert")
    public User insert(@RequestBody User user){
        userMapper.insert(user);
        return user;
    }
}

执行结果如下:
在这里插入图片描述
新增值成功加入redis:
在这里插入图片描述

6.@CacheEvict的使用:

用于标记方法,表示将缓存中的指定数据移除。通过指定缓存的名称和键,@CacheEvict 可以帮助你在方法调用后从缓存中移除指定的数据。
删除单个缓存值:

	@DeleteMapping("/delete/{id}")
    @CacheEvict(cacheNames = "user",key = "#id")
    public void delete(@PathVariable Long id){
        userMapper.deleteById(id);
    }

删除全部缓存值:

	@DeleteMapping("/delete/{id}")
    @CacheEvict(cacheNames = "user",allEntries = true)
    public void delete2(@PathVariable Long id){
        userMapper.deleteById(id);
    }

执行删除方法:
在这里插入图片描述
redis中的值成功删除!
在这里插入图片描述
以上就是Spring Cache的基本使用啦!希望对大家有帮助嘿嘿嘿!

总结

@作者:加辣椒了吗?
简介:憨批大学生一枚,喜欢在博客上记录自己的学习心得,也希望能够帮助到你们!
在这里插入图片描述

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

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

相关文章

c语言练习46:模拟实现strncpy

模拟实现strncpy 模拟实现&#xff1a; #include<stdio.h> char* my_strncpy(char*dest,char*src,size_t num) {char* ret dest;size_t i 0;for (i 0; i < num; i) {*dest *src;dest;src;}*dest \0;return ret; } int main() {char aim[50] { 0 };char src[] …

03_kafka-eagle 监控

文章目录 安装修改 kafka-server-start.sh修改 kafka-run-class.sh问题eagle 日志报错mysql 报错 时区问题 kafka-eagle 监控 安装 download.kafka-eagle.org &#xff1a; https://github.com/smartloli/kafka-eagle-bin/archive/v3.0.1.tar.gzhttps://docs.kafka-eagle.org/…

C语言“牵手”lazada商品详情数据方法,lazada商品详情API接口,lazadaAPI申请指南

lazada是东南亚最大的自营式电商企业&#xff0c;在线销售计算机、手机及其它数码产品、家电、汽车配件、服装与鞋类、奢侈品、家居与家庭用品、化妆品与其它个人护理用品、食品与营养品、书籍与其它媒体产品、母婴用品与玩具、体育与健身器材以及虚拟商品等。 lazada平台的商…

C基础-数组

1.一维数组的创建和初始化 int main() {// int arr1[10];int n 0;scanf("%d",&n);//int count 10;int arr2[n]; //局部的变量&#xff0c;这些局部的变量或者数组是存放在栈区的&#xff0c;存放在栈区上的数组&#xff0c;如果不初始化的话&#xff0c;默认…

heap堆结构以及堆排序

堆的定义 堆&#xff08;heap&#xff09;是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质&#xff1a; 堆中某个结点的值总是不大于或不小于其父结点的值&#xff1b; 堆总是一棵完全二叉树。 将根结点最大的堆叫做…

YOLO目标检测——复杂场景人员行人数据集+已标注voc格式标签下载分享

实际项目应用&#xff1a;安防监控、人群管理、自动驾驶、城市规划、人机交互等等数据集说明&#xff1a;YOLO目标检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富&#xff0c;图片格式为jpg&#xff0c;分为训练集和验证集。标注说明&#xff1a;使用…

kubernetes(K8S)笔记

文章目录 大佬博客简介K8SDocker VS DockerDockerK8S简介K8S配合docker相比较单纯使用docker 大佬博客 Kubernetes&#xff08;通常缩写为K8s&#xff09;是一个用于自动化容器化应用程序部署、管理和扩展的开源容器编排平台。它的构造非常复杂&#xff0c;由多个核心组件和附加…

【Java基础篇 | 类和对象】--- 聊聊什么是内部类

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【JavaSE_primary】 本专栏旨在分享学习Java的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 前言 当一个事物的内部&…

分享日常电脑遇到msvcr110.dll丢失的解决方法

最近&#xff0c;我在尝试运行一款新的软件时&#xff0c;突然遇到了一个错误提示&#xff0c;提示说缺少msvcr110.dll文件&#xff0c;导致软件无法启动。在使用电脑过程中&#xff0c;我们常常会遇到一些系统文件丢失的问题。其中&#xff0c;msvcr110.dll是Windows操作系统中…

10分钟从实现和使用场景聊聊并发包下的阻塞队列

上篇文章12分钟从Executor自顶向下彻底搞懂线程池中我们聊到线程池&#xff0c;而线程池中包含阻塞队列 这篇文章我们主要聊聊并发包下的阻塞队列 阻塞队列 什么是队列&#xff1f; 队列的实现可以是数组、也可以是链表&#xff0c;可以实现先进先出的顺序队列&#xff0c;…

【矩阵分解】PCA - 主成分分析中的数学原理

前言 本文主要对PCA主成分分析中的数学原理进行介绍&#xff0c;将不涉及或很少涉及代码实现或应用&#xff0c;阅读前请确保已了解基本的机器学习相关知识。 文章概述 PCA主成分分析属于矩阵分解算法中的入门算法&#xff0c;通过分解特征矩阵来实现降维。 本文主要内容&a…

【PowerQuery】Excel 一分钟以内刷新PowerQuery数据

当需要进行刷新的周期如果小于一分钟,采用数据自动刷新就无法实现自动刷新的目标。那就没有办法了吗?当然不是,这里就是使用VBA来实现自动刷新。这里实现VBA刷新的第一步就是将当前的Excel 保存为带有宏的Excel 文件,如果不带宏则无法运行带有宏代码的Excel文件,保存过程如…

JAVA中的String类中的一些常用方法

目录 字符串比较方法&#xff1a; boolean equals(Object anObject)&#xff1a; int compareTo(String s)&#xff1a; int compareToIgnoreCase(String str) 字符串查找方法&#xff1a; char charAt(int index)&#xff1a; int indexOf(int ch)&#xff1a; int inde…

sqlserver2012性能优化配置:设置性能相关的服务器参数

前言 sqlserver2012 长时间运行的话会将服务器的内存占满 解决办法 通过界面设置 下图中设置最大服务器内存 通过执行脚本设置 需要先开发开启高级选项配置才能设置成功 设置完成之后将高级选择配置关闭&#xff0c;还原成跟之前一样 --可以配置高级选项 EXEC sp_conf…

MySQL--数据库基础

数据库分类 数据库大体可以分为 关系型数据库 和 非关系型数据库 常用数据类型 数值类型&#xff1a; 分为整型和浮点型&#xff1a; 字符串类型 日期类型

【SpringMVC】一行代码完成文件上传JRebel的使用

目录 引言 一、JRebel的使用 1.1.安装JReble 1.2.反向代理工具 1.3.离线使用 二、文件上传 2.1.公共文件跳转 2.2.添加依赖 2.3.配置文件上传解析器 2.4.图片路径配置Tomcat 2.5.前端代码 2.6.文件上传实现 三、文件下载 3.1.Controller层 3.2.前端代码 四、多文…

Jetsonnano B01 笔记4:UART 通信配置及编程

今日继续我的Jetsonnano学习之路&#xff0c;今日学习使用Jetson硬件驱动之UART串口通信&#xff1a; 目录 简议串口通信&#xff1a; 硬件连接&#xff1a; 串口配置&#xff1a; 安装串口函数库&#xff1a; 设置权限&#xff1a; Python代码配置&#xff1a; 下载测试…

机器学习实战-系列教程5:手撕线性回归4之非线性回归(项目实战、原理解读、源码解读)

11、非线性模型 当得到一个回归方程会&#xff0c;得到一条直线来拟合这个数据的统计规律&#xff0c;但是实际中用这样的简单直线很显然并不能拟合出统计规律&#xff0c;所谓线性回归比如两个变量之间关系就直接用一条直线来拟合&#xff0c;2个变量和一个1个变量的关系就用…

PDF 工具箱

PDF 工具箱 V9.0.0.1 程序&#xff1a;VB.net 运行库&#xff1a;NET Framework 4.5 功能简介&#xff1a; 1、PDF文件多文件合并&#xff0c;可调整顺序。 2、PDF文件拆分&#xff0c;将每页拆分成独立的PDF文件。 3、PDF文件添加水印&#xff0c;文字或图片水印&…

代码随想录 -- day46 --139.单词拆分

139.单词拆分 dp[i] : 字符串长度为i的话&#xff0c;dp[i]为true&#xff0c;表示可以拆分为一个或多个在字典中出现的单词 递推公式是 if([j, i] 这个区间的子串出现在字典里 && dp[j]是true) 那么 dp[i] true。 本题一定是 先遍历 背包&#xff0c;再遍历物品 c…