cache緩存的使用

計算或檢索一個值的代價很高,並且對同樣的輸入需要不止一次獲取值的時候,就應當考慮使用緩存

package com.google.guava;

import com.alibaba.fastjson.JSONObject;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;

import java.util.concurrent.TimeUnit;

/**
 * @author : ♞Demons♛
 * @date : 2020-01-03 20:47
 * Description :計算或檢索一個值的代價很高,
 * 並且對同樣的輸入需要不止一次獲取值的時候,就應當考慮使用緩存
 **/
public class TestGuavaCacheBuilder {

    private static LoadingCache<String, String> cache = CacheBuilder.newBuilder()
    		// 設置緩存的容量
            .maximumSize(100)
            .expireAfterWrite(10, TimeUnit.MINUTES)
            .build(new CacheLoader<String, String>() {
                @Override
                public String load(String appId) {
                	// 若緩存中無需要的數據,會執行以下方法
                    return queryUserInfoById(appId);
                }
            });

    public static void main(String[] args) throws Exception {
    	// 首次查詢緩存
        System.out.println(cache.get("1"));
        Thread.sleep(1000L);
        // 再次查詢緩存
        System.out.println(cache.get("1"));
    }

    private static String queryUserInfoById(String appId) {
        System.out.println("get user info from this method");
        JSONObject userInfo = new JSONObject();
        userInfo.put("1", "admin");
        userInfo.put("2", "test");
        return userInfo.getString(appId);
    }
}
運行結果:
get user info from this method
admin
admin

Process finished with exit code 0

可以看到程序在第一次通過appId獲取userInfo時調用了方法,第二次獲取時並未調用方法,而是走的緩存

  • 三種基於時間的清理或刷新緩存數據的方式:
    expireAfterAccess:當緩存項在指定的時間段內沒有被讀或寫就會被回收
    expireAfterWrite:當緩存項在指定的時間段內沒有更新就會被回收
    refreshAfterWrite:當緩存項上一次更新操作之後的多久會被刷新
  • 之前常用集合來做緩存,那它們有什麼區別呢?
    Guava Cache與集合很相似,但也不完全一樣;最基本的區別是集合會一直保存所有添加的元素,直到顯式地移除.相對地,Guava Cache爲了限制內存佔用,通常都設定爲自動回收元素,可設置過期時間.在某些場景下,儘管LoadingCache 不回收元素,它也是很有用的,因爲它會自動加載緩存.
發佈了27 篇原創文章 · 獲贊 22 · 訪問量 5740
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章