放了一段时间假,Spring Boot系列拖更很久,接下来慢慢续更,补充这个系列。
为什么要使用缓存?
我们知道,当我们 重复获取相同数据 的时候,我们如果仍然频繁请求数据库,会导致大量时间耗费于数据库查询,使程序性能恶化(作为一个完美主义的程序猿怎么能允许这种事情发生!),所以使用缓存技术来解决这类问题。
CacheManager
CacheManager是Spring提供的各种缓存技术的抽象接口。针对不同的缓存技术,Spring定义了不同的CacheManager实现。
举例如:SimpleCacheManager使用简单的Collection存储缓存;RedisCacheManager使用Redis作为缓存技术等等。
Spring提供了 注解 @Cacheable/@CachePut/@CacheEvict 【三者详解链接】 来声明缓存规则。
tips:推荐看下上方的链接,写的很详细很好,对于下面的代码理解也有帮助。
Spring Boot中的缓存支持
Spring Boot为我们自动配置了多个CacheManager的实现,我们只需要在Configuration类前加上注解 @EnableCaching, 并在万能的application.properties中配置 Spring.cache为前缀的属性即可。
实战演示
承接之前demo代码【源码地址】,多添加一些缓存Cache 演示。
1.添加配置类AppConfig:
@Configuration
@EnableCaching //开启声明式缓存支持
public class AppConfig {
}
同时修改application.properties中,添加cache配置:
# CacheManager
spring.cache.type=simple
//这里有很多配置,可配置缓存技术类型,缓存地址,配置地址,缓存名称等等,不再详举,可自己搜索学习。
2.在demoService中添加方法声明:
public interface PersonService {
List<Person> findByName(String name);
Person save(Person person);
void remove(int id);
Person findOne(Person person);
}
其实现如下:
@Service
public class PersonServiceImpl implements PersonService {
@Autowired
PersonRepository personRepository;
@Override
public List<Person> findByName(String name) {
List<Person> people = personRepository.findByName(name);
return people;
}
@Override
@CachePut(value = "people",key = "#person.id")
public Person save(Person person) {
Person p = personRepository.save(person);
System.out.println("id为"+p.getId()+"加入缓存");
return p;
}
@Override
@CacheEvict(value = "people")
public void remove(int id) {
System.out.println("id为"+id+"删除缓存");
personRepository.delete(id);
}
@Override
@Cacheable(value = "people",key = "#person.id")
public Person findOne(Person person) {
Person p = personRepository.findOne(person.getId());
System.out.println("id为"+p.getId()+"做缓存");
return p;
}
}
3.添加一个CacheController用于实验:
@RestController
@RequestMapping("/cache")
public class CacheController {
@Autowired
private PersonService personService;
@RequestMapping("/put")
public Person put(Person person) {
return personService.save(person);
}
@RequestMapping("/evit")
public String evit(int id){
personService.remove(id);
return "ok";
}
@RequestMapping("/able")
public Person cacheAble(Person person){
return personService.findOne(person);
}
}
代码写完,运行效果如下:
页面访问时显示数据多次访问时,控制台只有一条缓存添加输出:
控制台输出情况情况
至此,便快速实现了缓存技术的应用,我们可以看出,Spring Boot在Spring对缓存cache的支持基础上简化了配置,提供了更多实现好的cacheManager接口方便于快速实现和使用。
tips:Spring Boot对于MongoDB和Redis等非关系型数据库的使用都有实现好的支持,只需在application.properties中进行配置即可,这里不再细述。
网友评论