Spring Boot系列笔记--缓存

Spring缓存抽象

在这里插入图片描述

  • CacheManager管理多个Cache组件的,对缓存的真正CRUD操作在Cache组件中,每一个缓存组件有自己唯一一个名字
  • 使用缓存即要使用相同的数据时,直接从缓存中获取,而不用调用方法查询数据库

缓存注解

在这里插入图片描述

@Cacheable

  • @Cacheable标注的方法执行之前先来检查缓存中有没有这个数据,默认按照参数的值作为key去查询缓存,如果没有就运行方法并将结果放入缓存;以后再来调用就可以直接使用缓存中的数据
  • 几个属性:
    cacheNames/value:指定缓存组件的名字;将方法的返回结果放在哪个缓存中,是数组的方式,可指定多个缓存
    key:缓存数据使用的key;默认是使用方法参数的值;可使用SpEL表达式
    keyGenerator:key的生成器;可以自己指定key的生成器的组件id(key/keyGenerator:二选一使用)
    cacheManager:指定缓存管理器;或者cacheResolver指定获取解析器
    condition:指定符合条件的情况下才缓存;
    unless:否定缓存;当unless指定的条件为true,方法的返回值就不会被缓存;可以获取到结果进行判断
    sync:是否使用异步模式
  • 常用SpEL表达
    在这里插入图片描述

@CachePut

  • 既调用方法,又更新缓存数据;同步更新缓存
  • 运行时机:
    1. 先调用目标方法
    2. 将目标方法的结果缓存起来

@CacheEvict

  • 缓存清除
  • 几个属性
    key:指定要清除的数据
    allEntries = true:指定清除这个缓存中所有的数据
    beforeInvocation = false:缓存的清除是否在方法之前执行;默认代表缓存清除操作是在方法执行之后执行;如果出现异常缓存就不会清除
    beforeInvocation = true:代表清除缓存操作是在方法运行之前执行,无论方法是否出现异常,缓存都清除

@Caching

  • 定义复杂的缓存规则
    @Caching(
             cacheable = {
          
          
                 @Cacheable(value="emp", key = "#lastName")
             },
             put = {
          
          
                 @CachePut(value="emp", key = "#result.id"),
                 @CachePut(value="emp", key = "#result.email")
             }
    )
    method...
    

@CacheConfig

  • 在类上抽取公共的缓存配置,在方法中就能省略
  • 源代码如下:
    package org.springframework.cache.annotation;
    
    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Inherited;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    import org.springframework.core.annotation.AliasFor;
    
    @Target({
          
          ElementType.TYPE, ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    @Inherited
    @Documented
    public @interface Cacheable {
          
          
        @AliasFor("cacheNames")
        String[] value() default {
          
          };//缓存的名称
    
        @AliasFor("value")
        String[] cacheNames() default {
          
          };//缓存的名称
    
        String key() default "";
    
        String keyGenerator() default "";
    
        String cacheManager() default "";
    
        String cacheResolver() default "";
    
        String condition() default "";
    
        String unless() default "";
    
        boolean sync() default false;
    }
    

猜你喜欢

转载自blog.csdn.net/weixin_44863537/article/details/109344962