目录
一:Spring Cache简介
二:Spring Cache常用注解
2.1:@EnableCaching
2.2: @Cacheable
2.3:@CachePut
2.4:@CacheEvict
三:Spring Cache案例
3.1:先在pom.xml中引入两个依赖
3.2:案例
3.2.1:构建数据库表
3.2.2:构建User类
3.2.3:构建Controller mapper层代码
3.2.4:在启动类上添加注解@EnableCaching
3.2.5:使用剩余部分注解
一:Spring Cache简介
Spring Cache是一个框架,实现了基于注解的缓存功能,只需要一个简单的注解,就能实现缓存功能。
Spring Cache提供了一层抽象,底层可以切换不同的缓存实现,例如: EHche Caffeine Redis.对应的不同缓存有不同的依赖。
二:Spring Cache常用注解
2.1:@EnableCaching
开启缓存注解功能,通常用在启动类上。
2.2: @Cacheable
在某个方法执行前先查询缓存中是否有数据,如果有数据,则直接返回缓存数据value的值;如果没有缓存数据,调用方法并将返回值放到缓存中。
2.3:@CachePut
将方法的返回值放到缓存中。
2.4:@CacheEvict
将一条或多条数据从缓存中删除
三:Spring Cache案例
3.1:先在pom.xml中引入两个依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
3.2:案例
3.2.1:构建数据库表
create database spring_cache_demo;
use spring_cache_demo;
CREATE TABLE `user` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(45) DEFAULT NULL,
`age` int DEFAULT NULL,
PRIMARY KEY (`id`)
);
3.2.2:构建User类
@Data
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String name;
private int age;
}
3.2.3:构建Controller mapper层代码
由于当前业务逻辑比较简单,所以我们不需要service层的代码
//Controller层
@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
@Autowired
private UserMapper userMapper;
@PostMapping
public User save(@RequestBody User user){
userMapper.insert(user);
return user;
}
@DeleteMapping
public void deleteById(Long id){
userMapper.deleteById(id);
}
@DeleteMapping("/delAll")
public void deleteAll(){
userMapper.deleteAll();
}
@GetMapping
public User getById(Long id){
User user = userMapper.getById(id);
return user;
}
}
//mapper层代码
@Mapper
public interface UserMapper{
@Insert("insert into user(name,age) values (#{name},#{age})")
@Options(useGeneratedKeys = true,keyProperty = "id")
void insert(User user);
@Delete("delete from user where id = #{id}")
void deleteById(Long id);
@Delete("delete from user")
void deleteAll();
@Select("select * from user where id = #{id}")
User getById(Long id);
}
3.2.4:在启动类上添加注解@EnableCaching
@Slf4j
@EnableCaching//代表开启注解
@SpringBootApplication
public class CacheDemoApplication {
public static void main(String[] args) {
SpringApplication.run(CacheDemoApplication.class,args);
log.info("项目启动成功...");
}
}
3.2.5:使用剩余部分注解
当是插入操作时,我们考虑用哪个注解?
我们考虑使用的是@CachePut这个注解(原因:这个注解是将方法的返回值存储到缓存当中)。
@Autowired
private UserMapper userMapper;
@CachePut(cacheNames = "userCache",key ="#user.id")
//如果使用springCache缓存数据,key的生成:userCache:
@PostMapping
public User save(@RequestBody User user){
userMapper.insert(user);
return user;
}
同时在mapper接口中,要加入user的id返回的注解,代码如下:
@Insert("insert into user(name,age) values (#{name},#{age})")
@Options(useGeneratedKeys = true,keyProperty = "id")
void insert(User user);
接口文档中进行测试:
Redis中进行查看:
当根据用户的id查询用户时,我们该使用哪个注解?
我们使用@Cacheable注解(在方法执行前,判断有没有缓存数据,如果有,直接进行返回,如果没有,则调用方法并将数据放到缓存当中)。
@GetMapping
@Cacheable(cacheNames = "userCache", key="#id")
//key的生成:userCache:id value:为查询相应的数据,若是查询到,直接进行返回,如果查询不到,则将其加入到缓存
public User getById(Long id){
User user = userMapper.getById(id);
return user;
}
当删除一条或者多条数据时,使用哪个注解?
这个比较简单,我们使用@CacheEvit注解(这个注解可以删除一条或者多条数据)。
@DeleteMapping
@CacheEvict(cacheNames = "userCache",key="#id")
public void deleteById(Long id){
userMapper.deleteById(id);
}
@DeleteMapping("/delAll")
@CacheEvict(cacheNames = "userCache",allEntries=true)
public void deleteAll(){
userMapper.deleteAll();
}