Spring Boot总结(7)---数据缓存Cache

JAVA 117 2017-11-07 09:53

放了一段时间假,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总结(7)---数据缓存Cache-JEESNS
页面访问时显示数据

多次访问时,控制台只有一条缓存添加输出:


Spring Boot总结(7)---数据缓存Cache-JEESNS
控制台输出情况情况

至此,便快速实现了缓存技术的应用,我们可以看出,Spring Boot在Spring对缓存cache的支持基础上简化了配置,提供了更多实现好的cacheManager接口方便于快速实现和使用。

tips:Spring Boot对于MongoDB和Redis等非关系型数据库的使用都有实现好的支持,只需在application.properties中进行配置即可,这里不再细述。

文章评论