Шаблон кэширования: что вы называете (и как вы заменяете) парадигма OpenSymphony OsCache "группа" - PullRequest
3 голосов
/ 29 июля 2010

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

Context

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

Задача

Мы использовали функцию 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")

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

Мы используем другой самодельный кэш, написанный бывшим членом команды, который использует шаблон 'key matcher' для аннулирования записей

При таком подходе вы определяете свой класс 'key' and matcher 'следующим образом:

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, похоже, не определяют и не реализуют его. Realm? Область, край? Великобритания
  • Существуют ли стандартные шаблоны для этой парадигмы "группы кеша / регион"?
  • Как продукты кэширования восходящей звезды (например, ehcache, coherence, jbosscache) решают эту проблему
  • Эта парадигма не входит в спецификацию jcache, верно? (JSR-107)
  • Как вы справляетесь с "массовым аннулированием"? Кэши велики, пока они не устареют. API, который позволяет вам делать недействительными широкие полосы, является большой помощью. (Например, администратор хочет нажать кнопку и очистить все записи в кэше сообщений, скажем, для определенного форума)

спасибо

будет

1 Ответ

2 голосов
/ 29 июля 2010

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

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

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

...