日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

阿里巴巴开源的通用缓存访问框架JetCache介绍

發布時間:2024/8/23 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 阿里巴巴开源的通用缓存访问框架JetCache介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

摘要:?JetCache是由阿里巴巴開源的通用緩存訪問框架,如果你對Spring Cache很熟悉的話,請一定花一點時間了解一下JetCache,它更好用。JetCache可以做類似Spring Cache的注解式緩存,支持TTL、多級緩存、分布式自動刷新,也提供類似JSR107規范的Cache API。

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)BigDecimal salesVolumeSummary(int timeId, long catagoryId); }

cacheType為REMOTE或者BOTH的時候,刷新行為是全局唯一的,也就是說,即使應用服務器是一個集群,也不會出現多個服務器同時去刷新一個key的情況。
一個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) 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介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。