• spring cash 使用详解


    https://blog.csdn.net/zlj1217/article/details/80928122
    https://blog.csdn.net/weixin_37943811/article/details/116462248
    https://www.jianshu.com/p/9272e011ba5a
    https://www.cnblogs.com/snake23/p/9675703.html

    1. spring cache

    Spring 3.1 引入了激动人心的基于annotation的缓存技术。

    它利用了AOP,实现了基于注解的缓存功能,并且进行了合理的抽象,业务代码不用关心底层是使用了什么缓存框架,只需要简单地加一个注解,就能实现缓存功能了。而且Spring Cache也提供了很多默认的配置,用户可以3秒钟就使用上一个很不错的缓存功能。




    2. 入门使用

    2.1 添加依赖

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

    2.2 启动类添加@EnableCaching注解

    @SpringBootApplication
    @EnableCaching
    public class Application {
    
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }
    

    2.3 使用缓存

    @Cacheable(cacheNames = {"task"})
    public TaskInfoDTO getTask(String taskId) {
        log.info("TestBuzz.getTask mock query from DB......");
        TaskInfoDTO taskInfoDTO = new TaskInfoDTO();
        taskInfoDTO.setTaskId(taskId);
        taskInfoDTO.setApplicantId("system");
        taskInfoDTO.setDescription("test");
        return taskInfoDTO;
    }
    
    
    // 模拟请求
    @GetMapping("/test_cache")
    public IResp<TaskInfoDTO> testCache() {
        TaskInfoDTO taskInfoDTO = this.testBuzz.getTask("task123");
        return IResp.getSuccessResult(taskInfoDTO);
    }
    
    // 从日志中看到只打印了一次DB调用,也就是说明第二次走了缓存。就这么简单我们就开启并使用了spring的缓存能力
    



    3. 常用注解

    • @Cacheable
      对其返回结果进行缓存,下次请求时,如果缓存存在,则直接读取缓存数据返回;如果缓存不存在,则执行方法,并把返回的结果存入缓存中。
    value      缓存名,必填,它指定了你的缓存存放在哪块命名空间
    cacheNames 与 value 差不多,二选一即可
    key        可选属性,默认按照函数的所有参数组合作为key值,可以使用 SpEL 标签自定义缓存的key 。更多关于SpEL表达式的详细内容可参考官方文档
    condition  缓存对象的条件,非必需,也需使用SpEL表达式,只有满足表达式条件的内容才会被缓存,比如:@Cacheable(key = "#p0", condition = "#p0.length() < 3"),表示只有当第一个参数的长度小于3的时候才会被缓存,若做此配置上面的AAA用户就不会被缓存,读者可自行实验尝试。
    unless     另外一个缓存条件参数,非必需,需使用SpEL表达式。它不同于condition参数的地方在于它的判断时机,该条件是在函数被调用之后才做判断的,所以它可以通过对result进行判断。
    keyGenerator  用于指定key生成器,非必需。若需要指定一个自定义的key生成器,我们需要去实现org.springframework.cache.interceptor.KeyGenerator接口,并使用该参数来指定。需要注意的是:该参数与key是互斥的
    acheManager   用于指定使用哪个缓存管理器,非必需。只有当有多个时才需要使用
    cacheResolver 用于指定使用那个缓存解析器,非必需。需通过org.springframework.cache.interceptor.CacheResolver接口来实现自己的缓存解析器,并用该参数指定。
    
    • @CachePut
      使用该注解标志的方法,每次都会执行,并将结果存入指定的缓存中。其他方法可以直接从响应的缓存中读取缓存数据,而不需要再去查询数据库。一般用在新增和修改方法上。
    value         缓存名,必填,它指定了你的缓存存放在哪块命名空间   
    key           缓存的 key,可选属性,默认按照方法的所有参数进行组合,可以使用 SpEL 标签自定义缓存的key。
    condition     缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存
    
    • @CacheEvict
      使用该注解标志的方法,会清空指定的缓存。一般用在更新或者删除方法上。
    value         缓存名,必填,它指定了你的缓存存放在哪块命名空间      
    key           缓存的 key,可选属性,默认按照方法的所有参数进行组合,可以使用 SpEL 标签自定义缓存的key。
    condition     缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存
    allEntries    是否清空所有缓存内容,缺省为 false,如果指定为 true,则方法调用后将立即清空所有缓存
    beforeInvocation  是否在方法执行前就清空,缺省为 false,如果指定为 true,则在方法还没有执行的时候就清空缓存,缺省情况下,如果方法执行抛出异常,则不会清空缓存 
    
  • 相关阅读:
    luogu3242 接水果 (整体二分+树状数组)
    [BZOJ3449] [Usaco2014 Feb]Secret Code
    [BZOJ2821] 作诗(Poetize)
    [BZOJ2434] [Noi2011]阿狸的打字机
    [BZOJ1212] [HNOI2004]L语言
    [JZOJ100026]【NOIP2017提高A组模拟7.7】图
    [BZOJ2467] [中山市选2010]生成树
    [Luogu3868] [TJOI2009]猜数字
    [POJ1006] Biorhythms
    [BZOJ2733] [HNOI2012]永无乡
  • 原文地址:https://www.cnblogs.com/itlihao/p/16244684.html
Copyright © 2020-2023  润新知