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::10public User getById(Long id){ //如果该id的值为: 10User user = userMapper.getById(id);return user;}
@CacheEvict注解
- 一般加在方法上,有 一条或多条缓存数据从缓存中删除。
/*数据库中的数据被删掉了,对应的也需要给清理掉 (清除一条缓存数据)*/@CacheEvict(cacheNames="userCache",key ="#id") //清理一条或多条缓存数据@DeleteMappingpublic void deleteById(Long id){userMapper.deleteById(id);}/*数据库中的数据被删掉了,对应的也需要给清理掉 (清除多条缓存数据)*/ @CacheEvict(cacheNames = "userCache",allEntries = true) //清理一条或多条缓存数据@DeleteMapping("/delAll")public void deleteAll(){userMapper.deleteAll();}