簡體   English   中英

用Java緩存

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM