差異處

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

連向這個比對檢視

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