缓存ehcache:开启缓存,实现调用同一条语句,只执行一次。即将sql查询数据缓存到内存中,所以对象要实现序列化对象以保存在内存中。
一、配置ehcache
ehcache的pom文件配置项
<!-- ehcache -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/net.sf.ehcache/ehcache -->
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
</dependency>
需要在对应的实现类开启缓存,加上对应的配置名
@Cacheable(value = "users")
找不到类错误:
Caused by: java.lang.IllegalArgumentException: Cache configuration does not exist 'ServletContext resource [/ehcache.xml]'
解决方法:
路径上加上classpath:
spring.cache.ehcache.config=classpath:ehcache.xml
小知识点:
对于要缓存的对象,需要实现序列化接口
public class Users implements Serializable
二、对于ehcache的注解要点
1.@cacheable
@Cacheable(value = “缓存配置方案名称”,key = “#对应属性的名字.对应属性的值”)
例如:@Cacheable(value = “users”,key = “#pageable.pageSize”)
小知识点:
key为当前缓存在内存中的唯一标识符,通常为一个对象。不同对象不同标识符,可采用"."的形式用他的属性来当唯一标识符
相同pageable对象采用缓存,不同pageable对象则可以使用#pageable.pageSize配置ilai对应相同的的pageSize
例子:
@Test
public void testFindUserAll() {
System.out.println(userService.findUserByPage(PageRequest.of(1,2)).getTotalElements());
System.out.println(userService.findUserByPage(PageRequest.of(1,2)).getTotalElements());
System.out.println(userService.findUserByPage(PageRequest.of(1,3)).getTotalElements());
}
运行结果:
2.@cacheEvict:由于更新数据库,数据不一致,则需要清除缓存
例子:
未加注解:
@Test
public void testFindAll() {
System.out.println(userService.findUserAll().size());
Users users=new Users();
users.setAdress("asd");
users.setAge(22);
users.setName("ceshi");
this.userService.saveUsers(users);
System.out.println(userService.findUserAll().size());
}