1.@EnableCaching
@EnableCaching是启用缓存的注解,将注解标注在SpringBoot项目中的启动类上,就可以开启SpringBoot项目的缓存
@EnableCaching
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class);
}
}
2、@Cacheable
@Cacheable注解的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存。
参数:
-
cacheNames/value
:用来指定缓存组件的名字 -
key
:缓存数据时使用的 key,可以用它来指定。默认是使用方法参数的值,key 可以使用 spEL 表达式来编写。 -
condition
:可以用来指定符合条件的情况下才缓存 -
unless
:否定缓存。当 unless 指定的条件为 true ,方法的返回值就不会被缓存。 -
sync
:是否使用异步模式。
实例
Service层
@Service
public class BookServiceImpl implements IBookService {
@Autowired
private IBookMapper iBookMapper;
//对查询的结果进行缓存
@Cacheable(cacheNames = "findBooks")
@Override
public List<Book> findAllBook() {
//查询所有的书籍
List<Book> books = iBookMapper.selectList(null);
return books;
}
}
Controller层
@Api(value = "图书Api接口测试")
@RestController
@RequestMapping("/api/book")
@Slf4j
@CrossOrigin
public class BookController {
@Autowired
private IBookService iBookService;
@ApiOperation("查询所有书籍方法接口测试")
@GetMapping("/findAllBooks")
public List<Book> findAllBook(){
long start = System.currentTimeMillis();
List<Book> allBooks = iBookService.findAllBook();
long end = System.currentTimeMillis();
log.debug("查询所有功能耗时" + (end - start) + "毫秒");
return allBooks;
}
}
- 使用接口测试发送第一次请求
结果:
第一次发送请求后,日志中记录了生成的sql语句,说明第一次是在数据库中查找的,查询时间为557毫秒
- 使用接口测试发送第二次请求
结果:
两次请求之间并没有生成日志,也没有生成sql语句,第二次请求比第一次请求时间也要少很多,说明第二次并没有在数据库中查询,是在缓存中查询的。
3@CachePut
@CachePut的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存,和 @Cacheable 不同的是,它每次都会触发真实方法的调用
实例:
将Service层的@Cacheable的注解换成@CachePut
@Service
public class BookServiceImpl implements IBookService {
@Autowired
private IBookMapper iBookMapper;
//对查询的结果进行缓存
@CachePut(cacheNames = "findBooks")
@Override
public List<Book> findAllBook() {
List<Book> books = iBookMapper.selectList(null);
return books;
}
}
Controller层
@Api(value = "图书Api接口测试")
@RestController
@RequestMapping("/api/book")
@Slf4j
@CrossOrigin
public class BookController {
@Autowired
private IBookService iBookService;
@ApiOperation("查询所有书籍方法接口测试")
@GetMapping("/findAllBooks")
public List<Book> findAllBook(){
long start = System.currentTimeMillis();
List<Book> allBooks = iBookService.findAllBook();
long end = System.currentTimeMillis();
log.debug("查询所有功能耗时" + (end - start) + "毫秒");
return allBooks;
}
}
- 使用接口测试发送第一次请求
结果:
- 使用接口测试发送第二次请求
结果:
第一次发送请求,日志中显示生成了mysql语句,说明第一次是在数据库中查询的,第二次发送请求,日志中重新生成了mysql语句,说明第二次也是在数据库中查询的。@CachePut注解每次查询的时候都会调用方法,此时缓存会和数据库保持一致,@CachePut注解大部分用在改变数据库数据的方法上。
3、@CacheEvict
@CacheEvict是用来标注在需要清除缓存元素的方法或类上的。当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作。