差異處

這裏顯示兩個版本的差異處。

連向這個比對檢視

下次修改
前次修改
java:guava:cache:helloworld [2016/04/13 13:40]
tony 建立
java:guava:cache:helloworld [2023/06/25 09:48] (目前版本)
行 1: 行 1:
 {{tag>​java guava}} {{tag>​java guava}}
 ====== Guava Cache Hello World ====== ====== Guava Cache Hello World ======
 +===== Introduction =====
 +大部分應用程式都會透過Cache機制,去增加效能或暫時性的備援。Guava提供了簡單的Cache實做,讓你不用替資源回收或同步問題煩惱。
 ===== How to? ===== ===== How to? =====
 +我們可以透過CacheBuilder去設定Cache的條件。在build時,你可以選擇要預先提供服務實做(CacheLoader),或是在get時提供。以下是在build時,就提供了服務實做:​
 <code java> <code java>
-package org.tonylin.practice.guava.cache;​ +@Test 
- +public void test() throws Exception { 
-import java.util.concurrent.TimeUnit;​ + LoadingCache<​String,​ String> cache =  CacheBuilder.newBuilder() 
- + .maximumSize(10) 
-import org.junit.Assert;​ + .expireAfterAccess(5,​ TimeUnit.SECONDS) 
-import org.junit.Test;​ + .expireAfterWrite(5,​ TimeUnit.SECONDS) 
- + .softValues() 
-import com.google.common.cache.CacheBuilder;​ + .build(new CacheLoader<​String,​ String>​(){ 
-import com.google.common.cache.CacheLoader;​ + private int count = 0; 
-import com.google.common.cache.LoadingCache;​ + @Override 
- + public String load(String key) throws Exception { 
-public class TestCache { + return key + (count++);​ 
- +
- @Test + });
- public void test() throws Exception { +
- LoadingCache<​String,​ String> cache =  CacheBuilder.newBuilder() +
- .maximumSize(10) +
- .expireAfterAccess(5,​ TimeUnit.SECONDS) +
- .expireAfterWrite(5,​ TimeUnit.SECONDS) +
- .softValues() +
- .build(new CacheLoader<​String,​ String>​(){ +
- private int count = 0; +
- @Override +
- public String load(String key) throws Exception { +
- return key + (count++);​ +
- +
- });+
   
- Assert.assertEquals("​test10",​ cache.get("​test1"​));​ + Assert.assertEquals("​test10",​ cache.get("​test1"​));​ 
- Thread.sleep(4000);​ + Thread.sleep(4000);​ 
- Assert.assertEquals("​test10",​ cache.get("​test1"​));​ + Assert.assertEquals("​test10",​ cache.get("​test1"​));​ 
- Thread.sleep(2000);​ + Thread.sleep(2000);​ 
- Assert.assertNull(cache.getIfPresent("​test1"​));​ + Assert.assertNull(cache.getIfPresent("​test1"​));​ 
- Assert.assertEquals("​test11",​ cache.get("​test1"​));​ + Assert.assertEquals("​test11",​ cache.get("​test1"​));​
- }+
 } }
 </​code>​ </​code>​
 +在get時才能決定實做:​
 +<code java>
 +@Test
 +public void testCache() throws Exception {
 + Cache<​String,​ String> cache =  CacheBuilder.newBuilder()
 + .maximumSize(10)
 + .expireAfterAccess(5,​ TimeUnit.SECONDS)
 + .expireAfterWrite(5,​ TimeUnit.SECONDS)
 + .softValues()
 + .build();
 +
 + Assert.assertEquals("​0",​ cache.get("​test1",​ ()->​{return "​0";​}));​
 + Thread.sleep(4000);​
 + Assert.assertEquals("​0",​ cache.get("​test1",​ ()->​{return "​1";​}));​
 + Thread.sleep(2000);​
 + Assert.assertNull(cache.getIfPresent("​test1"​));​
 + Assert.assertEquals("​2",​ cache.get("​test1",​ ()->​{return "​2";​}));​
 +}
 +</​code>​
 +從範例可以得知,在cache過期前,都不會實際去執行服務取得內容。
 =====  ===== =====  =====
 ---- ----
 \\ \\
 ~~DISQUS~~ ~~DISQUS~~