2011-01-27 3 views
1

ребят Я внедряющие простой пример кэша 2 уровня в Java: первого уровень Memeory второй - файловая системакэширования в яве

Я новичок в 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()); 

    } 

} 

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

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

+2

LRUMap - это коллекция в apache commons, она не находится в базовой библиотеке Java. Поэтому вам нужно будет загрузить и использовать библиотеку apache commons для использования LRUMap. – berry120

+0

Если это для lern java, тогда все в порядке, я хочу использовать его в производстве, вместо этого вы можете использовать EHCache. – Ralph

+0

Спасибо большое! Во-первых, я должен начать с изучения простых конструкций, потому что я полагаю, что основные принципы используются в таких продуктах, как EHCache и OSCache. – BraginiNI

ответ

1

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

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

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

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

+0

Как я могу переопределить removeEldestEntry для сохранения самой старой записи в файл с помощью механизма сериализации java или Xstream? не удалять – BraginiNI

0

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

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

Смежные вопросы