本节记录springboot+JPA整合redis实现简单的缓存管理
目录
1、添加redis依赖,并Reload project2
<!--redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.0.3.RELEASE</version>
</dependency>
2、配置redis
# redis
spring.redis.host=192.168.77.193
spring.redis.port=6379
在启动类DemoJpaApplication上添加@EnableCaching注解
@SpringBootApplication
@EnableCaching
public class DemoJpaApplication {
public static void main(String[] args) {
SpringApplication.run(DemoJpaApplication.class, args);
}
}
3、在controller中使用缓存管理
在BookController的getBook上添加@Cacheable注解
@RequestMapping("/getbook")
@ResponseBody
@Cacheable(cacheNames = "books",unless = "#result==null")
public List<Book> getbook() {
return bookRepo.findAll();
}
4、测试
访问/book/getbook接口报错,后台报错信息如下:
[Request processing failed; nested exception is org.springframework.data.redis.serializer.SerializationException: Cannot serialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to serialize object using DefaultSerializer; nested exception is java.io.NotSerializableException: com.galago.demo_jpa.entity.Book] with root cause
从报错信息可看出是Book类没有序列化导致报错。
Book序列化后,重启项目再次访问,未报错,问题解决
1)通过浏览器再访问多次,发现数据正常返回,后台没有打印查询语句,说明是从缓存中获取的数据
2)通过redis-cli验证是否存到缓存中,检测如下:
使用@CachePut、@CacheEvict、@Cacheable注解对update和delete实现缓存管理
@RequestMapping("/getbook")
@ResponseBody
@Cacheable(cacheNames = "books",unless = "#result==null")
public List<Book> getbook() {
return bookRepo.findAll();
}
@RequestMapping("/getByid")
@ResponseBody
@Cacheable(cacheNames = "book")
public Book getOneBook(Integer id) {
return bookRepo.getById(id);
}
@PostMapping("/add")
@ResponseBody
@CachePut(cacheNames = "book", key="#result.id")
public Book addBook(Book book) {
return bookRepo.save(book);
}
@RequestMapping("/del")
@ResponseBody
@CacheEvict(cacheNames = "book")
public void deleteById(Integer id) {
System.out.println(id);
bookRepo.deleteById(id);
}
SpringCache 的注解
1. 注解说明
@CacheConfig: 一般配置在类上,指定缓存名称,这个名称是和上面“置缓存管理器”中缓存名称的一致。
@Cacheable: 用于对方法返回结果进行缓存,如果已经存在该缓存,则直接从缓存中获取,缓存的key可以从入参中指定,缓存的 value 为方法返回值。
@CachePut: 无论是否存在该缓存,每次都会重新添加缓存,缓存的key可以从入参中指定,缓存的value为方法返回值,常用作于更新。
@CacheEvict: 用于清除缓存
@Caching: 用于一次性设置多个缓存。2. 常用注解配置参数
value: 缓存管理器中配置的缓存的名称,这里可以理解为一个组的概念,缓存管理器中可以有多套缓存配置,每套都有一个名称,类似于组名,这个可以配置这个值,选择使用哪个缓存的名称,配置后就会应用那个缓存名称对应的配置。
key: 缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合。
condition: 缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存。
unless: 不缓存的条件,和 condition 一样,也是 SpEL 编写,返回 true 或者 false,为 true 时则不进行缓存。
参考:
SpringBoot整合Redis缓存_Sun-yz的博客-CSDN博客_springboot整合redis实现缓存管理中