阿里巴巴開源的通用快取訪問框架JetCache介紹
JetCache是由阿里巴巴開源的通用快取訪問框架,如果你對Spring Cache很熟悉的話,請一定花一點時間瞭解一下JetCache,它更好用。
JetCache提供的核心能力包括:
- 提供統一的,類似jsr-107風格的API訪問Cache,並可通過註解建立並配置Cache例項
- 通過註解實現宣告式的方法快取,支援TTL和兩級快取
- 分散式快取自動重新整理,分散式鎖 (2.2+)
- 支援非同步Cache API
- Spring Boot支援
- Key的生成策略和Value的序列化策略是可以定製的
- 針對所有Cache例項和方法快取的自動統計
我們直接看程式碼,最簡單的使用場景是這樣的:
public interface UserService {
@Cached(expire = 3600, cacheType = CacheType.REMOTE)
User getUserById(long userId);
}
這和Spring Cache很像,不過@Cached註解原生支援了TTL(超時時間),cacheType有LOCAL/REMOTE/BOTH三種選擇,
分別代表本地記憶體/遠端Cache Server(例如Redis)/兩級快取,可根據情況選用,合理的使用LOCAL或BOTH型別可以降低Cache Server的壓力以及我們提供的服務的響應時間。
再看個複雜點的例子:
public interface UserService {
@Cached(name="userCache-", key="#userId", expire = 3600)
User getUserById(long userId);
@CacheUpdate(name="userCache-", key="#user.userId", value="#user")
void updateUser(User user);
@CacheInvalidate(name="userCache-", key="#userId")
void deleteUser(long userId);
}
第一個例子中我們沒有指定key,JetCache會根據引數自動生成,這個例子我們指定了key,並且展示了快取的更新和刪除。
自動重新整理和載入保護是JetCache的大殺器,對於載入開銷比較大的物件,為了防止快取未命中時的高併發訪問打爆資料庫:
public interface SummaryService{
@Cached(expire = 3600, cacheType = CacheType.REMOTE)
@CacheRefresh(refresh = 1800, stopRefreshAfterLastAccess = 3600, timeUnit = TimeUnit.SECONDS)
@CachePenetrationProtect
BigDecimal salesVolumeSummary(int timeId, long catagoryId);
}
cacheType為REMOTE或者BOTH的時候,重新整理行為是全域性唯一的,也就是說,即使應用伺服器是一個叢集,也不會出現多個伺服器同時去重新整理一個key的情況。
CachePenetrationProtect註解保證當快取未命中的時候,一個JVM裡面只有一個執行緒去執行方法,其它執行緒等待結果。
一個key的重新整理任務,自該key首次被訪問後初始化,如果該key長時間不被訪問,在stopRefreshAfterLastAccess指定的時間後,相關的重新整理任務就會被自動移除,這樣就避免了浪費資源去進行沒有意義的重新整理。
加在方法上的註解畢竟不能提供最靈活的控制,所以JetCache提供了Cache API,使用起來就像Map一樣:
UserDO user = userCache.get(12345L);
userCache.put(12345L, loadUserFromDataBase(12345L));
userCache.remove(12345L);
userCache.computeIfAbsent(1234567L, (key) -> loadUserFromDataBase(1234567L));
實際上Cache API實現了jsr107規範Cache介面的部分方法,以後的大版本可能會完整實現。
Cache例項可以通過註解建立:
@CreateCache(expire = 100, cacheType = CacheType.BOTH, localLimit = 50)
private Cache<Long, UserDO> userCache;
也可以通過和guava cache/caffeine類似的builder來建立:
GenericObjectPoolConfig pc = new GenericObjectPoolConfig();
pc.setMinIdle(2);
pc.setMaxIdle(10);
pc.setMaxTotal(10);
JedisPool pool = new JedisPool(pc, "localhost", 6379);
Cache<Long, UserDO> userCache = RedisCacheBuilder.createRedisCacheBuilder()
.keyConvertor(FastjsonKeyConvertor.INSTANCE)
.valueEncoder(JavaValueEncoder.INSTANCE)
.valueDecoder(JavaValueDecoder.INSTANCE)
.jedisPool(pool)
.keyPrefix("userCache-")
.expireAfterWrite(200, TimeUnit.SECONDS)
.buildCache();
Cache介面支援非同步:
CacheGetResult r = cache.GET(userId);
CompletionStage<ResultData> future = r.future();
future.thenRun(() -> {
if(r.isSuccess()){
System.out.println(r.getValue());
}
});
可以實現不嚴格的分散式鎖:
cache.tryLockAndRun("key", 60, TimeUnit.SECONDS, () -> heavyDatabaseOperation());
使用Cache API也可以做自動重新整理哦:
@CreateCache
@CacheRefresh(timeUnit = TimeUnit.MINUTES, refresh = 60)
@CachePenetrationProtect
private Cache<String, Long> orderSumCache;
@PostConstruct
public void init(){
orderSumCache.config().setLoader(this::loadOrderSumFromDatabase);
}
如果沒有使用註解,用builder一樣也可以做出自動重新整理:
Cache<String, Long> orderSumCache = RedisCacheBuilder.createRedisCacheBuilder()
......省略
.refreshPolicy(RefreshPolicy.newPolicy(60, TimeUnit.SECONDS))
.loader(this::loadOrderSumFromDatabase)
.buildCache();
當前支援的快取系統包括以下4個,而且要支援一種新的快取也是非常容易的:
- Caffeine(基於本地記憶體)
- LinkedHashMap(基於本地記憶體,JetCache自己實現的簡易LRU快取)
- Alibaba Tair(相關實現未在Github開源,在阿里內部Gitlab上可以找到)
- Redis
使用JetCache的系統需求:
- JDK:必須Java 8
- Spring Framework:4.0.8以上,如果不使用註解就不需要
- Spring Boot:1.1.9以上(可選)
更多文件可以在github的wiki上找到。
有了JetCache,我們就可以更方便的基於統一的介面訪問快取。有任何問題歡迎在github上與我討論。
相關文章
- jetcache快取使用快取
- redis快取介紹Redis快取
- 手寫開源ORM框架介紹ORM框架
- Java 開源分散式快取框架EhcacheJava分散式快取框架
- 快取、快取演算法和快取框架簡介快取演算法框架
- phpob快取原理介紹PHP快取
- Caffeine快取的簡單介紹快取
- virgil:透過REST訪問Cassandra的開源框架REST框架
- 快取融合(Cache Fusion)介紹快取
- MyBatis中的一級快取和二級快取介紹MyBatis快取
- 開源一個通用的查詢框架框架
- JetCache 簡介
- 分散式服務框架介紹:最成熟的開源NIO框架Netty分散式框架Netty
- J2EE開發之常用開源框架介紹框架
- jdon框架的aop和快取問題框架快取
- 介紹SpringBoot 整合 Redis 快取Spring BootRedis快取
- 瀏覽器快取機制介紹瀏覽器快取
- 分散式快取GemFire架構介紹分散式快取架構
- 開源框架——圖片載入和快取方案總結框架快取
- ASP.NET Core模組化前後端分離快速開發框架介紹之3、資料訪問模組介紹ASP.NET後端框架
- ClownFish:比寫程式碼還快的通用資料訪問層
- XCharts 開源庫介紹
- 阿里巴巴開源路由框架 - ARouter 分析阿里路由框架
- 分散式快取伺服器Memcached介紹分散式快取伺服器
- hibernate一二級快取簡單介紹快取
- 記憶體資料庫快取介紹記憶體資料庫快取
- 註釋驅動的 Spring cache 快取介紹Spring快取
- 由Nginx的DNS快取導致的訪問404NginxDNS快取
- 快取問題(二) 布隆過濾器(Bloom Filter) 介紹和原理快取過濾器OOMFilter
- 開源認證和訪問控制的利器keycloak使用簡介
- fusionjs uber開源的通用web外掛化開發框架JSWeb框架
- 開源CMS系統介紹
- 開源Spring Scala介紹Spring
- OkHttpClient原始碼分析(三)—— 快取機制介紹HTTPclient原始碼快取
- 開源≠免費 常見開源協議介紹協議
- Python 序列通用操作介紹Python
- 谷歌瀏覽器怎麼清除快取 chrome瀏覽器清理快取方法介紹谷歌瀏覽器快取Chrome
- 前端優化:瀏覽器快取技術介紹前端優化瀏覽器快取