开发者学堂课程【SpringBoot 快速掌握 - 高级应用:缓存工作原理&@Cacheable 运行流程】学习笔记,与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/613/detail/9290
缓存工作原理 &@Cacheable 运行流程
原理:
1、自动配置类; CacheAutoConfiguration
2、缓存的配置类
org,springframework , boot, autoconfigure , cache, Generic Cache Configuration
org,springframework,boot,autoconfigure , cache]JCache[ acheConfiguration
org,springframework,boot, autoconfigure , cache. EhCacheCacheConfiguration
org,springframework,boot, autoconfigure ,cache. HazelcastCacheConfiguratio
org,springframework,boot.autoconfigure , cache. InfinispanCacheConfiguration
org,springframework,boot,autoconfigure , cache. CouchbaseCacheConfiguration
org,springframework.boot,autoconfigure , caqhe, RedisCacheConfiguration
org,springframework . boot. autoconfigure ,cahe. CaffeineCacheConfiguration
org,springframework,boot.autoconfigure , cache. GuavaCacheConfiguration
org,springframework.boot.autoconfigure,cache.S imple CacheConfiguration
org,springframework,boot,autoconfigure , cache, No0pCacheConfiguration |
这些缓存配置类都是有顺序的
哪个配置类默认生效: SimpleCacheConfiguration ;
直接在缓存控制台测试就可以得到
给容器中注册了一个 CacheManager :
ConcurpentMapCacheManager
可以获取和创建 ConcurrentMapCache 类型的援存组件;他的作用将数据保存在 ConcurrentMap 中;
运行流程:(断点都打在行内)
以 @Cacheable:为例
方法运行之前,先去查询 Cache (缓存组件),按照 cacheNames 指定的名字获取;
( CacheManager 先获取相应的缓存),第一次获取缓存如果没有 Cache 组件会自动创建。
@Override
public Collection <String>get CacheNames (){return Collections . unmodifiableset (this.cach=Wa。
@Override
public Cache getCache(String name){name;"emp"
Cache cache=this cacheMap. get(name);cache:null
if(cache==null&this. dynamic){
synchronized (this.cacheMap){
cache=this cacheMap. get(name);name:"emp"
if(cache==null){cache: null
cache= createConcurrentMapCache (name);
this:cacheMap. put(name, cache);
}
}
}
return cache;
去 Cache 中查找缓存的内容,使用一个 key,默认就是方法的参数;key 是按照某种策略生成的。默认是使用 KeyGenerator 生成的,默认使用 SimpleKeyGenerator 生成 key
SimpLeKeyGenerator 生成 key 的默认策略;
如果没有参数;key=new SimpleKey();
如果有一个参数:key-参数的值
如果有多个参数:key=new SimpleKey(params )
没有查到缓存就调用目标方法;
将目标方法返回的结果,放进缓存中。调用的是put
Cacheable 标注的方法执行之前先来检查缓存中有没有这个数据,默认按照参数的值作为key去查询缓存,如果没有就运行方法并将结果放入缓存中;以后再来调用就可以直接使用缓存中的数据;
第一次运行放入缓存,要从缓存中查询
核心:
使用【 CacheMandgerKConcurrentMapCacheMandger 】按照名字得到 【ConcurrentMapCache】组件
key 使用 keyGenerator 生成的,默认是 SimpleKeyGenerator
@Override
protected0bjectlookup (0bjectkey){key:2
return this. store. get(key); key:2
}
@ SuppressWarnings ("unchecked")
@Override
public<T>T get(0bjectkey, Callable<T> valueloader ){
//Try efficient lookup on the ConcurrentHashMap first...
ValueWrapperstoreValue =get(key);
if( storeValue !=null){
return(T) storeValue . get();
}
@param id
@return
@Cacheable( cacheNames ={"emp"})
public Employee getEmp(Integer id){
System. out. println("查询"+id+"号员工");
Employee emp= emp1oyeeMapper . getEmpById (id);
return emp;
}
}