|
|
|
Вопрос по Spring @Cacheable
|
|||
|---|---|---|---|
|
#18+
Добрый день! Помогите пожалуйста решить такую задачу: Есть отностилельно длительная операция чтения из БД. Читаются "все данные" за определенный промежуток времени (последние 3 месяца, последние полгода, прошлый год и т.п.). Чтобы ускорить это узкое место (запись происходит очень редко - почти всегда чтение) я решил написать некий аналог кэша - это лист с полученными записями и две "даты" (с ... по ...), указывающие какие значения в нашем листе уже есть. Соответственно при получении запроса данные выбираются из имеющегося листа или если диапазон шире в него данные "довыбираются" из базы и опять же это хозяйство возвращается. И тут внезапно я открыл для себя что спринг как всегда про все уже "подумал" и все уже написано, т.е. прочел про @Cacheable. Попробовал с небольшой entity - остался очень доволен результатом. Однако @Cacheable вытягивает данные из кэша если запрос "повторяется", что совсем не то что мне нужно. Нужно чтобы если в кэше есть данные за последний месяц а зпрос пришел "за последние 2 месяца", то он "возвращал" имеющийся у него месяц и довыбирал данные за еще один (и оставлял "у себя" данные уже за 2 месяца). Решения такой задачи не нашел, но учитывая что я в Spring новичек думаю может и оно таки есть? Подскажите пожалуйста, люди добрые. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2016, 09:11 |
|
||
|
Вопрос по Spring @Cacheable
|
|||
|---|---|---|---|
|
#18+
RuslanGab, Смотри CacheResolver, CacheManager и Cache. Тебе просто для этого случая нужно написать свою реализацию Cache, которая бы анализировала ключи и делала довыборку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2016, 09:17 |
|
||
|
Вопрос по Spring @Cacheable
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Спасибо! Вы мне не первый раз отвечаете, причем молниеносно:) Теперь знаю куда копать - буду разбираться. Спасибо еще раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2016, 09:45 |
|
||
|
Вопрос по Spring @Cacheable
|
|||
|---|---|---|---|
|
#18+
BlazkowiczRuslanGab, Смотри CacheResolver, CacheManager и Cache. Тебе просто для этого случая нужно написать свою реализацию Cache, которая бы анализировала ключи и делала довыборку. Вы действительно так быстро ответили. Как это у вас получилось? Вы быстро нагуглили или работали с этим? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2016, 09:58 |
|
||
|
Вопрос по Spring @Cacheable
|
|||
|---|---|---|---|
|
#18+
Паша01Вы действительно так быстро ответили. Как это у вас получилось? Вы быстро нагуглили или работали с этим? Ну, по опыту, такие абстракции должны были существовать. Хорошие фреймверки позволяют написать свою реализацию на любом уровне. Поэтому я открыл мануал на нужном разделе http://docs.spring.io/spring/docs/current/spring-framework-reference/html/cache.html и быстро просмотрел, что такое возможно в принципе, а так же полистал классы в IDE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2016, 10:01 |
|
||
|
Вопрос по Spring @Cacheable
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Здорово, вроде все кажется так просто)) Я уже начал подозревать, что под ником Blazkowicz скрывается целая компания программистов))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2016, 10:04 |
|
||
|
Вопрос по Spring @Cacheable
|
|||
|---|---|---|---|
|
#18+
BlazkowiczПаша01Вы действительно так быстро ответили. Как это у вас получилось? Вы быстро нагуглили или работали с этим? Ну, по опыту, такие абстракции должны были существовать. Хорошие фреймверки позволяют написать свою реализацию на любом уровне. Поэтому я открыл мануал на нужном разделе http://docs.spring.io/spring/docs/current/spring-framework-reference/html/cache.html и быстро просмотрел, что такое возможно в принципе, а так же полистал классы в IDE. Да опыт сила - никто наверное всего не знает и нужно погуглить/посмотреть время от времени, вот только человек с опытом знает куда смотреть и решение найдет сразу, а когда ты "вообще не в курсе" будешь копошиться целый день:( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2016, 10:44 |
|
||
|
Вопрос по Spring @Cacheable
|
|||
|---|---|---|---|
|
#18+
Интересно было бы увидеть такую реализацию кеша . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2016, 11:23 |
|
||
|
Вопрос по Spring @Cacheable
|
|||
|---|---|---|---|
|
#18+
Atum1Интересно было бы увидеть такую реализацию кеша . Примерно так... Код: java 1. 2. 3. 4. 5. 6. 7. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. Тут далее выбираем данные из существующего кэша к примеру (ну надо знать в кэше с каким ключом они есть) и "довыбираем" уже некэшированными запросами из базы и т.п. Вариантов много и это уже дело техники - я реализовал и оно работает, но мне не очень нравится так что я это место не привожу буду переделывать немного иначе. Важно что в итоге мы "формируем" новый кэш и возвращаем его - таким образом запрос к базе получается "видит" что в кэше это уже есть и берет это а в базу не лезет. Профит в том что мы когда формировали "ответ" кэша или в базу вообще не лезли ("фильтровали" то что есть) или довыбирали данные частично, что много быстрее в моем случае. Плюшки от такой реализации а не решения "в лоб" с локальными переменнами - возможности конфигурирования размера, время жизни кэша и т.п. Я конечно не профи может где не оптимально, но во всяком случае по скорости запросов (скажем было за последний год а я выбираю все - данные последнего года уже из базы не тянутся) прирост чувствуется. Как-то так.. Код: java 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2016, 13:20 |
|
||
|
Вопрос по Spring @Cacheable
|
|||
|---|---|---|---|
|
#18+
RuslanGab, интересный подход , но много но .... А почему вы не стали рассматривать решение на уровне БД ? Хранить Временную талицу/ View - «материализованных представлений» Мне почему-то кажется такой подход проще и логичнее ИМХО. У вас задача сводится чисто к игре с датами - вам каждый раз нужно решать какой объем хранить в памяти - а что если выборка будет за период смещенный на одни день влево /право - от дат вашего кеша? итд ... много сложных условий на перекрытие итд .... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 11:19 |
|
||
|
Вопрос по Spring @Cacheable
|
|||
|---|---|---|---|
|
#18+
Atum1А почему вы не стали рассматривать решение на уровне БД ? Хранить Временную талицу/ View - «материализованных представлений» Согласен подход хороший. Конкретно в моем случае проблема в "узкости" скороcти базы, отчего я о решениях на уровне БД если честно даже и не думал... Atum1У вас задача сводится чисто к игре с датами - вам каждый раз нужно решать какой объем хранить в памяти - а что если выборка будет за период смещенный на одни день влево /право - от дат вашего кеша? итд ... много сложных условий на перекрытие итд .... Тут не совсем согласен. Игра с датами - да. Однико при "смещении" вопрос решается довыборкой только за период смещения, что сравнительно быстро (во всяком случае у меня "прирост" скорости раза в два хотя все от "перодов" конечно зависит). Все "остальная" часть это тупой перебор коллекции, вытаскиваемой из кэша, что осушествляется практически мгновенно. При выборке более "узких" перодов многотысячные строки "выскакивают" в течение секунды. В целом я доволен. Решения конечно могут быть разные я не претендую на однозначный "бэст практик", но в целом доволен. Не берусь судить было ли бы быстрее через уровень БД - не уверен. Проще - да согласен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 13:43 |
|
||
|
Вопрос по Spring @Cacheable
|
|||
|---|---|---|---|
|
#18+
RuslanGab, какая база медленная ? может просто построить индексы? оптимизировать запросы ? написать пару view и pl процедур ? И так ваше решение : Я правильно понял что у вас ключ в вашем кеше это дата_начала_идата_окончания диапазона ?! и если вы попали во внутрь то вам повезло вы вытащили под коллекцию из кеша ... Если вы не попали - и нет пересечений - у вас будет в кеше две коллекции дата_начала_идата_окончания диапазона1 дата_начала_идата_окончания диапазона2 если у вас есть пересечение слева/справа с одним из диапазонов Вы делаете под выборку в базу и расширяете границы диапазона ? сохраняя новый кеш дата_начала_идата_окончания диапазона_новый границы. Если я правильно описал алгоритм - то ,как мне кажется вам нужно просто предугадать диапазон дат ? какой объем данных и сложность запросов на отчет ? отчет не динамический ? ( данные это уже история и они не меняются ? так? - это Архив?) тогда , как вариант вы можете заранее создать in memory data grids - и поместить в него все ваши отчеты постранично ... по месяцам, годам , дням ... (вопрос в доступном количестве памяти на сервере итд) но это будет предпочтительнее что свой кеш на основе дат ?! к Вашему кешу нужно написать АПИ мониторинг , размера , актуальности данных, разрастания их в памяти итд .... вывести все это в веб или другой ГУИ итд ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 15:19 |
|
||
|
Вопрос по Spring @Cacheable
|
|||
|---|---|---|---|
|
#18+
Atum1может просто построить индексы? оптимизировать запросы ? С этого все начиналось. Первое сделано. Второе в "меру моих способностей" тоже. Atum1RuslanGab, И так ваше решение : Я правильно понял что у вас ключ в вашем кеше это дата_начала_идата_окончания диапазона ?! и если вы попали во внутрь то вам повезло вы вытащили под коллекцию из кеша ... Если вы не попали - и нет пересечений - у вас будет в кеше две коллекции дата_начала_идата_окончания диапазона1 дата_начала_идата_окончания диапазона2 Да все так. Atum1если у вас есть пересечение слева/справа с одним из диапазонов Вы делаете под выборку в базу и расширяете границы диапазона ? сохраняя новый кеш дата_начала_идата_окончания диапазона_новый границы. По сути дела почти так, но это как раз место которое мне не понравилось решительно, так что я доизвратился и ввел "пустой" кэш с ключом "маркер" (грубо говоря), а также локальный лист с моими сушностями. При запросах если кэш "маркер" не существует (прошло "время жизни", вытеснено) лист чистится. Этот лист "набивается" запросами (по логике там "пересечения" невозмижны, потому что "запрос" выполняется только когда кэша "маркер" нет и лист чистится, а в остальных случаях идут "подзапросы". Дальше идет перебор и выборка из этого листа. Единственное - в самих кэшированных данных уже образуются дубликаты, но их не должно быть много по логике работы приложения да и настройки EhCache позволяют общий объем сконфигурировать. Зато при повторных запросах имеющиеся в кэше данные соответственно вылетают сращу уже вообще без проверок и всего прочего. Atum1какой объем данных и сложность запросов на отчет ? отчет не динамический ? ( данные это уже история и они не меняются ? так? - это Архив?) тогда , как вариант вы можете заранее создать in memory data grids - и поместить в него все ваши отчеты постранично ... по месяцам, годам , дням ... (вопрос в доступном количестве памяти на сервере итд) но это будет предпочтительнее что свой кеш на основе дат ?! Объем не очень большой. 20-30 тыс. При этом имеется много связанных по внешним ключам таблиц (9 если не ошибаюсь), данные из которых тоже надо "вытягивать" (а две из них и дальше связаны, причем отношениями один ко многим, и тоже надо "тянуть"). Так что в итоге производительность этого места оставляет желать лучшего. C View я если честно ускорения не смог увидеть - где был запрос 10 секунд там оно так и осталось (может если бы речь шла о минутах оно и было бы заметно). Данные это уже история, и тем не менее они могут меняться (редактируемые). Однако это происходит очень редко и единично, так что в первом приближении можно их считать архивом. Про memory data grids простите мне мою неопытность никогда не слышал - сейчас вот открыл статью на Хабре - интересно. Возможно это именно то что нужно - поизучаю пожалуй. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 15:52 |
|
||
|
Вопрос по Spring @Cacheable
|
|||
|---|---|---|---|
|
#18+
RuslanGabПро memory data grids простите мне мою неопытность никогда не слышал если идти от БД или методов хранения, то: -изучить план запроса и узкое его место (индексы) - https://ru.wikipedia.org/wiki/Материализованное_представление - OLAP\OLTP ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 15:57 |
|
||
|
Вопрос по Spring @Cacheable
|
|||
|---|---|---|---|
|
#18+
А чем все же мое решение настолько плохо? Работает. Быстро. Я только за чтобы сделать лучше, но такой шквал критики:( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 16:08 |
|
||
|
Вопрос по Spring @Cacheable
|
|||
|---|---|---|---|
|
#18+
RuslanGabА чем все же мое решение настолько плохо? Работает. Быстро. Я только за чтобы сделать лучше, но такой шквал критики:( ну уж прямо шквал. Не преувеличивайте. Чем больше вариантов тем лучше. Удачи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 17:05 |
|
||
|
Вопрос по Spring @Cacheable
|
|||
|---|---|---|---|
|
#18+
Petro123RuslanGabПро memory data grids простите мне мою неопытность никогда не слышал если идти от БД или методов хранения, то: -изучить план запроса и узкое его место (индексы) - https://ru.wikipedia.org/wiki/Материализованное_представление - OLAP\OLTP +1 идти от БД изучить план запроса - у любой БД есть инструмент для таких действий (самый простой mysql explain самый красивый у mssql ) Использовать средства БД именно Материализованное_представление ! обычное view это просто ваш запрос завернутый в фантик , он так же будет выполняться по времени - просто результат будет выдаваться в презентационном виде. Почему критики - (мне решение нравится :) завидую что вам удалось так быстро разобраться с кешами , всеми этими ключами ,и аннотациями и написать свой кеш, не на каждой задаче возникает такая поребность, а тут реальное применение и хорошее решение) Только свой велосипед - он с одной стороны всегда ближе и понятнее и 100% работает ... а чужой - он используется не только у вас:) и это дает некоторые гарантии .... но в любом случае это опыт - написание своего кеша и опыт очень хороший . +1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 22:54 |
|
||
|
Вопрос по Spring @Cacheable
|
|||
|---|---|---|---|
|
#18+
Мне кажется тут недоисследованы базовые возможности самой БД в части mviews/OLAP. За создание кастомного ресольвера конечно респект но КМК в топике следует сравнить несколько разных решений. В противном случае у нас всех складывается впечатление о какой-то безальтернативности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2016, 09:07 |
|
||
|
Вопрос по Spring @Cacheable
|
|||
|---|---|---|---|
|
#18+
Боже мой, слава богу хоть здесь меня чему-то поучат! Это не сарказм. Обидно даже - на работе и спросить не у кого лишь бы работало а как и что... Сижу и тупею по ходу дела... Ладно это все лирика. За советы всем искренее спасибо. Буду изучать! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2016, 11:44 |
|
||
|
Вопрос по Spring @Cacheable
|
|||
|---|---|---|---|
|
#18+
RuslanGabБоже мой, слава богу хоть здесь меня чему-то поучат! Это не сарказм. Обидно даже - на работе и спросить не у кого лишь бы работало а как и что... Сижу и тупею по ходу дела... Ладно это все лирика. За советы всем искренее спасибо. Буду изучать! +1 задача решена = да +1 Быстро = да +1 Если есть время то можно и поковыряться в альтернативных решения = Да - а это расширение кругозора и возможностей :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2016, 12:33 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39272258&tid=2123882]: |
0ms |
get settings: |
11ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
65ms |
get topic data: |
13ms |
get forum data: |
4ms |
get page messages: |
75ms |
get tp. blocked users: |
1ms |
| others: | 239ms |
| total: | 434ms |

| 0 / 0 |
