springboot+ehcache

蒋波光
2023-12-01

缓存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());
	}
 类似资料: