差異處

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

連向這個比對檢視

Both sides previous revision 前次修改
下次修改
前次修改
java:guava:suppliers:file_changed_cache [2016/08/12 15:10]
tony [Problem]
java:guava:suppliers:file_changed_cache [2023/06/25 09:48] (目前版本)
行 2: 行 2:
 ====== File Changed Cache ====== ====== File Changed Cache ======
 ===== Problem ===== ===== Problem =====
-讀取某個檔案建立model,可能因為成本昂貴而建立Cache。而因為檔案有修改而重新建立Cache,是常見的應用。本篇教學,將告訴你如何透過Guava達到這個需求。+讀取某個檔案建立model,可能因為成本昂貴而建立Cache;此外,程式可能會因為檔案有修改而重新建立Cache。本篇教學,將告訴你如何透過Guava達到這個需求。
 ===== How to? ===== ===== How to? =====
 +Guava本身有提供ExpiringMemoizingSupplier讓你以時間為條件,去重讀cache;ExpiredFileMemorizeSupplier使用Proxy的概念,去控管何時該真的去讀實際資料。我參考這個做法,建立了ExpiredFileMemorizeSupplier物件,會根據檔案是否修改,去決定是否讀真實資料:​
 <code java> <code java>
 package org.tonylin.practice.guava.cache;​ package org.tonylin.practice.guava.cache;​
行 42: 行 42:
 } }
 </​code>​ </​code>​
 +通常提供資料的物件,本身應為對應檔案的Information Export;因此我另外定義IFileDataSupplier介面去做這事情:​
 <code java> <code java>
 package org.tonylin.practice.guava.cache;​ package org.tonylin.practice.guava.cache;​
行 53: 行 54:
 } }
 </​code>​ </​code>​
 +以下為我的測試案例,去驗證資料是從cache來還是實際讀:​ (這延續之前的測試修改的,並非量身打造,莫見怪)
 <code java> <code java>
 package org.tonylin.practice.guava.cache;​ package org.tonylin.practice.guava.cache;​
行 145: 行 146:
 } }
 </​code>​ </​code>​
 +也許應該設計成Event-based的Eviction?​
 +===== 後記 =====
 +在Linux上發現,如果修改時間間格非常短(1秒以下)有可能偵測不出來。如果不在意或不影響的就維持目前作法;如果在意可能就要改用[[https://​docs.oracle.com/​javase/​tutorial/​essential/​io/​notification.html|File WatchService]]。
 +===== Reference =====
 +  * [[https://​github.com/​google/​guava/​wiki/​CachesExplained|Guava - CachesExplained]]
 +=====  =====
 +----
 +\\
 +~~DISQUS~~
 +