springboot缓存是将方法的运行结果进行缓存,以后要相同的数据,直接从缓存中获取,不同调用方法。
CacheManager管理多个Cache组件,对缓存的真正CRUD操作是在Cache组件中,每一个缓存组件有自己唯一一个的名字
几个属性:
cacheNames/value:指定缓存组件的名字;将方法的返回结果放在哪个缓存中,是数组的形式,可以指定多个缓存
key:缓存数据使用的key,可以用它来指定,默认是使用方法参数的值
keyGenerator:key的生成器;可以自己指定key的生成器,比如组件的id,key/keyGenrator:二选一使用
cacheManager:指定缓存管理器;或者cacheResolver指定获取解析器
condition:指定符合条件下的情况下才缓存
unless:否定缓存;当unless指定的条件为true,方法的返回值就不会被缓存,可以获取到结果进行判断,unless="#result ==null",当结果为null时就不会进行缓存
sync:是否使用异步模式
原理:
1、自动配置类:CacheAutoConfiguration
2、缓存的配置类(11个)
3、默认生效的配置类:SimpleCacheConfiguration
4、给容器中注册一个CacheManager,ConcurrentMapCacheMapper
5、可以获取和创建ConcurrentMapCache类型的缓存组件,他的作用是将缓存数据保存在ConCurrentMap中;
运行流程:
@Cacheable:
1、被@Cacheable注解的方法运行之前,先去查询Cache(缓存组件),按照cacheName指定的名字获取;(CacheManager先获取相应的缓存),第一次获取缓存,如果没有缓存,那么Cache组件会自动创建。
2、去Cache中查找缓存的内容,使用一个key,默认就是方法的参数;key是按照某种策略生成的,默认使用keyGenerator生成的,默认使用SimpleKeyGenerator生成key;
SimpleKeyGenerator生成key的默认策略:
如果没有参数,key=new SimpleKey();
如果有一个参数:key=参数的值
如果有多个参数:key=new SimpleKey(params);
3、如果没查到缓存,就调用目标方法
4、将目标方法返回的结果放进缓存中
@Cacheable标注的方法执行之前先来检查缓存中有没有这个数据,默认按照参数的值作为key去查询缓存,如果没有就运行方法并将结果放进缓存,以后再来调用就可以直接使用缓存中的数据,
核心:1)使用CacheManager【ConcurrentCacheManager】按照名字得到Cache【ConCurrentMapCache】组件
2)key使用keyGenerator生成的,默认是SimpleKeyGenerator