zoukankan      html  css  js  c++  java
  • springboot缓存注解——@Cacheable

    @Cacheable:
    1,方法运行之前,先查询Cache(缓存组件),按照cacheName指定的名字获取(CacheManager获取相应缓存)
         第一次获取缓存如果没有Cache组件会自会自动创建
    2,去Cache中查找缓存的内容,使用一个key默认是方法的参数;
        key是按照某种策略生成的,默认是使用keyGenerator生成的,默认使用SimpleKeyGenerator生成key
                SimpleKeyGenerator生成策略:
                           如果没有参数:key=new  Simlekey()
                           如果有一个参数:key=参数的值
                           如果有多个参数:key=new Simplekey(params)
    3,没有查到缓存就调用目标方法
    4,讲目标方法返回的结果放进缓存
    
    
    核心:
      1,使用CacheManager【ConcurrentMapCacheManager】按照名字得到Cache【ConcurrentMapCache】组件
      2,key使用keyGenerator生成的,默认的是SimpleKeyGenerator
      3,缓存运行步骤
    几个属性:
    
    cacheNames/values:指定缓存组件的名字,将方法的返回结果放在哪个缓存中,是数组的方式,可以指定多个缓存
    
    key:缓存数据使用的key;可以用它来指定。默认是使用方法参数的值   
             可以用spEL表达式来表示;#id-如(getEmp[1]); 参数id的值:  #a0  #p0  #root.args[0]
    
    keyGenerator:key的生成器;可以自己指定key的生成器的组件id
                           key/keyGenerator:二选一使用(自己配置类)
    
    cacheManager:指定使用哪个缓存管理器;或者cacheResolver指定获取解析器 
    
    condition:指定符合条件的情况下才缓存; 如:condition = "#a0>1"  即第一个参数值大于1时才进行缓存
    
    unless:否定缓存;当unless指定的条件为true,方法的返回值就不会被缓存;可以获取到的结果进行判断
                如: unless = “#a0”:如果第一个参数值是2,则结果不缓存
    unless = “#result == null” 结果为null不缓存

    结合写法:
    @Cacheable(cacheNames = {"emp"},keyGenerator = "myKeyGenerator",condition = "#a0>1",unless =  "#a0==2")  
    意思为 放在的缓存名称为emp中,key的生成方式为配置的myKeyGenerator类,当第一个参数大于1时候缓存,当第一个参数等于2时不缓存
    sync:是否使用异步模式(异步模式情况下unless不支持)


    key的生成方式
    • 直接在注解中声明:
      //@Cacheable(cacheNames = {"emp"},key = "#root.methodName+'['+#id+']'")
       public Employee getEmp(Integer id){
              System.out.println("查询"+id+"号员工");
              Employee emp =  employeeMapper.getEmpById(id);
              return  emp;
          }
      
      此时当id为1时,key的值为 getEmp[1]

      附上spEL表达式表

    • 编写自己的KeyGenerator配置类
      @Configuration
      public class MyCacheConfig {
      
          @Bean("myKeyGenerator")
          public KeyGenerator keyGenerator (){
            return   new KeyGenerator(){
                  @Override
                  public Object generate(Object o, Method method, Object... objects) {
                      return method.getName()+"["+ Arrays.asList(objects).toString()+"]";
                  }
              };
          };
      }
      这里返回的key的值为getEmp[[1]]
      总结:@Cacheable标注的方法执行之前先来检查缓存中有没有这个数据,默认按照参数的值作为key去查询缓存,如果没有就运行方法并将结果放入缓存;以后再来调用就可以直接使用缓存中的数据
      

       

  • 相关阅读:
    test14
    test13
    test12
    test11
    Xcode常用快捷键
    OC弱语法
    对象的结构体属性的成员修改
    IOS 获取手机各种信息
    IOS app启动过程
    iOS退出键盘的两种方式
  • 原文地址:https://www.cnblogs.com/MagicAsa/p/10762356.html
Copyright © 2011-2022 走看看