当前位置: 首页 > news >正文

Spring Cache

什么是Spring Cache?

Spring Cache是Spring框架的一个模块,它提供了对应用程序方法级别的缓存支持。通过使用Spring Cache,您可以在方法的结果被计算后,将其缓存起来,从而避免相同输入导致的重复计算。

Spring Cache的工作原理

Spring Cache基于注解的方式工作。当您在方法上添加了Spring Cache提供的缓存注解后,Spring会在执行方法前先检查缓存中是否已经存在了方法的返回值。如果缓存中已经有了结果,那么Spring将直接从缓存中获取返回值,并且不会再执行实际的方法体。如果缓存中没有结果,Spring会执行方法的实际逻辑,并将返回值存储到缓存中,以备将来使用。

Spring Cache支持各种缓存提供商,例如Ehcache、Caffeine、Redis等,您可以根据需求来选择合适的缓存实现。

Spring Cache的常用注解

  1. @EnableCaching : 开启缓存注解功能,通常加在启动类上

  2. @CachePut: 该注解也标记在方法上,用于指示方法的结果应该被缓存,但是它在每次调用后都会执行方法体,并将返回值更新到缓存中。

  3. @CacheEvict: 该注解标记在方法上,用于从缓存中移除一个或多个条目。可以指定多个缓存名称或者缓存键,当方法执行时,相关的缓存条目将被从缓存中清除。

  4. @Cacheable: 在方法执行前先查询缓存中是否有数据,如果有数据,则直接返回缓存数据;如果没有缓存数据,调用方法并将方法返回值放到缓存中

Spring Cache的使用场景

Spring Cache非常适合以下情况:

  1. 频繁访问数据库或其他资源,通过缓存避免重复查询;
  2. 计算成本较高的方法,通过缓存避免重复计算;
  3. 实时性要求不高的数据,例如配置信息等;
  4. 一些通用且不经常改变的数据,例如地区信息、常量等。

起步依赖

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

入门案例

数据库准备:

创建名为spring_cache_demo数据库,将springcachedemo.sql(如下:👇)脚本直接导入数据库中。

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (`id` bigint NOT NULL AUTO_INCREMENT,`name` varchar(45) DEFAULT NULL,`age` int DEFAULT NULL,PRIMARY KEY (`id`)
);

引导类上加@EnableCaching:

package com.itheima;@Slf4j
@SpringBootApplication
@EnableCaching//开启缓存注解功能
public class CacheDemoApplication {public static void main(String[] args) {SpringApplication.run(CacheDemoApplication.class,args);log.info("项目启动成功...");}
}

@CachePut注解

@CachePut 说明:

作用: 将方法返回值,放入缓存
value: 缓存的名称, 每个缓存名称下面可以有很多key
​key: 缓存的key ----------> 支持Spring的表达式语言SPEL语法

在save方法上加注解@CachePut
当前UserController的save方法是用来保存用户信息的,我们希望在该用户信息保存到数据库的同时,也往缓存中缓存一份数据,我们可以在save方法上加上注解 @CachePut,用法如下:

	/*** CachePut:将方法返回值放入缓存* value:缓存的名称,每个缓存名称下面可以有多个key* key:缓存的key*/@PostMapping@CachePut(value = "userCache", key = "#user.id")//key的生成:userCache::1public User save(@RequestBody User user){userMapper.insert(user);return user;}

说明:

#user.id 常用: #user指的是方法形参的名称, id指的是user的id属性 , 也就是使用user的id属性作为key ;
#result.id : #result代表方法返回值,该表达式 代表以返回对象的id属性作为key ;
#p0.id:#p0指的是方法中的第一个参数,id指的是第一个参数的id属性,也就是使用第一个参数的id属性作为key ;
#a0.id:#a0指的是方法中的第一个参数,id指的是第一个参数的id属性,也就是使用第一个参数的id属性作为key ;
#root.args[0].id:#root.args[0]指的是方法中的第一个参数,id指的是第一个参数的id属性,也就是使用第一个参数的id属性作为key ;

@Cacheable

@Cacheable 说明:

作用: 在方法执行前,spring 先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中
cacheNames: 缓存的名称,每个缓存名称下面可以有多个key
key: 缓存的key ----------> 支持Spring的表达式语言SPEL语法

在getById上加注解@Cacheable

/**
* Cacheable:在方法执行前spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,	  *调用方法并将方法返回值放到缓存中
* cacheNames:缓存的名称,每个缓存名称下面可以有多个key
* key:缓存的key
*/
@GetMapping
@Cacheable(cacheNames = "userCache",key="#id")
public User getById(Long id){User user = userMapper.getById(id);return user;
}

@CacheEvict

@CacheEvict 说明:

作用: 清理指定缓存
​ cacheNames: 缓存的名称,每个缓存名称下面可以有多个key
​ key: 缓存的key ----------> 支持Spring的表达式语言SPEL语法

在 delete 方法上加注解@CacheEvict

@DeleteMapping
@CacheEvict(cacheNames = "userCache",key = "#id")//删除某个key对应的缓存数据
public void deleteById(Long id){userMapper.deleteById(id);
}@DeleteMapping("/delAll")
@CacheEvict(cacheNames = "userCache",allEntries = true)//删除userCache下所有的缓存数据
public void deleteAll(){userMapper.deleteAll();
}
http://www.lryc.cn/news/106198.html

相关文章:

  • em3288 linux_4.19 sd卡调试
  • 前端vue uni-app cc-countdown倒计时组件
  • fifo读写的数据个数
  • Java之Map接口
  • windows系统中的命令行可以用python,pip等命令(已在系统中添加过python环境变量),但是pycharm的terminal中无法使用。
  • 编译 OneFlow 模型
  • 【kubernetes】k8s单master集群环境搭建及kuboard部署
  • 0802|IO进程线程 day5 进程概念
  • 4 Promethues监控主机和容器
  • 亚马逊买家账号ip关联怎么处理
  • NO4 实验四:生成Web工程
  • 【linux】进程
  • 电商高并发设计之SpringBoot整合Redis实现布隆过滤器
  • SpringBoot第25讲:SpringBoot集成MySQL - MyBatis 注解方式
  • 服务器返回 413 Request Entity Too Large
  • 如何一目了然地监控远程 Linux 系统
  • 9.环境对象和回调函数
  • 51单片机(普中HC6800-EM3 V3.0)实验例程软件分析概览
  • ubuntu18.04 安装php7.4-xdebug
  • java 定时任务不按照规定时间执行
  • Android复习(Android基础-四大组件)—— Activity
  • Linux系统安装部署MongoDB完整教程(图文详解)
  • CSS图片放到<div>里面,自适应宽高全部显示,点击图片跳到新页面预览,点击旋转按钮图片可旋转
  • 二阶段web基础与http协议
  • SpringBoot+Freemark根据html模板动态导出PDF
  • XPath数据提取与贴吧爬虫应用示例
  • 字符串匹配-KMP算法
  • Java面向对象之UML类图
  • 【机器学习】西瓜书学习心得及课后习题参考答案—第4章决策树
  • 2023.8.2