緩存的作用
提升系統性能,暫時在內存中保存業務系統的數據處理結果,并且等待下次訪問使用
本地緩存和分布式緩存
緩存分為本地緩存與分布式緩存。本地緩存為了保證線程安全問題,一般使用ConcurrentMap的方式保存在內存之中,而常見的分布式緩存則有Redis,MongoDB等。
本地緩存適用于數據量較小或變動較少的數據,因為變動多需要考慮到不同實例的緩存一致性問題,而數據量大則需要考慮緩存回收策略及GC相關的問題
Guava Cache
Guava Cache是一個全內存的本地緩存實現,它提供了線程安全的實現機制。整體上來說Guava cache 是本地緩存的不二之選,簡單易用,性能好。
Guava是Google提供的一個核心Java類庫,其中包含:集合【collections】、緩存【caching】、原生類型支持【primitives support】、并發庫【concurrency libraries】、通用注解【common annotations】、字符串處理【string processing】、I/O 等等。
創建方法
通過CacheBuilder類構建一個緩存對象,CacheBuilder類采用builder設計模式,它的每個方法都返回CacheBuilder本身,直到build方法被調用。
常用配置
initialCapacity(100):初始容量
maximumSize(1000):最大記錄數,超出容量刪除數據
maximumWeight(long):指定最大總重,超出權重刪除數據
weigher(Weigher):指定一個權重函數
expireAfterWrite: 寫緩存后多久過期
expireAfterAccess: 讀寫緩存后多久過期
Cache.invalidate(key):清除單個key
Cache.invalidateAll(keys):批量清除key
Cache.invalidateAll():清除所有緩存項
weakKeys():使用弱引用存儲鍵。當鍵沒有其它(強或軟)引用時,緩存項可以被垃圾回收
weakValues():使用弱引用存儲值。當值沒有其它(強或軟)引用時,緩存項可以被垃圾回收
softValues():使用軟引用存儲值。軟引用只有在響應內存需要時,才按照全局最近最少使用的順序回收。
LoadingCache:使用自定義ClassLoader加載數據,置入內存中。從LoadingCache中獲取數據時,若數據存在則直接返回;若數據不存在,則根據ClassLoader的load方法加載數據至內存,然后返回該數據
import com.google.common.cache.*;import javax.annotation.CheckForNull;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;public class GuavaTest {public static void main(String[] args) throws ExecutionException {GuavaTest test = new GuavaTest();test.cache.put(1, 2);System.out.println(test.cache.getIfPresent(2));test.cache1.put("1", "1");System.out.println(test.cache1.get("1"));}Cache<Integer, Integer> cache = CacheBuilder.newBuilder().maximumSize(3).expireAfterWrite(5, TimeUnit.MINUTES).build();LoadingCache<String, String> cache1 = CacheBuilder.newBuilder().build(new CacheLoader<String, String>() {@Overridepublic String load(String str) throws Exception {return "a";}});
}