一、Spring缓存
抛出问题:什么是缓存?
缓存是一种用于临时存储数据的技术,旨在提高数据访问的速度和效率。它通过将经常被访问或需要频繁计算的数据保存在快速访问的位置,以便在后续的访问中能够更快地获取这些数据。
缓存可以存在于多个层级,例如:
-
硬件缓存:主要是指CPU内部的缓存,如L1、L2和L3缓存。这些缓存通常由硬件自动管理,并用于存储近期使用的指令和数据,以提高CPU的执行速度。
-
操作系统缓存:操作系统会维护各种类型的缓存来加速文件系统、网络和其他资源的访问。例如,文件缓存用于缓存最近读取的文件内容,以减少对物理磁盘的访问次数。
-
应用程序缓存:开发人员可以在应用程序级别实现缓存机制,为特定的数据或计算结果提供快速访问。这些缓存可以是内存中的数据结构,用于存储已经检索到的数据库记录、计算结果或其他重要数据。
缓存的工作原理是通过在内存中存储数据副本,并采用更快的读写方式进行访问。当需要访问数据时,首先检查缓存中是否存在该数据。如果存在,则直接从缓存中获取;如果不存在,则需要从原始来源(如磁盘或数据库)获取,并将其存储到缓存中,以便下次使用。
通过使用缓存,可以大大减少数据访问的延迟和负载,提高系统的性能和响应速度。然而,缓存也需要考虑一些问题,如缓存一致性、缓存过期策略和容量管理等,以确保缓存中的数据始终是最新和正确的。
什么是Spring缓存
Spring缓存是Spring Framework提供的一种简化数据访问和计算结果缓存的机制。它使用注解或编程方式将方法的返回值缓存起来,以便在下次相同的方法调用时能够快速返回缓存的结果,而不需要执行实际的方法体。
Spring缓存的主要目标是提高应用程序的性能和响应速度,减少对底层数据源(如数据库)或耗时计算任务的访问次数。通过将经常被访问或计算代价较高的数据保存在内存中,可以加速数据的获取和处理过程。
下面是Spring缓存的一些关键概念和组件:
-
缓存管理器(Cache Manager):负责创建、配置和管理缓存实例。它充当了缓存的中心控制器,并提供了对缓存的统一访问接口。
-
缓存注解:Spring提供了一组注解,用于在方法上声明缓存行为。常用的注解包括
@Cacheable
、@CachePut
、@CacheEvict
和@Caching
等。通过在方法上添加这些注解,可以指定缓存的操作(读取、写入、删除等)和缓存策略。 -
缓存切面:Spring AOP框架可用于在方法执行前后织入缓存逻辑。通过在应用程序中配置缓存切面,可以自动拦截方法调用并处理缓存相关的逻辑。
-
缓存键(Cache Key):每个缓存条目都需要一个唯一的缓存键来标识。Spring缓存使用方法参数和其他相关信息生成缓存键,以确保不同的方法调用能够区分开来。
-
缓存策略:Spring缓存允许根据需求定义不同的缓存策略。例如,可以设置缓存的过期时间、内存容量限制、缓存更新策略等。
使用Spring缓存,开发人员可以轻松地将缓存逻辑集成到应用程序中,提高数据访问的性能和响应速度。同时,Spring缓存提供了灵活的配置选项,可以根据具体需求进行定制和扩展。
Spring缓存的注解
@Cacheable
用于标记方法的返回值应该被缓存起来,以便在后续相同的方法调用时能够直接从缓存中获取结果,而不需要执行实际的方法体。
参数:
value
(可选):指定使用的缓存名称,可以是单个缓存名称或多个缓存名称的数组。如果未指定,则使用默认的缓存名称。
key
(可选):指定缓存条目的键。可以使用SpEL表达式定义动态的键,以根据方法参数或其他条件生成不同的缓存键。
condition
(可选):指定一个SpEL表达式,用于判断是否执行缓存逻辑。如果条件为false,则不会缓存方法的结果。
unless
(可选):指定一个SpEL表达式,用于进一步过滤缓存的条件。如果条件为true,则不会缓存方法的结果。
sync
(可选):指定是否启用异步模式来执行缓存操作,默认为false。
@Cacheable
注解应该与缓存管理器(CacheManager
)配合使用。需要在应用程序中配置相应的缓存管理器,以便确保缓存功能正常工作。
对于相同的方法调用,要保证缓存键的唯一性,否则可能导致缓存冲突或错误的结果。
当有多个缓存管理器时,需要通过value
参数明确指定使用哪个缓存管理器。
@CachePut
用于标记方法的返回值应该被更新或添加到缓存中。与@Cacheable
注解不同,@CachePut
总是会执行方法体,并将返回的结果放入缓存中。
下面是@CachePut
注解的详细解释:
参数:
value
(可选):指定使用的缓存名称,可以是单个缓存名称或多个缓存名称的数组。如果未指定,则使用默认的缓存名称。
key
(可选):指定缓存条目的键。可以使用SpEL表达式定义动态的键,以根据方法参数或其他条件生成不同的缓存键。
condition
(可选):指定一个SpEL表达式,用于判断是否执行缓存逻辑。如果条件为false,则不会将方法的结果放入缓存中。
unless
(可选):指定一个SpEL表达式,用于进一步过滤缓存的条件。如果条件为true,则不会将方法的结果放入缓存中。
@CachePut
注解应该与缓存管理器(CacheManager
)配合使用。需要在应用程序中配置相应的缓存管理器,以便确保缓存功能正常工作。
对于相同的缓存键,@CachePut
会覆盖已有的缓存值并更新为新的结果。
当有多个缓存管理器时,需要通过value
参数明确指定使用哪个缓存管理器。
@CacheEvict
用于标记方法执行后从缓存中删除指定条目。它可以用于移除缓存中的一项或多项数据。
下面是@CacheEvict
注解的详细解释:
参数:
value
(可选):指定使用的缓存名称,可以是单个缓存名称或多个缓存名称的数组。如果未指定,则使用默认的缓存名称。
key
(可选):指定要从缓存中删除的缓存条目的键。可以使用SpEL表达式定义动态的键,以根据方法参数或其他条件生成不同的缓存键。
condition
(可选):指定一个SpEL表达式,用于判断是否执行缓存逻辑。如果条件为false,则不会从缓存中删除条目。
@CacheEvict
注解应该与缓存管理器(CacheManager
)配合使用。需要在应用程序中配置相应的缓存管理器,以便确保缓存功能正常工作。
当有多个缓存管理器时,需要通过value
参数明确指定使用哪个缓存管理器。
@EnableCaching
用于启用Spring缓存功能。通过在配置类或应用程序的入口类上添加该注解,可以激活Spring缓存,并使得使用@Cacheable
、@CachePut
和@CacheEvict
等缓存注解生效。
下面是@EnableCaching
注解的详细解释:
当添加了@EnableCaching
注解后,Spring框架会自动创建和配置相应的缓存管理器(CacheManager
)。
缓存管理器负责创建和管理缓存实例,提供对缓存的统一访问接口。
启用缓存后,可以使用@Cacheable
、@CachePut
和@CacheEvict
等缓存注解来标记方法,并指定相应的缓存行为。
二、知识延展(复习)
1、mybatisplus
(1)导包
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
启动类@MapperScan("指定Mapper接口所在的包")
常用注解
1 | @TableName | 写数据库表明即可 |
2 | @TableId | 当使用@TableId(value = "id",type = IdType.AUTO)语句时,代表着使用数据库的自增策略 |
3 | @Data | 可以省略getter()、setter()、toString()、重写该类的equals()和hashCode()方法 |
4 | @TbaleField | 让数据库表中字段与实体类中字段名一样 |
5 | @Configuration | 代表着是一个配置类 |
6 | @Bean | 将方法中的对象注入到spring容器中 |
7 | @Param | 用于传递参数,从而可以与SQL中的的字段名相对应 |
2、jpa(Java Persistence API)
是JavaEE标准中定义的一套用于对象与关系数据库映射和持久化操作的API。它提供了一种简化和统一的方式来处理对象的持久化和检索,使开发人员能够以面向对象的方式访问和操作数据库。
以下是JPA的一些关键概念和特点:
-
实体类(Entity Class):在JPA中,实体类是映射到数据库表的Java类。每个实体类的实例对应着数据库中的一个记录。使用注解或XML配置,可以将实体类的属性与数据库表的列进行映射。
-
实体管理器(Entity Manager):实体管理器是JPA的核心接口之一,负责管理实体的生命周期、持久化、事务和查询等操作。通过实体管理器,可以进行实体的创建、存储、更新和删除等操作。
-
持久化上下文(Persistence Context):持久化上下文是实体管理器的一部分,它是一个缓存区域,用于存储被管理的实体对象。所有被加载的实体对象都会存在于持久化上下文中,并且对这些实体对象的更改会自动同步到数据库中。
-
对象-关系映射(Object-Relational Mapping,ORM):JPA提供了一种自动映射和处理Java对象与关系数据库之间的映射关系的机制。通过注解或XML配置,可以定义实体类与数据库表之间的映射规则,使开发人员能够以面向对象的方式进行数据库操作。
-
JPQL(Java Persistence Query Language):JPQL是一种面向对象的查询语言,类似于SQL,用于在JPA中查询实体对象。它支持对实体类及其属性进行查询,并提供了丰富的查询语法和功能。
JPA的出现简化了开发人员与数据库之间的操作,屏蔽了不同数据库之间的差异,提供了更高层次的抽象,使得开发人员可以更专注于业务逻辑的实现。同时,JPA也具备事务管理、缓存、延迟加载等特性,进一步提升了应用程序的性能和可维护性。