кэширование в Java - PullRequest
       3

кэширование в Java

1 голос
/ 27 января 2011

Ребята, я реализую простой пример двухуровневого кеша в Java: 1-й уровень - это мемориальный, 2-й - файловая система

Я новичок в Java и делаю это только для понимания кеширования в Java.И извините за мой английский, этот язык не является родным для меня:)

Я прошел 1-й уровень, используя класс 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());

    }

}

СейчасЯ собираюсь закодировать мой 2-й уровень.Какой код, методы, которые я должен написать для реализации этих задач:
1) Когда кэш 1-го уровня заполнен, значение не должно быть удалено с помощью removeEldestEntry, но оно должно быть перемещено на 2-й уровень (в файл)
2) Когда новые значения добавляются на 1-й уровень, сначала это значение следует проверить в файле (2-й уровень), а если оно существует, его следует переместить со 2-го на 1-й уровень.

И я попытался использовать LRUMap дляобновить мой 1-й уровень, но компилятор не может найти класс LRUMap в библиотеке, в чем проблема?Может быть, нужен специальный синтаксис?

Ответы [ 2 ]

1 голос
/ 27 января 2011

Вы можете использовать встроенный механизм сериализации Java и просто отправить свои материалы в файл, обернув FileOutputStrem с DataOutputStream и затем вызвав writeObjet ().

Этот метод прост, но недостаточно гибок. например, вы не сможете прочитать старый кеш из файла, если ваши классы изменились.

Вы можете использовать сериализацию в XML, например, JaxB или XStream. Я использовал XStream в прошлом, и он работал просто отлично. Вы можете легко сохранить любую коллекцию в файле и восстановить ее.

Очевидно, что вы можете хранить вещи в БД, но это сложнее.

0 голосов
/ 27 января 2011

Замечание: вы не получаете потокобезопасность для вашего кеша! По умолчанию LinkedHashMap не является поточно-ориентированным, и вам необходимо синхронизировать ваш доступ к нему. Еще лучше то, что вы могли бы использовать ConcurrentHashMap , который имеет дело с внутренней синхронизацией, способной по умолчанию обрабатывать 16 отдельных потоков (вы можете увеличить это число с помощью одного из его конструкторов).

Я не знаю ваших точных требований или насколько сложным вы хотите, чтобы это было, но рассматривали ли вы существующие реализации кеша, такие как ehcache библиотека?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...