如易雲揭祕1-框架(cache)

Hibernate老鳥的話,對於Hibernate cache的精妙實現應該都是非常瞭解,即便不瞭解其實現原理,也知道Hibernate cache非常的易用,集成EhCache,對於系統性能也有很好的提升。那我們來看看如易雲的框架,如易雲的框架基於Mybatis,Mybatis新版本中也集成了cache,並且也有開源的分佈式cache集成(例如: Mybatis-Ignite  https://github.com/mybatis/ignite-cache ),但如易雲在數據庫操作方面做了非常多的業務語義抽象(具體參見:創易-數據庫層設計 ),對於cache,當然一方面我希望在這個層面做下處理,另一方面就是 我之前在上家公司基於spring cache做的獨有的兩層cache(JVM+分佈式cache,對開發人員透明,框架自動具備這樣的能力 【這個以後的文章再表】),所以我們需要基於框架量身定做cache的集成。

      說到這裏,不得不由衷的佩服spring boot確實不錯,以前我還要基於spring cache 把guava cache和redis裝進去,現在基於spring boot的 autoconfigure的cache封裝,就可以很方便把這些用起來,關於 springboot的cache使用,請參見:http://www.jianshu.com/p/64f684bd0ce9    但麻煩的地方在於,我們的框架+代碼自動生成,在整個體系裏,默認的實現都在abstract抽象類,那麼它只能做一次cacheNames的配置, 如果設置 cacheEvict(allEntries=true),會做全局的失效,而正常是這個模型內的緩存失效,好在 可以自定義 CacheResolver。


運行期動態設置cacheNames

      不過自定義的CacheResolver,需要注入cacheManager, 而cacheManager不能注入成功, 最終 使用 @Lazy,懶加載,並且 在spring boot應用啓動時 將ApplicationContext 設置給ApplicationContextHolder,在 需要的時候獲取到cachemanager設置給CacheResolver, 具體代碼:


@Component("runtimeImplCacheResolver")

@Lazy

public classRuntimeImplCacheResolverextendsAbstractCacheResolver {

privateApplicationContextctx;

publicRuntimeImplCacheResolver() {

//super.setCacheManager(SpringContextHolder.getApplicationContext().getBean(CacheManager.class));

}

@PostConstruct

public voidinit(){

super.setCacheManager(SpringContextHolder.getApplicationContext().getBean(CacheManager.class));

}

@Override

protectedCollection getCacheNames(CacheOperationInvocationContext context) {

if(context.getOperation().getCacheNames().contains("SECOMMONDYN")){

Set cacheName =newHashSet();

context.getTarget().getClass().toString();

String simpleName = context.getTarget().getClass().getSimpleName();

simpleName = simpleName.substring(0, simpleName.length() -11);

cacheName.add(simpleName);

returncacheName;

}else{

returncontext.getOperation().getCacheNames();

}

}

}


框架調用:

@CacheConfig(cacheNames ="SECOMMONDYN", cacheResolver ="runtimeImplCacheResolver")
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章