天天看點

Guava學習筆記之Cache執行個體

Guava是谷歌的java類庫,功能十分強大,下面是本地記憶體緩存工具類執行個體,在第一次通過調用get(key)時,會調用load去擷取值,當再次調用時,我們發現就直接從緩存中調用了,根據maximumSize設定緩存大小,當大小超過限度的時候,會從緩存中移除最遠的資料。執行個體如下。

Guava cahche執行個體,通過loadingCache

public class Main {
    static Map<String, Integer> map = new HashMap<String, Integer>();

    public static Integer getValueByKey(String key) {
        System.out.println("通過key:" + key + "擷取值");

        return map.get(key);
    }

    @Test
    public void loadingCache() throws ExecutionException {

        map.put("key1", 1);
        map.put("key2", 2);
        map.put("key3", 3);

        LoadingCache<String, Integer> cahceBuilder = CacheBuilder.newBuilder().maximumSize(2)
                .build(new CacheLoader<String, Integer>() {
                    @Override
                    public Integer load(String key) throws Exception {

                        return getValueByKey(key);
                    }

                });

        System.out.println(cahceBuilder.get("key1"));
        System.out.println(cahceBuilder.get("key2"));
        System.out.println(cahceBuilder.get("key3"));
        System.out.println(cahceBuilder.get("key1"));
        System.out.println(cahceBuilder.get("key3"));
        cahceBuilder.put("key1", 4);
        System.out.println(cahceBuilder.get("key1"));
    }

}

           

運作結果:

Guava學習筆記之Cache執行個體

當然還有另外一種實作方式,使用callable

Guava學習筆記之Cache執行個體

移除值可以使用下列方法。

cache.invalidate("key1");
            cache.invalidateAll();
           

通過結果可以看出,當重複獲得相同key的值時,不會再執行call(),而是從緩沖區讀取。

cahceBuilder.refresh("key1");方法可以重新整理該key值

 CacheLoader.reload(K, V) 生成新的value

CacheBuilder.refreshAfterWrite(long, TimeUnit)   逾時後自動重新整理cache