[英]caching in java
伙計們,我正在用Java實現2級緩存的簡單示例:1級是內存2級-文件系統
我是Java的新手,我這樣做只是為了了解Java中的緩存。 很抱歉,我的英語不是我的母語:)
我已經通過使用LinkedHashMap類和removeEldestEntry方法完成了第一級,它看起來像這樣:
import java.util.*;
public class level1 {
private static final int max_cache = 50;
private Map cache = new LinkedHashMap(max_cache, .75F, true) {
protected boolean removeEldestEntry(Map.Entry eldest) {
return size() > max_cache;
}
};
public level1() {
for (int i = 1; i < 52; i++) {
String string = String.valueOf(i);
cache.put(string, string);
System.out.println("\rCache size = " + cache.size() +
"\tRecent value = " + i +
" \tLast value = " +
cache.get(string) + "\tValues in cache=" +
cache.values());
}
}
現在,我要編寫第二級代碼。 我應該編寫什么代碼,方法來實現此任務:
1)當第一級緩存已滿時,不應通過removeEldestEntry刪除該值,而應將其移到第二級(到文件)
2)將新值添加到第一級時,首先應在文件(第二級)中檢查該值,如果存在,則應將其從第二級移至第一級。
我嘗試使用LRUMap升級我的第一個級別,但是編譯器在庫中找不到類LRUMap,這是什么問題? 也許需要特殊的語法?
您既可以使用內置的Java序列化機制,也可以通過將DataOutputStrem與DataOutputStream包裝在一起,然后調用writeObjet()來將您的東西發送到文件中。
這種方法很簡單,但不夠靈活。 例如,如果您的類發生更改,您將無法從文件讀取舊的緩存。
您可以使用序列化到xml,例如JaxB或XStream。 我過去使用過XStream,它工作得很好。 您可以輕松地將任何集合存儲在文件中並進行還原。
顯然,您可以將內容存儲在DB中,但是它更加復雜。
有一點要注意的是,您對緩存的考慮不是線程安全 ! 默認情況下, LinkedHashMap
不是線程安全的,因此您需要同步對其的訪問。 更好的是,您可以使用ConcurrentHashMap ,它在內部處理同步,默認情況下可以處理16個單獨的線程(您可以通過其構造函數之一來增加此數目)。
我不知道您的確切要求或希望做到的復雜程度,但是您是否看過現有的緩存實現(例如ehcache庫)?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.