Spring | Spring Cache 缓存框架
Spring Cache 缓存框架:
- Spring Cache功能介绍
- Spring Cache的Maven依赖
- Spring Cache的常用注解
- @EnableCaching注解
- @CachePut注解
- @Cacheable注解
- @CacheEvict注解
Spring Cache功能介绍
Spring Cache是Spring的一个框架,实现了基于注解的缓存功能。只需简单加一个注解,就能实现缓存功能。
Spring Cache提供了一层抽象,底层可以切换不同的缓存实现。比较常见的(底层)缓存实现有:
Redis、EHCache、Caffeine。可自定义地修改Spring Cache底层的缓存实现。比如: 你想用Redis进行缓存,可修改Spring Cache配置,让其底层通过Redis来实现缓存功能。
在具体的项目中,想切换Spring Cache底层的“缓存实现”时,
只需修改该 “缓存实现”的依赖,Spring Cache底层就会自动切换“缓存实现”。
例如:此时的底层的缓存实现为: EHCache,想修改为Redis,只需把Redis依赖修改为EHCache的依赖即可。 (当然你的电脑得提前装好Redis、配置好Redis)
Spring Cache的Maven依赖
<!-- Spring-data-redis依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- Spring Cache的依赖,结合上面的Redis依赖,所以该Cache框架的底层“缓存实现”为: Redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
Spring Cache的常用注解
@EnableCaching注解
- 通常加在类 (启动类 )上,用于 开启缓存注解功能。
@Slf4j @SpringBootApplication @EnableCaching //开启缓存注解功能 public class CacheDemoApplication { public static void main(String[] args) { SpringApplication.run(CacheDemoApplication.class,args); log.info("项目启动成功..."); } }
@CachePut注解
一般加在方法上,将方法的返回值放到缓存中。
(只能“放”缓存数据)@PostMapping /* * 当数据插入到数据库的同时,还需要把这个数据保存到Redis中一份(进行数据的缓存), * 此时可用Spring Cache框架的 @CachePut注解 :将方法的返回值存入到缓存中。 */ //使用Spring Cache缓存数据 /* 如果此时User的id为1,那么存入Redis中的“key名称”为: userCache::1 */ @CachePut(cacheNames = "userCache",key = "#user.id") public User save(@RequestBody User user){ userMapper.insert(user); return user; }
@CachePut注解的多种实现方式:
@PostMapping /* * 当数据插入到数据库的同时,还需要把这个数据保存到Redis中一份(进行数据的缓存), * 此时可用Spring Cache框架的 @CachePut注解 :将方法的返回值存入到缓存中。 */ //使用Spring Cache缓存数据 /* 如果此时User的id为1,那么存入Redis中的“key名称”为: userCache::1 */ @CachePut(cacheNames = "userCache",key = "#user.id") /* #result得到是一个User对象,结合该对象的id,生成存入Redis数据库中的 key */ @CachePut(cacheNames = "userCache",key = "#result.id") //存入Redis的key名为: userCache::1 --对象导航 /* #p0 : 获得save()方法的第一个参数,即User对象 */ @CachePut(cacheNames = "userCache",key = "#p0.id") //存入Redis的key名为: userCache::1 /* #a0 : 获得方法的第一个参数,... */ @CachePut(cacheNames = "userCache",key = "#a0.id") //存入Redis的key名为: userCache::1 /* #root.args[1] : 获得第一个参数 */ @CachePut(cacheNames = "userCache",key = "#root.args[1].id") //存入Redis的key名为: userCache::1 //上面的@CachePut()注解选其中一个使用即可。 public User save(@RequestBody User user){ userMapper.insert(user); return user; }
@Cacheable注解
- 一般加在方法上,在方法执行前,先查询缓存中是否有数据,如果有数据,则直接返回缓存数据,如果没有缓存数据,调用方法并将方法返回值放到缓存中。
(即“可”取缓存数据,也可“放”缓存数据)
@GetMapping /* 在方法执行前,先查询缓存中是否有数据,如果有数据,则直接返回缓存数据。 如果没有缓存数据,调用方法并将方法返回值放到缓存中。 */ @Cacheable(cacheNames = "userCache",key = "#id") // key的生成 : userCache::10 public User getById(Long id){ //如果该id的值为: 10 User user = userMapper.getById(id); return user; }
@CacheEvict注解
- 一般加在方法上,有 一条或多条缓存数据从缓存中删除。
/* 数据库中的数据被删掉了,对应的也需要给清理掉 (清除一条缓存数据) */ @CacheEvict(cacheNames="userCache",key ="#id") //清理一条或多条缓存数据 @DeleteMapping public void deleteById(Long id){ userMapper.deleteById(id); } /* 数据库中的数据被删掉了,对应的也需要给清理掉 (清除多条缓存数据) */ @CacheEvict(cacheNames = "userCache",allEntries = true) //清理一条或多条缓存数据 @DeleteMapping("/delAll") public void deleteAll(){ userMapper.deleteAll(); }