快取篇(一)- Guava
接下來幾篇給大家分享一下快取相關的內容,包括但不限於Guava,JetCache和Spring Cache等。
Guava產生的背景
最常見最簡單的方式就是我們使用HashMap或者ConcurrentHashMap,在記憶體中快取資料,通過key存放value,通過key讀取我們需要的value資料。但是這裡存在一個問題,value是會過期的。所以我們還得需要設定一個定時器,根據業務和資料變化要求,每隔一段時間進行快取更新,保證讀取的是更新的value。另外如果需要對快取的資料做更精準的失效控制,還得自己寫一套回收策略的程式碼,這相對來說是很麻煩的。但是Guava已經幫你考慮到這些了。
Guava的使用場景
Guava也並不是萬能的,在使用之前我們先說說使用場景,看看業務中使用Guava快取是否能夠解決問題。
場景1:Guava屬於本地記憶體快取,非分散式快取,適用於對資料實時性不高,但也有一定要求。所以使用Guava就需要犧牲一定的記憶體空間。
場景2:本地快取至少會查詢到1次,保證Guava起碼是能夠真正起到快取加速作用的。
Guava案例分析
@Test public void testCacheUse() throws Exception{ LoadingCache<String, SkuCache> loadingCache = CacheBuilder.newBuilder() .expireAfterAccess(10, TimeUnit.SECONDS) .build(new CacheLoader<String, SkuCache>() { @Override public SkuCache load(String key) { SkuCache skuCache = new SkuCache(); skuCache.setSkuCode(key); skuCache.setSkuId(key); skuCache.setRealQuantity(100L); return skuCache; } }); SkuCache skuCache = loadingCache.get("sku"); System.out.println(skuCache); skuCache.setSkuCode(skuCache.getSkuCode() + "-modified"); SkuCache skuCache2 = loadingCache.get("sku"); System.out.println(skuCache2); } @Data public class SkuCache { private String skuId; private String skuCode; private Long realQuantity; }
這裡我們定義了快取物件SkuCache,希望前端頁面在查詢熱點sku的資訊時,起到快取加速的效果。
首先通過CacheBuilder.newBuilder()建立一個CacheBuilder物件,CacheBuilder提供了兩個失效策略expireAfterAccess和expireAfterWrite,分別代表訪問一段時間後失效和寫入一段時間後失效。當然,如果你想讓快取每隔一段時間自斷重新整理,可以使用refreshAfterWrite方法。這裡不做過多的測試。
Guava使用的注意事項
Guava的快取是在記憶體中實現,所以在同一段未失效期內,一個快取物件都是在一個記憶體中存在,如果取出來之後,設定了新值, 那麼Guava快取中的值也將改變。正如測試案例中的操作,將會輸出一下內容。
SkuCache(skuId=sku, skuCode=sku, realQuantity=100)
SkuCache(skuId=sku, skuCode=sku-modified, realQuantity=100)
這裡只是給大家簡單介紹了一下Guava的簡單用法,但是Guava除了快取之外,還有很多強大方便的功能,例如集合、併發工具和IO等等,有時間大家可以去用用,會發現你的程式碼會簡單易懂很多。正如,磨刀不誤砍材工,只有把基礎的資訊掌握,用的時候才能臨危不懼。