国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

阿里巴巴開源的通用緩存訪問框架JetCache介紹

vpants / 3004人閱讀

摘要:是由阿里巴巴開源的通用緩存訪問框架,如果你對很熟悉的話,請一定花一點時間了解一下,它更好用。有了,我們就可以更方便的基于統(tǒng)一的接口訪問緩存。

JetCache是由阿里巴巴開源的通用緩存訪問框架,如果你對Spring Cache很熟悉的話,請一定花一點時間了解一下JetCache,它更好用。

JetCache提供的核心能力包括:

提供統(tǒng)一的,類似jsr-107風(fēng)格的API訪問Cache,并可通過注解創(chuàng)建并配置Cache實例

通過注解實現(xiàn)聲明式的方法緩存,支持TTL和兩級緩存

分布式緩存自動刷新,分布式鎖 (2.2+)

支持異步Cache API

Spring Boot支持

Key的生成策略和Value的序列化策略是可以定制的

針對所有Cache實例和方法緩存的自動統(tǒng)計

我們直接看代碼,最簡單的使用場景是這樣的:

public interface UserService {
    @Cached(expire = 3600, cacheType = CacheType.REMOTE)
    User getUserById(long userId);
}

這和Spring Cache很像,不過@Cached注解原生支持了TTL(超時時間),cacheType有LOCAL/REMOTE/BOTH三種選擇,
分別代表本地內(nèi)存/遠(yuǎn)程Cache Server(例如Redis)/兩級緩存,可根據(jù)情況選用,合理的使用LOCAL或BOTH類型可以降低Cache Server的壓力以及我們提供的服務(wù)的響應(yīng)時間。

再看個復(fù)雜點的例子:

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會根據(jù)參數(shù)自動生成,這個例子我們指定了key,并且展示了緩存的更新和刪除。

自動刷新是JetCache的大殺器:

public interface SummaryService{
    @Cached(expire = 3600, cacheType = CacheType.REMOTE)
    @CacheRefresh(refresh = 1800, stopRefreshAfterLastAccess = 3600, timeUnit = TimeUnit.SECONDS)
    BigDecimal salesVolumeSummary(int timeId, long catagoryId);
}

cacheType為REMOTE或者BOTH的時候,刷新行為是全局唯一的,也就是說,即使應(yīng)用服務(wù)器是一個集群,也不會出現(xiàn)多個服務(wù)器同時去刷新一個key的情況。
一個key的刷新任務(wù),自該key首次被訪問后初始化,如果該key長時間不被訪問,在stopRefreshAfterLastAccess指定的時間后,相關(guān)的刷新任務(wù)就會被自動移除,這樣就避免了浪費資源去進(jìn)行沒有意義的刷新。

加在方法上的注解畢竟不能提供最靈活的控制,所以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實現(xiàn)了jsr107規(guī)范Cache接口的部分方法,以后的大版本可能會完整實現(xiàn)。

Cache實例可以通過注解創(chuàng)建:

@CreateCache(expire = 100, cacheType = CacheType.BOTH, localLimit = 50)
private Cache userCache;

也可以通過和guava cache/caffeine類似的builder來創(chuàng)建:

GenericObjectPoolConfig pc = new GenericObjectPoolConfig();
pc.setMinIdle(2);
pc.setMaxIdle(10);
pc.setMaxTotal(10);
JedisPool pool = new JedisPool(pc, "localhost", 6379);
Cache 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 future = r.future();
future.thenRun(() -> {
    if(r.isSuccess()){
        System.out.println(r.getValue());
    }
});

可以實現(xiàn)不嚴(yán)格的分布式鎖:

cache.tryLockAndRun("key", 60, TimeUnit.SECONDS, () -> heavyDatabaseOperation());

使用Cache API也可以做自動刷新哦:

@CreateCache
@CacheRefresh(timeUnit = TimeUnit.MINUTES, refresh = 60)
private Cache orderSumCache;

@PostConstruct
public void init(){
    orderSumCache.config().setLoader(this::loadOrderSumFromDatabase);
}

如果沒有使用注解,用builder一樣也可以做出自動刷新:

Cache orderSumCache = RedisCacheBuilder.createRedisCacheBuilder()
    ......省略
    .refreshPolicy(RefreshPolicy.newPolicy(60, TimeUnit.SECONDS))
    .loader(this::loadOrderSumFromDatabase)
    .buildCache();

當(dāng)前支持的緩存系統(tǒng)包括以下4個,而且要支持一種新的緩存也是非常容易的:

Caffeine(基于本地內(nèi)存)

LinkedHashMap(基于本地內(nèi)存,JetCache自己實現(xiàn)的簡易LRU緩存)

Alibaba Tair(相關(guān)實現(xiàn)未在Github開源,在阿里內(nèi)部Gitlab上可以找到)

Redis

使用JetCache的系統(tǒng)需求:

JDK:必須Java 8

Spring Framework:4.0.8以上,如果不使用注解就不需要

Spring Boot:1.1.9以上(可選)

更多文檔可以在github的wiki上找到。

有了JetCache,我們就可以更方便的基于統(tǒng)一的接口訪問緩存。

詳情請閱讀原文

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/69243.html

相關(guān)文章

  • 阿里開源緩存框架JetCache

    摘要:是一個基于的緩存系統(tǒng)封裝,提供統(tǒng)一的和注解來簡化緩存的使用。提供了比更加強大的注解,可以原生的支持兩級緩存分布式自動刷新,還提供了接口用于手工緩存操作。緩存失效時間緩存的類型,包括。 之前一直在用Spring Cache進(jìn)行接口數(shù)據(jù)的緩存,主要是Spring Cache在對具體key緩存失效時間的設(shè)置不是很方法,還要自己去擴展,無意中發(fā)現(xiàn)了阿里的JetCache。大部分的需求都能滿足,...

    MageekChiu 評論0 收藏0
  • 【面試精選】關(guān)于大型網(wǎng)站系統(tǒng)架構(gòu)你不得不懂10個問題

    摘要:降級往往會指定不同的級別,面臨不同的異常等級執(zhí)行不同的處理。談?wù)勀銓偷恼J(rèn)識兩者關(guān)系具體可以看公眾號阿里巴巴中間件的這篇文章獨家解讀從微服務(wù)框架到微服務(wù)生態(tài)與并不是競爭關(guān)系,作為成熟的框架,其易用性擴展性和健壯性已得到業(yè)界的認(rèn)可。 該文已加入筆主的開源項目——JavaGuide(一份涵蓋大部分Java程序員所需要掌握的核心知識的文檔類項目),地址:https://github.com/...

    leiyi 評論0 收藏0
  • 【面試精選】關(guān)于大型網(wǎng)站系統(tǒng)架構(gòu)你不得不懂10個問題

    摘要:降級往往會指定不同的級別,面臨不同的異常等級執(zhí)行不同的處理。談?wù)勀銓偷恼J(rèn)識兩者關(guān)系具體可以看公眾號阿里巴巴中間件的這篇文章獨家解讀從微服務(wù)框架到微服務(wù)生態(tài)與并不是競爭關(guān)系,作為成熟的框架,其易用性擴展性和健壯性已得到業(yè)界的認(rèn)可。 該文已加入筆主的開源項目——JavaGuide(一份涵蓋大部分Java程序員所需要掌握的核心知識的文檔類項目),地址:https://github.com/...

    luqiuwen 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<