аннулирование кэша объекта команды - PullRequest
2 голосов
/ 29 октября 2010

У меня есть приложение, которое реализует шаблон объекта команды для получения данных с сервера. Теперь я хотел бы реализовать кэш на стороне клиента, и мне нужно несколько советов о том, как бороться с аннулированием кэша eviction .

Проблема

Чтобы получить объект, я передаю команду GetObject (id) и получаю GetObjectResponse с результатами для этого идентификатора. У меня есть кеш, который может хорошо кэшировать ответ для GetObject (id).

Однако, когда я вижу такую ​​команду, как DeleteObject (id) или UpdateObject (id), кэшированный ответ для GetObject (id) должен быть признан недействительным.

Я должен сказать, что реальность не обязательно такая простая, как с одним параметром id. Некоторые объекты ответа зависят от нескольких параметров в объекте команды. Кроме того, передача одного объекта команды может сделать недействительным более одного объекта ответа.

Есть мысли о том, как этого добиться? Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 30 октября 2010

Насколько я понимаю, ваш клиент должен иметь локальный кеш состояния сервера.Когда состояние сервера изменяется, ваш клиент должен быть уведомлен и обновлен.Я предлагаю начать с крайнего случая аннулирования всего кэша, а затем поработать над меньшими и более тонкими способами обновления кэша без отправки всего состояния сервера.Идея создания более точных обновлений состояла бы в том, чтобы «пометить» каждое изменение состояния сервера, чтобы клиент мог отправить свой последний тег, а затем сервер мог бы рассчитать лучший способ обновления клиента на основе его текущего тега (всего обновления или простополя).

0 голосов
/ 10 ноября 2010

В итоге я написал класс CacheInvalidationGenerator с помощью этого метода:

public ArrayList<Action> getInvalidForAction(Action action) {
  ArrayList<Action> result = new ArrayList<Action>();
  if (action.getClass()==UpdateObject.class) {
    UpdateObject a = (UpdateObject) action;
    result.add(new GetObject(a.getObjectId()));
  }
  return result;
}

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

0 голосов
/ 29 октября 2010

Во-первых, проблема называется кеш аннулирование , а не выселение.(Я вижу, вы используете оба термина.) Удаление кеша означает удаление элементов из кеша, когда кеш заполнен.Это совершенно другая тема.

Во-вторых, я не вижу связи между шаблоном команды и кешем.В любом случае, давайте сосредоточимся на кеше.

При аннулировании элемента вы должны найти его в кеше.Это работает так же, как и для извлечения элемента: путем поиска значения с использованием кеша key .Таким ключом может быть упомянутый вами идентификатор или другой уникальный набор значений.Как выглядит этот идентификатор или кортеж, зависит от вашего домена (то, как вы используете шаблон команды).

Что касается вашей последней проблемы, должно быть правило, которое сообщает вам, какие элементы должны быть аннулированы, когдаопределенный другой элемент признан недействительным.Это зависит от логики вашего командного шаблона.Из вашего описания я не могу сказать, как именно выглядело бы такое правило.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...