guava-cache內存緩存API使用java
google guava中有cache包,此包提供內存緩存功能。內存緩存須要考慮不少問題,包括併發問題,緩存失效機制,內存不夠用時緩存釋放,緩存的命中率,緩存的移除等等。 固然這些東西guava都考慮到了。算法
guava中使用緩存須要先聲明一個CacheBuilder對象,並設置緩存的相關參數,而後調用其build方法得到一個Cache接口的實例。請看下面的代碼和註釋,注意在註釋中指定了Cache的各個參數。緩存
import com.google.common.cache.*; import com.wentianxia.entity.User; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; public class GuavaCache { public static void main(String[] args) throws ExecutionException, InterruptedException{ //緩存接口這裏是LoadingCache,LoadingCache在緩存項不存在時能夠自動加載緩存 LoadingCache<Integer,User> studentCache //CacheBuilder的構造函數是私有的,只能經過其靜態方法newBuilder()來得到CacheBuilder的實例 = CacheBuilder.newBuilder() //設置併發級別爲8,併發級別是指能夠同時寫緩存的線程數 .concurrencyLevel(8) //設置寫緩存後8秒鐘過時 .expireAfterWrite(5, TimeUnit.SECONDS) //設置緩存容器的初始容量爲10 .initialCapacity(10) //設置緩存最大容量爲100,超過100以後就會按照LRU最近雖少使用算法來移除緩存項 .maximumSize(100) //設置要統計緩存的命中率 .recordStats() //設置緩存的移除通知 .removalListener(notification -> System.out.println(notification.getKey() + " was removed, cause is " + notification.getCause())) //build方法中能夠指定CacheLoader,在緩存不存在時經過CacheLoader的實現自動加載緩存 .build( new CacheLoader<Integer, User>() { @Override public User load(Integer key) throws Exception { System.out.println("load student " + key); User student = new User(); student.setId(Long.valueOf(key)); student.setUsername("name " + key); return student; } } ); for (int i=0;i<20;i++) { //從緩存中獲得數據,因爲咱們沒有設置過緩存,因此須要經過CacheLoader加載緩存數據 User student = studentCache.get(1); System.out.println(student); //休眠1秒 TimeUnit.SECONDS.sleep(1); } System.out.println("cache stats:"); //最後打印緩存的命中率等 狀況 System.out.println(studentCache.stats().toString()); } }
以上程序的輸出以下:併發
load student 1 Student{id=1, name=name 1} Student{id=1, name=name 1} Student{id=1, name=name 1} Student{id=1, name=name 1} Student{id=1, name=name 1} Student{id=1, name=name 1} Student{id=1, name=name 1} Student{id=1, name=name 1} 1 was removed, cause is EXPIRED load student 1 ...... Student{id=1, name=name 1} Student{id=1, name=name 1} Student{id=1, name=name 1} Student{id=1, name=name 1} cache stats: CacheStats{hitCount=17, missCount=3, loadSuccessCount=3, loadExceptionCount=0, totalLoadTime=1348802, evictionCount=2}
看看到在20此循環中命中次數是17次,未命中3次,這是由於咱們設定緩存的過時時間是寫入後的8秒,因此20秒內會失效兩次,另外第一次獲取時緩存中也是沒有值的,因此纔會未命中3次,其餘則命中。ide
guava的內存緩存很是強大,能夠設置各類選項,並且很輕量,使用方便。另外還提供了下面一些方法,來方便各類須要:函數