使用google guava作內存緩存

google guava中有cache包,此包提供內存緩存功能。內存緩存須要考慮不少問題,包括併發問題,緩存失效機制,內存不夠用時緩存釋放,緩存的命中率,緩存的移除等等。 固然這些東西guava都考慮到了。算法

guava中使用緩存須要先聲明一個CacheBuilder對象,並設置緩存的相關參數,而後調用其build方法得到一個Cache接口的實例。請看下面的代碼和註釋,注意在註釋中指定了Cache的各個參數。緩存

public static void main(String[] args) throws ExecutionException, InterruptedException{         //緩存接口這裏是LoadingCache,LoadingCache在緩存項不存在時能夠自動加載緩存         LoadingCache<Integer,Student> studentCache                 //CacheBuilder的構造函數是私有的,只能經過其靜態方法newBuilder()來得到CacheBuilder的實例                 = CacheBuilder.newBuilder()                 //設置併發級別爲8,併發級別是指能夠同時寫緩存的線程數                 .concurrencyLevel(8)                 //設置寫緩存後8秒鐘過時                 .expireAfterWrite(8, TimeUnit.SECONDS)                 //設置緩存容器的初始容量爲10                 .initialCapacity(10)                 //設置緩存最大容量爲100,超過100以後就會按照LRU最近雖少使用算法來移除緩存項                 .maximumSize(100)                 //設置要統計緩存的命中率                 .recordStats()                 //設置緩存的移除通知                 .removalListener(new RemovalListener<Object, Object>() {                     @Override                     public void onRemoval(RemovalNotification<Object, Object> notification) {                         System.out.println(notification.getKey() + " was removed, cause is " + notification.getCause());                     }                 })                 //build方法中能夠指定CacheLoader,在緩存不存在時經過CacheLoader的實現自動加載緩存                 .build(                         new CacheLoader<Integer, Student>() {                             @Override                             public Student load(Integer key) throws Exception {                                 System.out.println("load student " + key);                                 Student student = new Student();                                 student.setId(key);                                 student.setName("name " + key);                                 return student;                             }                         }                 );         for (int i=0;i<20;i++) {             //從緩存中獲得數據,因爲咱們沒有設置過緩存,因此須要經過CacheLoader加載緩存數據             Student student = studentCache.get(1);             System.out.println(student);             //休眠1秒             TimeUnit.SECONDS.sleep(1);         }         System.out.println("cache stats:");         //最後打印緩存的命中率等 狀況         System.out.println(studentCache.stats().toString());     }

以上程序的輸出以下:併發

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

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