Guava是google下的一個java工具類的項目,官方網站:https://github.com/google/guava,其中集合工具,緩存工具和併發工具是比較經常使用的幾個工具集。java
使用方法是pom中引入對應的包
git
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>19.0</version> </dependency>
如下是經常使用的使用方法,咱們須要把一個員工的工號(Interge.class)和他的用戶信息(User.class)緩存起來github
LoadingCache<Integer, User> users = CacheBuilder.newBuilder() .maximumSize(1000) .expireAfterWrite(10, TimeUnit.MINUTES) .build( new CacheLoader<Integer, User>() { public User load(Integer empId) throws Exception { return getUserByEmpId(empId); } }); User user=users.get(TEST_EMPID);
其中load方法只有在緩存中沒有對應的數據的時候被調用,其餘的時候會從緩存中取到shell
其中load方法是會拋出Exception的,若是不拋出對應的Exception,則調用的時候也能夠使用getUnchecked(K)緩存
在調用的時候也能夠使用getAll(Iterabale<? extends K>)的方式獲取批量數據。併發
另外Guava的Cache也能夠使用get(K,Callaleb<V>)的方法,若是有緩存則返回,不然運算緩存再返回
ide
Cache<Integer, User> users= CacheBuilder.newBuilder() .maximumSize(1000) .build(); try { cache.get(TEST_EMPID, new Callable<Integer, User>() { @Override public User call() throws AnyException { return getUserByEmpId(empId); } }); } catch (ExecutionException e) { throw new OtherException(e.getCause()); }
Guava的緩存有3種,
工具
1 基於容量回收,這個和設置的maximunSize有關性能
2 定時回收,這個和設置的expireAfterAccess,expiredAfterWrite有關網站
3 基於引用回收,這個和設置的weakKeys,weakValues和softValues有關。
CacheBuilder.weakKeys():使用弱引用存儲鍵。當鍵沒有其它(強或軟)引用時,緩存項能夠被垃圾回收。由於垃圾回收僅依賴恆等式(==),使用弱引用鍵的緩存用==而不是equals比較鍵。 CacheBuilder.weakValues():使用弱引用存儲值。當值沒有其它(強或軟)引用時,緩存項能夠被垃圾回收。由於垃圾回收僅依賴恆等式(==),使用弱引用值的緩存用==而不是equals比較值。 CacheBuilder.softValues():使用軟引用存儲值。軟引用只有在響應內存須要時,才按照全局最近最少使用的順序回收。考慮到使用軟引用的性能影響,咱們一般建議使用更有性能預測性的緩存大小限定(見上文,基於容量回收)。使用軟引用值的緩存一樣用==而不是equals比較值。
Guava支持設置一個移除監聽器,當你移除一個緩存項的時候作對應的操做
RemovalListener<Key, DatabaseConnection> removalListener = new RemovalListener<Key, DatabaseConnection>() { public void onRemoval(RemovalNotification<Key, DatabaseConnection> removal) { DatabaseConnection conn = removal.getValue(); conn.close(); // tear down properly } };
參考文檔: