美文网首页SpringBoot程序员Spring-Boot
Spring Boot总结(7)---数据缓存Cache

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

作者: 18587a1108f1 | 来源:发表于2017-10-09 17:33 被阅读277次

    放了一段时间假,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中进行配置即可,这里不再细述。

    相关文章

      网友评论

      • 月白风清L:没看明白,是那个save方法是把一个对象缓存进一个对象里?下面的CacheController里调用了save方法后就完了?难道不应该调用remove方法释放缓存吗?或者说下次缓存会覆盖当前缓存?还有这样线程安全吗?

      本文标题:Spring Boot总结(7)---数据缓存Cache

      本文链接:https://www.haomeiwen.com/subject/qurpyxtx.html