在Spring Boot中使用进程内缓存和Cache注解

在Spring Boot中使用内缓存的时候需要预先知道什么是内缓存,使用内缓存的好处。

什么是内缓存

内缓存(也称为进程内缓存或本地缓存)是指将数据存储在应用程序的内存中,以便在需要时快速访问和检索数据,而无需每次都从外部数据源(如数据库或网络)获取数据。

内缓存通常用于提高应用程序的性能和响应速度,因为内存访问比磁盘或网络访问更快。通过将经常使用的数据存储在内存中,应用程序可以避免频繁地访问慢速的外部数据源,从而提高数据访问的效率。

内缓存可以用于各种场景,例如:

  • 数据库查询结果缓存:将数据库查询的结果存储在内存中,以便在相同的查询被再次执行时,可以直接从缓存中获取结果,而无需再次查询数据库。
  • API响应缓存:将API的响应结果存储在内存中,以便在相同的API请求被再次发起时,可以直接从缓存中获取响应结果,而无需再次调用外部API。
  • 计算结果缓存:将复杂的计算结果存储在内存中,以便在相同的计算被再次触发时,可以直接从缓存中获取结果,而无需重新执行计算逻辑。

内缓存可以使用各种缓存框架或库来实现,如Caffeine、EhCache、Redis等。这些缓存框架提供了方便的API和配置选项,使开发人员能够轻松地在应用程序中使用内缓存。

需要注意的是,内缓存是存储在应用程序的内存中的,因此它的容量是有限的。过多地使用内缓存可能会导致内存占用过高,从而影响应用程序的性能。因此,在使用内缓存时,需要根据实际需求和可用内存来进行合理的配置和管理。

案例:

引入相关依赖:

		<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>provided</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>

在配置文件中引入数据库相关属性:

spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=create-drop

创建实体类对象,其中数据库对象和实体类对象一一对应,这里就不给出数据库SQL语句了:

