|
Java форум JavaTalks форум программистов
|
|
|
|
| Предыдущая тема :: Следующая тема |
| Автор |
Сообщение |
Polar Wolf : 8 Новичок
|
Апр 21, 2008 16:20 |
|
|
Ребята, как организовать с помощью java двухуровневый кеш, первый уровень, чтобы располагался в памяти, а второй на диске? Подскажите какие-нить источники где можно почитать про создание и настройку кеша (я с этим никогда не сталкивался, потому желательно, чтобы было все разложено по полочкам) или дайте какие-нить дельные советы по этой теме.
Заранее благодарен за любую помощь! |
|
|
|
 |
Marbo : 1179 Java Developer Откуда: Украина, Одесса
|
Апр 21, 2008 16:42 |
|
|
В классе LinkedHashMap<K,V> есть метод removeEldestEntry(Map.Entry<K,V>). Вы можете создать наследника этого класса, переопределить данный метод. Внутри него Вы должны проверять количество элементов карты, в случае, если оно превышает определенное значение, сохранять кэшевые значения на диск, например, посредством сериализации. В случае, если количество элементов превышает общее максимальное значение, старые элементы требуется удалить.
Опишите подробнее, каким образом должен работать кэш. _________________ Не знала Настя, где зад, где перёд. Показали - разобралась. |
|
|
|
 |
Polar Wolf : 8 Новичок
|
Апр 23, 2008 10:11 |
|
|
Необходимо создать конфигурируемый кэш с двумя уровнями (для того, чтобы кэшировать Объекты). Уровень 1 - память, уровень 2 - файловая система. Конфиг параметров должен позволять каждому определять стратегии кэша и максимальные размеры уровня 1 и 2.
Т.е. как я понимаю, необходимо задавать размер кэша не только в количестве элементов, но и в объеме занимаемой памяти, а под стратегией подразумевается срок жизни элементов на обоих уровнях.
Так вот, как с помощью хэш таблиц контролировать объем занимаемой памяти? И возможно ли хранить в Value файлы? Если возможно, было бы неплохо посмотреть простенькие исходники реализующие что-то подобное.
На счет сериализации, разве это оправдано? Ведь при больших обьемах данных она медленно работает. Есть что-то более подходящее под данную задачу?
Если можно поподробней, т.к. я в java новичок, и с кэшем никогда не работал. |
|
|
|
 |
Vlad : 1670 JavaTalks Team Member Откуда: ODS-KRK-LON-HFE
|
Апр 23, 2008 13:05 |
|
|
За базу реализации такого кэша можно взять класс LRUMap из Apache commons-collections. Этот класс реализует по сути LRU (Least Recently Used) стратегию кэша. В общем советую воспользоваться этим классом.
С размером в байтах будет тяжело, или же Вам потребуется написать метод, кот. будет считать с какой-то погрешностью количество памяти, занимаемое объектом при добавлении его в кэш. Класс LRUMap позволяет задавать максимальный размер кэша в количестве хранимых объектов: после того как кэш полон и нужно добавить новый объект, из кэша удаляется наидавней используемый объект, чтобы освободить место. Можете попробовать переопределить эту логику так, чтобы старый объект не просто удалялся, а переносился в кэш 2-го уровня на диск.
Относительно стандартной сериализации, как по мне, это единственное правильное решение для кэша общего типа (для любых типов объектов). Кроме того этот способ был бы наиболее быстрым, особенно при востановлении объектов со второго уровня кэша, + простой в реализации. |
|
|
|
 |
Ddrad : 16 Новичок
|
Май 17, 2011 12:31 |
|
|
Полностью задача звучит так:
"Create a configurable two-level cache (for caching Objects). Level 1 is memory, level 2 is filesystem. Config params should let one specify the cache strategies and max sizes of level 1 and 2." |
|
|
|
 |
Genua : 4 Новичок
|
Май 31, 2011 17:35 |
|
|
Господа, хочу оживить эту тему.
Недавно наткулся на эту самую задачу. Принцип с использованием наследника LinkedHashMap и сериализации ясен, не хватает понимания, как реализовать второй уровень кеша.
..например, при достижении лимита объема второго уровня, нужно заменить определенный объект (согласно стратегии кеширования) на новый - из первого уровня, - если я правильно понимаю. Как это лучше организовать? Загрузить все объекты из файла в память, произвести манипуляции с ними и заново сереализовать (перезаписать весь файл), думаю, не самый рациональный способ. Может кто-нибудь подсказать идею по лучше? |
|
|
|
 |
Eps : 139 Новичок
|
Июн 01, 2011 8:51 |
|
|
| Что мешает хранить информацию о них (объектах) в памяти, а сами объекты на диске? |
|
|
|
 |
Genua : 4 Новичок
|
Июн 01, 2011 9:10 |
|
|
| Eps, поясните пожалуйста подробнее. |
|
|
|
 |
Genua : 4 Новичок
|
Июн 01, 2011 10:22 |
|
|
Народ,
быть может другого способа и нет? Такой кэш будет мало эффективен и скорее представляет собой академический интерес.
Или может у кого-нибудь есть опыт разработки двухуровневого кэша в производстве? |
|
|
|
 |
Eps : 139 Новичок
|
Июн 01, 2011 13:13 |
|
|
| Genua писал(а): |
Народ,
быть может другого способа и нет? Такой кэш будет мало эффективен и скорее представляет собой академический интерес.
Или может у кого-нибудь есть опыт разработки двухуровневого кэша в производстве? |
http://www.javatalks.ru/sutra116627.php&highlight=#116627
| Цитата: |
| Что мешает хранить информацию о них (объектах) в памяти, а сами объекты на диске? |
Создаешь класс "Объект на диске". В нем описываешь полностью объект(дата послед. обращения и т. д.), а сам объект хранишь на диске. Когда надо быстро просмотреть информацию об объектах на диске - смотришь в список объектов класса "Объект на диске". |
|
|
|
 |
Ddrad : 16 Новичок
|
Июн 01, 2011 14:35 |
|
|
| Genua если не секрет, можете выложить код который вы еже написали по данной задачи-это просто спортивный интерес, просто в свое время эта задача загнола меня в угол |
|
|
|
 |
Skipy : 4805 Я тут живу! Откуда: Москва, Россия
|
Июн 01, 2011 15:57 |
|
|
| Ddrad писал(а): |
| это просто спортивный интерес |
Эта задача предлагается всем, проходящим интервью в одной компании. И уже очень давно. _________________ С уважением,
Евгений aka Skipy
www.skipy.ru
P.S. Я НЕ решаю задачи ЗА других! |
|
|
|
 |
Jean : 1992 JavaTalks Team Member Откуда: Санкт-Петербург
|
Июн 02, 2011 0:05 |
|
|
| Skipy писал(а): |
| Ddrad писал(а): |
| это просто спортивный интерес |
Эта задача предлагается всем, проходящим интервью в одной компании. И уже очень давно. |
А в другой не предлагается? _________________ Всякое решение плодит новые проблемы |
|
|
|
 |
evillive : 810 Постоянный посетитель
|
Июн 02, 2011 0:50 |
|
|
| Jean писал(а): |
| Skipy писал(а): |
| Ddrad писал(а): |
| это просто спортивный интерес |
Эта задача предлагается всем, проходящим интервью в одной компании. И уже очень давно. |
А в другой не предлагается? |
А в другой - нет. А почему возник такой вопрос? |
|
|
|
 |
Skipy : 4805 Я тут живу! Откуда: Москва, Россия
|
Июн 02, 2011 9:05 |
|
|
| Jean писал(а): |
| А в другой не предлагается? |
Может и предлагается. Мне ее как-то присылали из W..., но у меня ощущение, что ее источник - Yandex.  _________________ С уважением,
Евгений aka Skipy
www.skipy.ru
P.S. Я НЕ решаю задачи ЗА других! |
|
|
|
 |
|
|
|