Проблема кэширования для гуру кэширования.
Контекст
Мы использовали 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, который позволяет аннулировать широкие полосы, очень помогает. (Например, администратор хочет нажать кнопку и очистить все кешированные сообщения, скажем, для определенного форума)
Благодарность
будет