介紹一個 google cache [本地緩存],最近在做一些優化,優化的方面也包含了緩存,下面就先介紹一下 google cache 的 cache 接口。
Cache<K,V> 接口
- 這個接口的實現應該是線程安全的,並且可以被多個併發線程安全訪問
方法
getIfPresent(Object key)
- 如果這個 key 在緩存中,那麼就可以通過調用該方法來命中緩存,返回返回緩存的 value
- 如果這個 key 不在緩存中,那麼就無法命中緩存,那麼就會返回 null
get(K key, Callable<? extends V> valueLoader) throws ExecutionException
- 如果 key 在緩存中命中,則通過 valueLoader 返回該緩存的 value ,且在加在完成之前該緩存的可觀察狀態不會被修改。
- 當加載緩存的時候,如果遇到一個受檢異常,會拋出 ExecutionException
- 當加載緩存的時候,如果遇到一個非受檢異常,會拋出 UncheckedExecutionException
- 當加載緩存的時候,如果遇到一個錯誤,會拋出 ExecutionError
getAllPresent
- 入參是一個 key 的集合,是 Iterable類型
- 返回值是一個 ImmutableMap<K, V> 類型
- 該方法會返回一個與緩存中的 key 關聯的 map,返回的 map 中只會包含在緩存中存在的內容
put
- 入參是緩存的 key 和 value
- 返回值是 void 類型
- 該方法會根據 key 和 value 將數據存儲在緩存中,如果緩存中該 key 已經存在對應的 value,那麼該 key 對應的 value 會被最新的 value 所覆蓋。
putAll
- 入參是一個 map 類型
- 返回值是 void類型
- 將所有映射從指定映射覆制到緩存。對於指定映射中從鍵到值的每個映射,此調用的效果等效於對該映射調用一次 put(k,v)的效果。如果在操作進行過程中修改了指定的映射,則此操作的行爲是不確定的。
invalidate(Object key)
- 入參是緩存的 key,是一個 object 類型
- 返回值是 void 類型
- 刪除該 key 對應的緩存
invalidateAll(Iterable<?> keys)
- 入參是一個 Iterable類型,對應的是緩存的 key
- 返回值是 void類型
- 刪除緩存中指定的 key 集合對應的緩存
invalidateAll()
- 沒有入參
- 返回值類型是 void
- 清除緩存中的所有緩存項
size()
- 返回緩存中的緩存項的數量大小
stats()
- 沒有入參
- 返回值類型是 CacheStats
- 返回此緩存的累積統計信息的當前快照。所有統計信息均初始化爲零,並在緩存的整個生命週期內單調增加。
asMap()
- 沒有入參
- 返回值類型是 ConcurrentMap
- 以線程安全映射的形式返回存儲在此緩存中的條目的視圖。對 map 的修改將直接影響緩存。
- 返回的映射中的迭代器至少是弱一致性的:它們可以安全地併發使用,但是如果在創建迭代器後修改了緩存(包括通過逐出),則尚不確定哪個更改(如果有)將反映在其中該迭代器。
cleanUp()
- 沒有入參
- 返回值類型是 void 類型
- 通過執行緩存所需要的任何未決的維護操作。 究竟哪些活動執行 - 如果有的話 - 是實現相關的
package com.google.common.cache;
import com.google.common.annotations.Beta;
import com.google.common.annotations.GwtCompatible;
import com.google.common.collect.ImmutableMap;
import com.google.common.util.concurrent.ExecutionError;
import com.google.common.util.concurrent.UncheckedExecutionException;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.ExecutionException;
import javax.annotation.Nullable;
@Beta
@GwtCompatible
public interface Cache<K, V> {
@Nullable
V getIfPresent(Object key);
V get(K key, Callable<? extends V> valueLoader) throws ExecutionException;
ImmutableMap<K, V> getAllPresent(Iterable<?> keys);
void put(K key, V value);
void putAll(Map<? extends K,? extends V> m);
void invalidate(Object key);
void invalidateAll(Iterable<?> keys);
void invalidateAll();
long size();
CacheStats stats();
ConcurrentMap<K, V> asMap();
void cleanUp();
}