2008-12-12 13 views
0

Я планирую использовать распределенный кеш в моем балансированном нагрузке webapp. Итак, я попытаюсь абстрагироваться от общих функций между apache ehcache и memcached.Как абстрагироваться от двух различных реализаций кеша

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

ответ

1

Из верхней части моей головы ...

  • Создание интерфейса с общими методами кэширования, связанных (добавить(), удалить(), обновление() приходит на ум, как наиболее очевидный из них).
  • Создайте реализации этого интерфейса, в которых используется нужный кеш («MyEhCacheImplementation» и «MyMemCachedImplementation» или что-то в этом роде).
  • Создайте CacheFactory, который возвращает некоторый тип кеша на основе простого значения, такого как Number, String или enum. Не забудьте сделать резервную копию для реализации по умолчанию!
  • Создайте способ инициализации этого единственного значения для фабрики при инициализации, например, если у вас есть класс, который читает различные параметры во время запуска или использует Spring applicationContext.xml или что-то подобное, вам нужно создать метод инициализации для вашего кеша, который принимает один параметр, вызывает фабрику и возвращает правильный тип кеша и/или устанавливает его в какое-то место, откуда вы его используете.

Я считаю, что это все, что вам нужно структурно, чтобы заставить его работать надежно и чтобы вы могли продлить его, когда захотите.

1

После исправления интерфейса это действительно проблема с созданием шаблонов. Dependency Injection - мой любимый, если стратегия выбора кеша динамична, вы можете использовать фабрики весеннего боба для решения во время выполнения. Spring имеет поддержку областей «сеанса» в веб-приложениях, что означает, что вы можете разрешить фабрике решать за сеанс, если хотите.

В противном случае простой сервис-локатор должен также выполнить трюк.

http://en.wikipedia.org/wiki/Service_locator_pattern

1

У Spring также есть модуль провайдера кеша, который делает именно то, что вы хотите сделать. Я просто не уверен, что memcached поддерживается. Даже если это не так, написание адаптера для него может быть меньше работы, чем перенос собственного интерфейса. См. https://springmodules.dev.java.net/docs/reference/0.8/html_single/#cache