2013-04-11 4 views
2

Я ищу, чтобы уменьшить давление на «службу поиска», которая обращается к базе данных каждый раз, помещая слой кэширования между поставщиком услуг и клиентом службы. Я хочу, чтобы этот уровень кеширования был постоянным и вмещал больше объектов, чем позволял RAM, поэтому ванильный Guava Cache не будет делать. Я изучал такие вещи, как EhCache и CouchBase, но решил повернуть по-разному.Можно ли использовать Guava Cache в качестве «помощника» для моего собственного постоянного кеша?

Это очень простой способ написать наивный код для этого постоянного слоя кеширования. Тем не менее, я знаю достаточно о кешировании, чтобы понять, что есть много проблем параллелизма для обработки, и я уверен, что я не получу их всех в первый раз. Например, существует проблема «громового стада», когда промахи в кеше могут вызвать много одновременных запросов к службе поддержки для одного и того же объекта. Мне показалось, что это именно тот тип, который уже обрабатывает LoadingCache. Кажется ли разумной идеей попытаться заставить Guava делать тяжелые вещи, связанные с параллелизмом, и просто подключить мой собственный подкласс (ы) для фактического поиска и хранения объектов? Я не уверен, где будут указаны точные границы с точки зрения того, что я буду подклассифицировать или переопределить, но я могу понять это, если это не просто полностью ошибочная идея. Я не видел примеров расширения/настройки кэширования Guava, поэтому, если есть какие-то примеры и/или документы, на которые я смотрю, меня бы это интересовали.

+0

Мне действительно интересно, что бы мотивировало того, чтобы тратить время на реализацию своего собственного кеша с использованием существующего, существует так много проверенных на практике решений. – vptheron

+1

«Я не уверен, где будут указаны точные границы с точки зрения того, что я буду подклассифицировать или переопределить»: границы заключаются в том, что вы не можете подклассифицировать что-либо, кроме основного «CacheLoader». –

+1

@vtheron Я признаю вашу точку вообще и, вероятно, и в этом конкретном случае. Однако ни одно из решений, на которые я смотрел, не было идеальным, поэтому я начал изучать другие возможности. Кроме того: кодирование - забава; установка и настройка всепоглощающего, все-танцевального продукта, который решает мою проблему не так :) – jfrank

ответ

2

То, что я закончил, было очень простым. Я делаю обычный LoadCache и выполняю некоторые дополнительные операции в методах загрузки и перезагрузки. Это дало мне крючки (то есть методы загрузки и перезагрузки CacheLoader), чтобы посмотреть в моей локальной базе данных для объекта и вызвать удаленную службу, если я ее не найду и не сохраняю, не беспокоясь о том, что многие потоки будут пытаться получить тот же объект из-за всех средств защиты параллелизма, которые предоставляет Guava.

Я уверен, что это далеко не так, как предполагается использовать кеш, поскольку я фактически устанавливаю максимальный размер в моем кеше равным 0, так что моя функция загрузки всегда вызывается. (По разным причинам я хочу каждый раз обслуживать объекты из постоянного хранилища, а не из ОЗУ). Я не тестировал его полностью, но, похоже, он ведет себя так, как я хочу. Общий эффект - это сквозное «зеркало объекта», действующее как самообновляющаяся копия восходящей службы.

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