差異處
這裏顯示兩個版本的差異處。
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~~ |