1. 程式人生 > >快取篇(一)- Guava

快取篇(一)- 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等等,有時間大家可以去用用,會發現你的程式碼會簡單易懂很多。正如,磨刀不誤砍材工,只有把基礎的資訊掌握,用的時候才能臨危不懼。

 

參考文章:http://ifeve.com/google-guava-cachesexplained/