| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > Необходимо кэшировать упорядоченные коллекции |
| Автор: BegemotX2 18.9.2009, 16:47 |
| Есть набор массивов (бооольших.. скажем, по несколько десятков миллинов элементов). Элементы массивов (кроме прочего) имеют дату и упорядочены по неубыванию. Нужно: - хранить их в бд - совершать выборки по идентификатору массива и по диапазону дат - выборки "сколько элементов с датой <= чем, заданная" - добавлять/удалять - изменять элементы, однако эта операция нетипична для этой задачи, в большинстве случаев может изменяться только самый последний элемент в массиве. К тому же, элементы могут иметь одинаковую дату, а, значит, для изменения необходим дополнительный ключ, чего хотелось бы избежать, реализовав операцию изменения через удаление+вставку. Понятно, что это несложно сделать на уровне базы данных. Но элементы необходимо кэшировать. Причем, не по запросам, а по датам.. Ведь "выбрать с 1-янв-2009 по 18-сен-2009" - "выбрать с 2-янв-2009 по 18-сен-2009" и это разные запросы, но общие данные. Насколько я знаю, наиболее распространенные релизации кэшей для java (ehcache, oscache, итд) используют модель кэширования по ключу, что неприемлемо, т.к. невыгодно индексировать и искать каждый элемент массива по отдельности. Для полноты картины: потоков-читателей много, писатель - один.. желательно, чтобы если писатель пишет в один из массив, то читающие из других массивов - не блокировались. Подавляющее большинство (99,99% Подскажите, как эффективно решить такую задачу. Может, существуют специфичные библиотеки... или просто - что бы вы сделали на моем месте? |
| Автор: MisterCleric 18.9.2009, 17:23 | ||||
Сразу говорит о том, что все должно быть в базе... Других вариантов нету. Ты просто сожрешь такими размерами оперативную память и все сдохнет. Да и поиск в такой загруженной памяти не будет эфективным. Не морочь себе голову. Держи все в базе и не парся. Если все-таки решишь кешировать, то все равно придется смотреть в сторону движков кешей. У них должен быть механиз для хранения коллекции. Да и все предоставляют механиз так называемых "eviction", т.е. удаление из кеша сущности по истечению какого-то времени. Я пользуюсь http://jbosscache.blogspot.com/ И вот пример его настройки:
Как видишь максимальное количество содержимого 10000, а не миллионы. Время жизни после последнего обращения полчаса. Время перед изгнанием - 2 мин. Так что думай. |
| Автор: BegemotX2 18.9.2009, 17:32 |
| MisterCleric, понятно, что все должно быть в базе и что объекты будут временами удаляться. Но кэширование необходимо потому что данные нужны быстро, и реальное использование этих данных такое, что все данные обычно не нужны. Чаще - данные из небольшого количества диапазонов будут многократно читаться разными потоками. На JBoss Cache посмотрю.. |
| Автор: COVD 18.9.2009, 17:49 | ||
Данные текущего дня, которые непрерывно меняются, имеет смысл кешировать. А "исторические" данные (предыдущие дни) брать из базы данных. |