Как абстрагироваться от двух разных реализаций кеша

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

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


person ashitaka    schedule 12.12.2008    source источник


Ответы (3)


С макушки моей головы...

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

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

person Esko    schedule 12.12.2008

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

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

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

person krosenvold    schedule 12.12.2008

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

person Dov Wasserman    schedule 21.12.2008