29、springboot——缓存之JSR107——缓存的运行流程+@Cacheable的其它属性的使用②

一、运行流程:

@Cacheable
1.方法运行之前先去查询缓存组件,按照Cache的name取获取(CacheManager先获取相应的缓存)
    第一次获取缓存没有则会自动创建
2.取Cache中查找缓存,使用以可key,默认就是方法的参数
    key是按照某种策略生成的,默认使用keyGenerator,默认使用SimpleKeyGenerator

3.没有查到缓存就调用目标方法
4.将目标方法返回的结果放入缓存中
  @Cacheable标注的方法执行之前先来检查缓存中有没有这个数据,
  默认按照参数的值作为key取查询缓存
  如果没有就运行方法并且将结果放入缓存

二、其它属性的使用:

  1、key

    @Cacheable(cacheNames = {"emp"},key = "#root.methodName+'['+#id+']'")
    public Employee getEmp(Integer id){
        System.out.println("查询"+id+"号员工");
        Employee employee = employeeMapper.getEmpById(id);
        return employee;
    }

    此时方法返回的结果的key是:方法名+[方法参数为id的值](这里例子则key为:getEmp[1])

  2、keyGenerator:key的生成器(springboot默认使用的key生成器是使用方法中的参数作为key)

    我们可以自定义keyGenerator

    在配置类中注册一个自定义KeyGenerator

@Configuration
public class MyCacheConfig {

    @Bean("myKeyGenerator")
    public KeyGenerator keyGenerator(){
        return new KeyGenerator(){
            @Override
            public Object generate(Object o, Method method, Object... params) {
                //指定返回结果的key为:方法名[方法的所有参数]
                String key = method.getName()+"["+ Arrays.asList(params)+"]";
                return key;
            }
        };
    }
}

    然后在方法中指定key的生成器(注意key和keyGenerator两个属性只能使用其中之一)  

    @Cacheable(cacheNames = {"emp"},keyGenerator = "myKeyGenerator")
    public Employee getEmp(Integer id){
        System.out.println("查询"+id+"号员工");
        Employee employee = employeeMapper.getEmpById(id);
        return employee;
    }

    通过debug调试我们可以看到确实进入了我们自定义生成器的方法中并生成了按我们步骤所确定的key

  3、cacheManager:指定缓存管理器

  4、condition:符合条件的情况下才缓存

    这里以参数id的值>1时才进行缓存(需要缓存的条件由自己灵活定制  )

    @Cacheable(cacheNames = {"emp"},keyGenerator = "myKeyGenerator",condition = "#id>1")
    public Employee getEmp(Integer id){
        System.out.println("查询"+id+"号员工");
        Employee employee = employeeMapper.getEmpById(id);
        return employee;
    }

    连续访问两次查询一号员工的链接:

     每次都会进行SQL查询,说明没有缓存

     但连续访问两次查询2号员工的链接则只是第一次的时候进行了查询,之后就是在缓存中拿,说明condition属性配置成功

   5、unless:当unless指定的条件为true时;方法的返回值就不会缓存了(正好与condition属性相反)

   6、sync:是否使用异步模式;默认不使用

原文地址:https://www.cnblogs.com/lyh233/p/12559818.html