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

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

контекст

Мы использовали 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")

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

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

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

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

   ..getters and setters go here

}

Matcher:

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 ответ

Решение

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

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

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

Другие вопросы по тегам