简介
jetcache类似spring cache,但是多一些自动过期、自动刷新、分布式锁等功能。由于只是选择感兴趣的部分阅读,所以难免有所缺漏,还望多多理解。我阅读的版本为2.5。
注解实现原理
jetcache可以通过api调用实现功能,但是我们更习惯于使用简洁的注解来实现缓存功能。将注解(@Cached、@CacheUpdate…)加在方法上,然后通过动态代理将方法增强,从而实现缓存功能。
jetcache官方文档
https://github.com/alibaba/jetcache/wiki/Home_CN
注解解析过程
既然是动态代理,那么如何代理呢?
CachePointcut中有两个方法:
1.
public boolean matches(Class clazz)
该方法用户判断clazz是否在basePackages里面,改目录下的类,才有机会被jetcache动态代理。通过@EnableMethodCache的basePackages配置。
2.
public boolean matches(Method method, Class targetClass)
该方法会调用CacheConfigUtil的parse方法,将方法上的注解信息保存到CacheInvokeConfig对象中。然后保存到ConfigMap,key为方法,value为CacheInvokeConfig,即可以根据方法找到方法上的配置信息。
JetCacheInterceptor的invoke方法代理了原来的方法。当方法可以通过ConfigMap找到对应CacheInvokeConfig时,则创建一个CacheInvokeContext,用来保存这次调用的信息(如被代理的原方法,当没有缓存或是缓存更新时,先从context获取原方法,然后缓存调用结果)。然后调用CacheHandler.invoke(context),进行缓存的保存、更新、删除操作,并在必要的时候调用原方法去查数据库。