使用Guava的Cache功能

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
    }
};

參考文檔:

http://ifeve.com/google-guava/

http://ifeve.com/google-guava-cachesexplained/

相關文章
相關標籤/搜索