Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Необходимо кэшировать упорядоченные коллекции


Автор: BegemotX2 18.9.2009, 16:47
Есть набор массивов (бооольших.. скажем, по несколько десятков миллинов элементов). Элементы массивов (кроме прочего) имеют дату и упорядочены по неубыванию.
Нужно:
- хранить их в бд
- совершать выборки по идентификатору массива и по диапазону дат
- выборки "сколько элементов с датой <= чем, заданная"
- добавлять/удалять
- изменять элементы, однако эта операция нетипична для этой задачи, в большинстве случаев может изменяться только самый последний элемент в массиве. К тому же, элементы могут иметь одинаковую дату, а, значит, для изменения необходим дополнительный ключ, чего хотелось бы избежать, реализовав операцию изменения через удаление+вставку.

Понятно, что это несложно сделать на уровне базы данных. 

Но элементы необходимо кэшировать. Причем, не по запросам, а по датам.. Ведь "выбрать с 1-янв-2009 по 18-сен-2009" - "выбрать с 2-янв-2009 по 18-сен-2009" и это разные запросы, но общие данные. 

Насколько я знаю, наиболее распространенные релизации кэшей для java (ehcache, oscache, итд) используют модель кэширования по ключу, что неприемлемо, т.к. невыгодно индексировать и искать каждый элемент массива по отдельности.

Для полноты картины: потоков-читателей много, писатель - один.. желательно, чтобы если писатель пишет в один из массив, то читающие из других массивов - не блокировались. Подавляющее большинство (99,99%  smile  ) обновлений - это либо изменение самого последнего элемента в каком-то из массивов, либо дописывание в конец массива.

Подскажите, как эффективно решить такую задачу. Может, существуют специфичные библиотеки... или просто - что бы вы сделали на моем месте?

Автор: MisterCleric 18.9.2009, 17:23
Цитата

по несколько десятков миллинов элементов

Сразу говорит о том, что все должно быть в базе... Других вариантов нету. Ты просто сожрешь такими размерами оперативную память и все сдохнет. Да и поиск в такой загруженной памяти не будет эфективным. Не морочь себе голову. Держи все в базе и не парся. 
Если все-таки решишь кешировать, то все равно придется смотреть в сторону движков кешей. У них должен быть механиз для хранения коллекции. Да и все предоставляют механиз так называемых "eviction", т.е. удаление из кеша сущности по истечению какого-то времени. 
Я пользуюсь http://jbosscache.blogspot.com/
И вот пример его настройки:
Код

<property name="defaultEvictionRegionConfig">
                  <bean class="org.jboss.cache.config.EvictionRegionConfig">
                     <property name="regionName">/</property>
                     <property name="evictionAlgorithmConfig">
                        <bean class="org.jboss.cache.eviction.LRUAlgorithmConfig">

                           <property name="maxNodes">10000</property>

                           <property name="timeToLiveSeconds">1800</property>
                           <property name="minTimeToLiveSeconds">120</property>
                        </bean>
                     </property>
                  </bean>
               </property>

Как видишь максимальное количество содержимого 10000, а не миллионы.
Время жизни после последнего обращения полчаса.
Время перед изгнанием - 2 мин.
Так что думай. 

Автор: BegemotX2 18.9.2009, 17:32
MisterCleric, понятно, что все должно быть в базе и что объекты будут временами удаляться. Но кэширование необходимо потому что данные нужны быстро, и реальное использование этих данных такое, что все данные обычно не нужны. Чаще - данные из небольшого количества диапазонов будут многократно читаться разными потоками.
На JBoss Cache посмотрю..

Автор: COVD 18.9.2009, 17:49
Цитата

либо изменение самого последнего элемента в каком-то из массивов, либо дописывание в конец массива.

Данные текущего дня, которые непрерывно меняются, имеет смысл кешировать. А "исторические" данные (предыдущие дни) брать из базы данных.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)