Guava-Cache內存緩存API使用

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的內存緩存很是強大,能夠設置各類選項,並且很輕量,使用方便。另外還提供了下面一些方法,來方便各類須要:函數

  • ImmutableMap<K, V> getAllPresent(Iterable<?> keys) 一次得到多個鍵的緩存值
  • put和putAll方法向緩存中添加一個或者多個緩存項
  • invalidate 和 invalidateAll方法從緩存中移除緩存項
  • asMap()方法得到緩存數據的ConcurrentMap<K, V>快照
  • cleanUp()清空緩存
  • refresh(Key) 刷新緩存,即從新取緩存數據,更新緩存
相關文章
相關標籤/搜索