一、缓存技术概念:
缓存技术就是为了减少代码对数据库的频繁操作,提高代码运行效率的一种技术,核心思想就是将一些频繁读取且很少修改的数据存放到内存中(Redis)存储起来,用户频繁查看的时候即可直接从内存中调用,无需查询数据库。
二、SpringCache基于注解的缓存技术:
SpringCache是一个框架,实现了基于注解的缓存技术,只需要添加一个简单的注解即可完成缓存的操作
SpringCache只提供了一层抽象,对底层使用哪种缓存技术并不影响,例如:EHCache、Caffeine、Redis等,底层可随意切换,不用改动代码
三、SpringCache的常用注解:
注解 | 说明 |
@EnableCaching | 开启缓存注解功能,通常加在启动类上 |
@Cacheable | 在方法执行前先查询缓存中是否有数据,如果有数据,则直接返回缓存数据;如果没有缓存数据,调用方法并将方法返回值放到缓存中 |
@CachePut | 将方法的返回值放到缓存中 |
@CacheEvict | 将一条或多条数据从缓存中删除 |
四、SpringCache的使用:
1、导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
<version>2.7.3</version>
</dependency>
2、开启注解缓存:
直接在程序启动类上添加@EnableCaching注解即可
3、使用注解进行缓存:
@CachePut 说明:
作用: 将方法返回值,放入缓存
value: 缓存的名称, 每个缓存名称下面可以有很多key
key: 缓存的key ----------> 支持Spring的表达式语言SPEL语法
/**
* CachePut:将方法返回值放入缓存
* value:缓存的名称,每个缓存名称下面可以有多个key
* key:缓存的key
*/
@PostMapping
@CachePut(value = "userCache", key = "#user.id")//key的生成:userCache::1
public User save(@RequestBody User user){
userMapper.insert(user);
return user;
}
注意:注解属性中的value和key未来会组成缓存中的key,上述代码的key取的参数中的id属性
@Cacheable 说明:
作用: 在方法执行前,spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中
value: 缓存的名称,每个缓存名称下面可以有多个key
key: 缓存的key ----------> 支持Spring的表达式语言SPEL语法
/**
* Cacheable:在方法执行前spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据, *调用方法并将方法返回值放到缓存中
* value:缓存的名称,每个缓存名称下面可以有多个key
* key:缓存的key
*/
@GetMapping
@Cacheable(cacheNames = "userCache",key="#id")
public User getById(Long id){
User user = userMapper.getById(id);
return user;
}
@CacheEvict 说明:
作用: 清理指定缓存
value: 缓存的名称,每个缓存名称下面可以有多个key
key: 缓存的key ----------> 支持Spring的表达式语言SPEL语法
@DeleteMapping
@CacheEvict(cacheNames = "userCache",key = "#id")//删除某个key对应的缓存数据
public void deleteById(Long id){
userMapper.deleteById(id);
}
@DeleteMapping("/delAll")
@CacheEvict(cacheNames = "userCache",allEntries = true)//删除userCache下所有的缓存数据
public void deleteAll(){
userMapper.deleteAll();
}
注意:
1、在使用SpringCache时一定要注意缓存的key不可存在冲突,不然容易造成缓存数据与数据库数据不一致;
2、再对数据进行修改操作(增删改)的时候一定要清理缓存,不然会导致缓存数据与数据库数据不一致;