Guava Cache的Ticker

緩存一般設置的都有過期時間,如果我們寫單元測試代碼需要驗證這個功能(緩存過期,自動刪除)。假如設置的過期時間是1個小時,我們來驗證1h後緩存是否被刪除,那我們總不能讓單元測試代碼運行1個小時吧。

public class Demo{

	public static void main(String[] args)  { 
		// 自定義ticker
		TestTicker testTicker = new TestTicker();

        // 創建緩存,1小時沒有訪問則過期
        Cache<String, byte[]> cache = CacheBuilder.newBuilder().ticker(testTicker).expireAfterAccess(1, TimeUnit.HOURS).build();
        cache.put("id", new byte[1024 * 1024]);

        // 模擬時間流逝
        testTicker.addElapsedTime(TimeUnit.NANOSECONDS.convert(1, TimeUnit.HOURS));

        System.out.println(cache.getIfPresent("id") == null);//true
    }

    private static class TestTicker extends Ticker {
        private long start = Ticker.systemTicker().read();
        private long elapsedNano = 0;

        @Override
        public long read() {
            return start + elapsedNano;
        }

        public void addElapsedTime(long elapsedNano) {
            this.elapsedNano = elapsedNano;
        }
    }
}

使用自定義ticker,我們可以達到隨意改變當前時間的目的,就可以很快地驗證緩存過期,而不是傻傻等1小時。如果創建cache的時候沒有設置ticker,那麼使用的是系統的ticker,依靠系統時鐘來做時間判斷。


總之,ticker就是用來做測試用途,能夠讓我們改變時間源,模擬任何我們想要的時間流逝效果。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章