使用
1.主启动类加上允许缓存的注解
@SpringBootApplication
@EnableCaching
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
2.中间逻辑做一下伪造
public class ConstructInformationServiceImpl implements ConstructInformationService {
Logger logger = LoggerFactory.getLogger(getClass());
List<Person> array = new ArrayList<Person>() {
{
add(new Person("ChessC1", 25));
add(new Person("ChessC2", 25));
add(new Person("ChessC3", 25));
}
};
@Override
@Cacheable(value = "myCache", key = "#name")
public Person queryByName(String name) {
logger.info("返回结果没有走缓存");
List<Person> list = array.stream().filter(it -> "ChessC1".equals(it.getName())).collect(Collectors.toList());
return list.get(0);
}
@Override
@Cacheable(value = "myCache")
public List<Person> queryAll() {
logger.info("返回结果没有走缓存");
return array;
}
}
3.controller测试
public class ConstructInformationController {
@Autowired
public ConstructInformationService constructInformationService;
Logger logger = LoggerFactory.getLogger(getClass());
@RequestMapping("/query/{name}")
public Person queryByname(@PathVariable String name) {
Person person = constructInformationService.queryByName(name);
logger.info("查询成功,结果为 {} ", person);
return person;
}
@RequestMapping("/queryAll")
public List<Person> queryAll() {
List<Person> list = constructInformationService.queryAll();
logger.info("查询成功,结果为 {} ", list);
return list;
}
}
4.测试结果
可以看到,当第二次查询的时候,直接走了缓存。那么如果在方法上重新加上@CacheEvict(value = "myCache")
,此时又重新在每次执行之后将缓存进行清除。
分析
1.假设在yml中配置如下:
2.看一下使用缓存的方法上的注解
3.分析一下过程
CacheAutoConfiguration
自动配置类,这个类导入了一个CacheConfigurationImportSelector
类
static class CacheConfigurationImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
CacheType[] types = CacheType.values();
String[] imports = new String[types.length];
for (int i = 0; i < types.length; i++) {
imports[i] = CacheConfigurations.getConfigurationClass(types[i]);
}
return imports;
}
}
打断点看一下,也确实是上面这几类:
之前遇到的问题在于:使用了key-prefix。@Cacheable的时候虽使用了CacheName和key。但当调用一次@CacheEvict方法的时候,将项目中所有的缓存内容都清除了。
分析原因: