SpringBoot集成缓存功能

1. 缓存规范

Java Caching定义了五个核心接口,分别是:CachingProvider、CacheManager、Cache、Entry和Expiry。

  • CachingProvider:定义了创建、配置、获取、管理和控制多个CacheManager。一个应用可以在运行期访问多个CachingProvider。
  • CacheManager:定义了创建、配置、获取、管理和控制多个唯一命名的Cache,这些Cache存在于CacheManager的上下文中。一个CacheManager仅被一个CachingProvider所拥有。
  • Cache:是一个类似Map的数据结构并临时存储以key为索引的值,一个Cache仅被一个CacheManager所拥有。
  • Entry:是一个储存在Cache中的key-value对。
  • Expiry:每一个储存在Cache中的条目有一个定义的有效期。一旦超过这个时间,条目为过期的状态。一旦过期,条目将不可访问、更新和删除。缓存有效期可以通过ExpiryPolicy设置。

2. 缓存抽象

Spring从3.1开始定义了org.springframework.cache.Cache和org.springframework.cache.CacheManager接口来统一不同的缓存技术,并支持使用JCache(JSR-107)注解简化开发。

  • Cache接口为缓存的组件规范定义,包含缓存的各种操作集合。
  • Cache接口下Spring提供了各种xxxCache的实现,如RedisCache、EhcacheCache、ConcurrentMapCache等。
描述
Cache 缓存接口,定义缓存操作,实现有RedisCache、EhcacheCache、ConcurrentMapCache等
CacheManager 缓存管理器,管理各种缓存(Cache)组件
@Cacheable 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存
@CacheEvict 清空缓存
@CachePut 保证方法被调用,又希望结果被缓存
@EnableCaching 开启基于注解的缓存
keyGenerator 缓存数据时key的生成策略
serialize 缓存数据时value的序列化策略
@Cacheing 指定多个缓存策略

3. 缓存装配

Spring Boot提供的缓存自动配置都记录在CacheAutoConfiguration中,其中CacheConfigurationImportSelector最为关键,它帮助我们导入常用缓存组件,组件如下:

  • org.springframework.boot.autoconfigure.cache.GenericCacheConfiguration
  • org.springframework.boot.autoconfigure.cache.JCacheCacheConfiguration
  • org.springframework.boot.autoconfigure.cache.EhCacheCacheConfiguration
  • org.springframework.boot.autoconfigure.cache.HazelcastCacheConfiguration
  • org.springframework.boot.autoconfigure.cache.InfinispanCacheConfiguration
  • org.springframework.boot.autoconfigure.cache.CouchbaseCacheConfiguration
  • org.springframework.boot.autoconfigure.cache.RedisCacheConfiguration
  • org.springframework.boot.autoconfigure.cache.CaffeineCacheConfiguration
  • org.springframework.boot.autoconfigure.cache.SimpleCacheConfiguration
  • org.springframework.boot.autoconfigure.cache.NoOpCacheConfiguration

使用缓存时只需要导入对应的实现即可,Spring Boot自动帮我们装配。

4. 简单缓存

使用Spring Boot提供的基于Map的内存级缓存

4.1 依赖管理

引入Spring Boot缓存场景启动器,默认导入的就是SimpleCacheConfiguration配置,是基于Map的内存级缓存

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

4.2 开启缓存

通过@EnableCacheing注解开启基于注解的缓存

java 复制代码
@EnableCaching  // 开启基于注解的缓存
@SpringBootApplication
public class SimpleCacheServiceApplication {
    
    public static void main(String[] args) {
        // 启动应用程序
        SpringApplication.run(SimpleCacheServiceApplication.class, args);
    }
}

4.3 Cacheable

@Cacheable:先查询缓存数据,如果存在直接取出缓存数据返回,如果不存在就执行目标方法,将方法返回值存入缓存,常用于查询数据。

  • 注解属性
属性 描述
cacheNames 缓存的名字
key 缓存索引,默认使用方法参数值
keyGenerator 缓存索引生成器,与key属性二选一
cacheManager 缓存管理器
condition 满足条件进行缓存
unless 满足条件不进行缓存
sync 是否使用异步,默认为false
java 复制代码
@Override
@Cacheable(cacheNames = "user", key = "#userId")
public User findUserInformationByUserId(Integer userId) {
    log.info("通过用户编号查询用户信息......");
    return new User(userId, "Jack", LocalDateTime.now(), true);
}
  • 第一次调用:先查询缓存,此时缓存中不存在数据,执行目标方法后将目标方法返回数据存入缓存

  • 第二次调用:先查询缓存,此时缓存存在数据不执行目标方法

4.4 CachePut

@CachePut:每次都先执行目标方法,将方法返回值存入缓存,常用于添加数据和修改数据。

  • 注解属性
属性 描述
cacheNames 缓存的名字
key 缓存索引,默认使用方法参数值
keyGenerator 缓存索引生成器,与key属性二选一
cacheManager 缓存管理器
condition 满足条件进行缓存
unless 满足条件不进行缓存
java 复制代码
@Override
@CachePut(cacheNames = "user", key = "#user.userId")
public Boolean insertUserInformation(User user) {
    log.info("业务层 - 添加用户信息......");
    return true;
}

4.5 CacheEvict

@CacheEvict:在执行目标方法之后清除缓存,也可以指定在执行目标方法之前清除缓存,常用于删除数据。

  • 注解属性
属性 描述
cacheNames 缓存的名字
key 需要清除缓存的索引,默认使用方法参数值
keyGenerator 缓存索引生成器,与key属性二选一
cacheManager 缓存管理器
condition 满足条件进行清除缓存
allEntries 是否清除全部缓存,默认为false
beforeInvocation 是否在目标方法执行之前清除缓存,默认为false
java 复制代码
@Override
@CacheEvict(cacheNames = "user", key = "#userId")
public Boolean deleteUserInformationByUserId(Integer userId) {
    log.info("业务层 - 删除用户信息......");
    return true;
}

4.6 Caching

@Caching:方法级注解,可以指定复杂的缓存策略。

4.7 CacheConfig

@CacheConfig:类级注解,配置该类缓存策略的一些公共属性,比如缓存名称、缓存管理器、缓存索引生成策略

相关推荐
bing_15813 分钟前
Spring Boot 中如何启用 MongoDB 事务
spring boot·后端·mongodb
chunfeng—17 分钟前
Redis 主从同步与对象模型(四)
数据库·redis·缓存·集群·哨兵
张哈大1 小时前
【 Redis | 实战篇 缓存 】
数据库·redis·笔记·spring·缓存
Code哈哈笑2 小时前
【图书管理系统】深度讲解:图书列表展示的后端实现、高内聚低耦合的应用、前端代码讲解
java·前端·数据库·spring boot·后端
JAVA坚守者3 小时前
深度解析 MySQL 与 Spring Boot 长耗时进程:从故障现象到根治方案(含 Tomcat 重启必要性分析)
spring boot·mysql·事务管理·连接池优化·数据库故障·慢查询治理·tomcat 运维
薯条不要番茄酱3 小时前
【SpringBoot】从环境准备到创建SpringBoot项目的全面解析.
java·spring boot·后端
向哆哆5 小时前
Spring 框架实战:如何实现高效的依赖注入,优化项目结构?
java·spring·log4j
霸道流氓气质5 小时前
SpringCloud入门教程合集(1)-SpringCloud简介与Eureka+Feign实现服务注册中心、服务提供与服务消费
spring·spring cloud·eureka
小杜-coding9 小时前
黑马点评day04(分布式锁-setnx)
java·spring boot·redis·分布式·spring·java-ee·mybatis
caihuayuan510 小时前
升级element-ui步骤
java·大数据·spring boot·后端·课程设计