• 001-springboot cache 简介、基础使用


    一、概述

      缓存的目的是:通过Cache来缓存不经常改变的数据以提高系统性能和增加系统吞吐量,避免直接访问数据库等低速的存储系统。

      Spring Cache对Cache进行抽象,提供了@Cacheable、@CachePut、@CacheEvict等注解。

      可用于单体应用系统,也可集成Redis等缓存服务器用于大型系统或者分布式系统。

      Spring从3.1开始定义了org.springframework.cache.Cache和org.springframework.cache.CacheManager接口来统一不同的缓存技术;提供了对现有Spring应用程序透明地添加缓存的支持。与事务支持类似,缓存抽象允许一致地使用各种缓存解决方案,而对代码的影响最小。

      提供了基于注解的缓存配置方法。它本质上不是一个具体的缓存实现方案(例如EHCache),而是一个对缓存使用的抽象,通过在已有代码中打上几个预定义的注释,就可以实现我们希望达到的缓存效果。SpringCache支持跟第三方缓存例如EHCache集成;另外也提供了开箱即用的默认实现,可以直接拿来使用。

      SpringCache支持使用SpEL(Spring Expression Language)来定义缓存的key和各种condition,因此具备相当的灵活性,并可以支持非常复杂的语义。

      Spring 4.1开始,通过JSR-107注释和更多定制选项的支持,简化开发,缓存抽象得到了显着改善。

    • Cache接口为缓存的组件规范定义,包含缓存的各种操作集合;

    • Cache接口下Spring提供了各种xxxCache的实现;如RedisCache,EhCacheCache ,ConcurrentMapCache等;

    • 每次调用需要缓存功能的方法时,Spring会检查检查指定参数的指定的目标方法是否已经被调用过;如果有就直接从缓存中获取方法调用后的结果,如果没有就调用方法并缓存结果后返回给用户。下次调用直接从缓存中获取。

    • 使用Spring缓存抽象时我们需要关注以下两点;

      1、确定方法需要被缓存以及他们的缓存策略

      2、从缓存中读取之前缓存存储的数据

    二、Spring Cache缓存管理器

      由于是springframework的内置功能,使用springcache并不需要额外引入jar包。因此只需要简单的配置就可以启用开箱即用的默认缓存实现。

      但是在springboot中使用需要做如下操作

    2.1、基础用法步骤

    1、pom依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>

    2、缓存类型配置

      在application.properties中配置属性

    spring.cache.type=Simple
    • Simple:基于ConcurrentHashMap实现的缓存,只适合单体应用或者开发环境使用。Spring自带的缓存类型,这个缓存与Spring Boot应用在同一个Java虚拟机内,适合单体应用系统。
    • None:禁止使用缓存。
    • Redis:使用Redis缓存。
    • …………

    3、启动或者配置类上加入@EnableCaching注解来开启缓存注解。

    //开启缓存注解
    @EnableCaching
    @SpringBootApplication
    public class  Application {
        public static void main(String[] args) {
            SpringApplication.run(Application .class, args);
        }
    }

    注意:使用默认的缓存,即内存方式的 ConcurrentHashMap ,如果

        @Override
        @Cacheable(unless = "#result == null")
        public AccountBalance selectOne(AccountBalance entity) {
            Wrapper<AccountBalance> wrapper = new QueryWrapper<>(entity);
            return this.getOne(wrapper);
        }

      这样设置,每次请求不是一个对象,但是key是对象,所以每次都不能命中,但是在redis中一般情况是一个以序列化字符串作为一个key,故是一个key

        @Override
        @Cacheable(unless = "#result == null")
        public AccountBalance selectOne(Long id) {
            return this.getById(id);
        }

      使用此种配置,均是以id为key。不存在分歧

      

  • 相关阅读:
    非阻塞式线程安全列表-ConcurrentLinkedDeque
    计数器
    Linux 查看服务器内存使用情况
    Oracle to_date, to_timestamp
    Hibernate session.flush() 使用
    阿里规约认证(题库附答案)
    多态性
    Java数据类型
    String类特点分析
    数组的定义
  • 原文地址:https://www.cnblogs.com/bjlhx/p/9166804.html
Copyright © 2020-2023  润新知