@Entity
//@Data
//@NoArgsConstructor
public class User {@Id@GeneratedValueprivate Long id;private String name;private Integer age;public User(String name, Integer age) {this.name = name;this.age = age;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public User() {}
}

User实体的数据访问实现:

@CacheConfig(cacheNames = "users")
public interface UserRepository extends JpaRepository<User, Long> {@CacheableUser findByName(String name);User findByNameAndAge(String name, Integer age);@Query("from User u where u.name=:name")User findUser(@Param("name") String name);}

创建一个测试类:

@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {@Autowiredprivate UserRepository userRepository;@Autowiredprivate CacheManager cacheManager;@Testpublic void test() throws Exception {// 创建1条记录userRepository.save(new User("AAA", 10));User u1 = userRepository.findByName("AAA");System.out.println("第一次查询:" + u1.getAge());User u2 = userRepository.findByName("AAA");System.out.println("第二次查询:" + u2.getAge());}}

需要在启动类中加入@EnableCaching注解:

@EnableCaching
@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}

在这里插入图片描述

如图,我们可以看到在调用第二次的findByName的时候,并没有执行select语句,这样也就减少了对数据库的读取操作。

在这里插入图片描述

在这里插入图片描述
通过图片可以看到,在第一次调用findByName函数之后,CacheManager将这个查询结果保存下来,在第二次访问的时候,就可以匹配上而不需要再次访问数据库了。

@Cacheable:该注解用于标记方法的返回值应该被缓存。当调用带有@Cacheable注解的方法时,Spring Boot会首先检查缓存中是否存在对应的结果。如果存在,则直接返回缓存的结果;如果不存在,则执行方法体中的逻辑,并将结果存储到缓存中。该注解可以指定缓存的名称、缓存的键等参数。

@CachePut:该注解用于标记方法的返回值应该被更新到缓存中。与@Cacheable不同,@CachePut注解会每次都执行方法体中的逻辑,并将结果存储到缓存中。它通常用于更新缓存中的数据,以确保缓存的数据与实际数据保持同步。

@CacheEvict:该注解用于标记方法的返回值应该从缓存中移除。当调用带有@CacheEvict注解的方法时,Spring Boot会从缓存中移除对应的结果。该注解可以指定要移除的缓存名称、缓存的键等参数。它通常用于在数据发生变化时,清除缓存中的旧数据。

@Caching:该注解用于将多个缓存相关的注解组合在一起使用。通过@Caching注解,您可以在一个方法上同时使用多个缓存相关的注解,以实现更复杂的缓存操作。

关于更多的Cache配置,我们可以参照Spring Boot官方文档。

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

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

相关文章

如何用SaleSmartly集成WhatsApp账号(内含WhatsApp个人号、商业号、API号对比图)

用SaleSmartly集成WhatsApp账号 如果企业有多个WhatsApp账号&#xff0c;无论是个人账号还是工作账号&#xff0c;员工操作起来可能会觉得难以管理和切换。SaleSmartly就可以解决这个问题&#xff0c;让员工在一个平台上同时使用多个WhatsApp账号&#xff0c;不需要频繁地登录和…

sqlmap requires ‘python-pymysql‘ third-party library

使用sqlmap进行udf提权报错&#xff1a; [14:06:04] [CRITICAL] sqlmap requires python-pymysql third-party library in order to directly connect to the DBMS MySQL. You can download it from https://github.com/PyMySQL/PyMySQL. Alternative is to use a package pyt…

关于Java抽象类和接口的总结和一点个人的看法

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ ა 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如需转载还请通知˶⍤⃝˶个人主页&am…

【Linux】Linux基础IO(上)

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;Linux &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 上一篇博客&#xff1a;【Linux】…

Linux-查询目录下包含的目录数或文件数

1. 前置 1&#xff09;ls Linux最常用的命令之一&#xff0c;列出该目录下的包含内容。 -l&#xff1a;use a long listing format-以列表的形式展现 -R&#xff1a;list subdirectories recursively-递归列出子目录 2&#xff09;| 管道符 将上一条命令的输出&#xff…

Java内存结构

1.对象的结构 一个Java对象在内存中包括3个部分&#xff1a;对象头、实例数据和对齐填充 2.虚拟机存储数据的方式 2.1小端存储 : 便于数据之间的类型转换&#xff0c;例如:long类型转换为int类型时&#xff0c;高地址部分的数据可以直接截掉。 2.2大端存储 : 便于数据类型…

LeetCode反转链表的五种Java实现方式

给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示例 3&#xff1a; 输入&a…

14——1

这句话的意思是&#xff0c;如图中月份12天数23时&#xff0c;就是1223&#xff1b;当月份9天数2时&#xff0c;就是0902. 可以看到在上面给出的数组元素中&#xff0c;并没有连续挨在一起的2023数字元素——就有人可能输出答案0。 所以这里要看一下—— ——子序列的含义&…

AM驱动架构—优质Mini-LED显示技术解决方案

MiniLED背光驱动方案作为一种新兴的显示技术方案&#xff0c;具有更高的亮度、更广的色域范围和更低的功耗等优势&#xff1b;以其出色的性能和广泛的应用前景备受关注是实现MiniLED显示效果的重要环节。 MiniLED背光驱动方案是指通过控制MiniLED芯片的电流和亮度&#xff0c;…

JavaScript语法、语句、数据类型

一、JavaScript语法&#xff1a; 1、JavaScript字面量&#xff1a; JavaScript中的固定值称为字面量。数字字面量可以是整数、小数或者科学计数&#xff08;e&#xff09;,如3.1415926、1008、123e5等&#xff1b;字符串字面量可以使用单引号或者双引号&#xff0c;如“corli…

k8s的error: metrics not available yet问题处理

kubectl top node报错处理 解决步骤环境说明问题现象初次排查问题解决版本兼容性metric-server.yaml 问题验证 解决步骤 因项目要求&#xff0c;需在k8s集群中使用 kubectl top node命令&#xff0c;但是一直报error: metrics not available yet错误。为了更好的复现问题&…