Шаблон кэширования: как вы называете (и чем заменяете) групповую парадигму OpenSymphony OsCache

Проблема кэширования для гуру кэширования.

Контекст

Мы использовали OpenSymphony OsCache в течение нескольких лет и подумываем о переходе на более качественный/сильный/быстрый/активно развиваемый продукт кэширования.

Проблема

Мы использовали функцию «групповой записи» OsCache и не нашли ее больше нигде.

Короче говоря, OsCache позволяет указать одну или несколько групп во время «вставки записи». Позже вы можете аннулировать «группу записей», не зная ключей для каждой записи.

Пример OsCache

Вот пример кода, использующего этот механизм:

Object[] groups = {"mammal", "Northern Hemisphere", "cloven-feet"}
myCache.put(myKey, myValue , groups );
// later you can flush all 'mammal' entries 
myCache.flushGroup("mammal")
// or flush all 'cloven-foot'
myCache.flushGroup("cloven-foot")

Альтернатива: механизм сопоставления

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

В этом подходе вы должны определить свой класс «ключ» и «сопоставитель» следующим образом:

public class AnimalKey 
{
   String fRegion;
   String fPhylum;
   String fFootType;

   ..getters and setters go here

}

Сопоставитель:

public class RegionMatcher implements ICacheKeyMatcher
{
   String fRegion;

   public RegionMatcher(String pRegion)
   {
    fRegion=pRegion;
   }

   public boolean isMatch(Obect pKey)
   {
      boolean bMatch=false;
      if (pKey instanceof AnimalKey)
      {
         AnimalKey key = (AninmalKey) pKey);
         bMatch=(fRegion.equals(key.getRegion());
      }
   }
}

Использование:

myCache.put(new AnimalKey("North America","mammal", "chews-the-cud");
//remove all entries for 'north america'
IKeyMatcher myMatcher= new AnimalKeyMatcher("North America");
myCache.removeMatching(myMatcher);

Этот механизм имеет простую реализацию, но имеет недостаток производительности: он должен перебирать каждую запись, чтобы сделать группу недействительной. (Хотя это все же быстрее, чем прокрутка базы данных).

Вопрос

  • (Внимание! это может показаться глупым). Как вы называете эту функцию? OsCache называет это «группами кеша». Ни JbossCache, ни EhCache, похоже, не определяют и не реализуют его. Область? Область? Царство?
  • Существуют ли стандартные шаблоны для этой парадигмы «кэш-группы/регион»?
  • Как восходящие продукты кэширования (например, ehcache, coherence, jbosscache) справляются с этой проблемой
  • Этой парадигмы нет в спецификации jcache, верно? (JSR-107)
  • Как вы справляетесь с «массовым аннулированием»? Кэши хороши, пока они не устареют. API, который позволяет аннулировать широкие полосы, очень помогает. (Например, администратор хочет нажать кнопку и очистить все кешированные сообщения, скажем, для определенного форума)

Благодарность

будет


person user331465    schedule 28.07.2010    source источник


Ответы (1)


Я также реализовал подход сопоставления при попытке масштабировать устаревшую систему с помощью специального процесса аннулирования. Природа O(n) не была проблемой, поскольку кеши были небольшими, аннулирование выполнялось в потоке, не обращенном к пользователю, и он не удерживал блокировки, поэтому не было штрафа за конкуренцию. Это было необходимо для сопоставления с ключами, пересекающими кэши, например, для признания недействительными всех данных компании в кэшах, разбросанных по всему приложению. На самом деле проблема заключалась в отсутствии центров проектирования, поэтому приложение было монолитным и плохо декомпозированным.

Когда мы переписали его на основе доменных служб, я выбрал другую стратегию. Теперь у нас был домен для конкретных данных, централизованный в определенных кэшах, например, для конфигураций, поэтому возникла потребность в множественном поиске. В этом случае мы поняли, что ключ был просто подмножеством значения, поэтому мы могли извлечь все ключи после загрузки из метаданных (например, аннотаций). Это позволило реализовать точную группировку и удобную модель программирования с помощью нашей абстракции кэша. Я опубликовал основную структуру данных, IndexMap, в руководстве по этой идее. Он не предназначен для прямого использования вне абстракции, но лучше решает проблему группировки, с которой мы столкнулись.

http://code.google.com/p/concurrentlinkedhashmap/wiki/IndexableCache

person Ben Manes    schedule 29.07.2010