Опа: как вручную аннулировать кэшированное значение - PullRequest
1 голос
/ 24 октября 2011

Настройка

Я пытаюсь реализовать довольно распространенный шаблон кэширования.Вот что я хочу сделать:

  1. При первом запросе записи ее значение кэшируется.
  2. Последующие запросы возвращают кэшированную запись.
  3. Когдазапись изменена, кэшированная версия помечена как недействительная.
  4. Следующий запрос к записи кэширует новое значение.

Проблема

Cache.simple() кэширует значениякак и ожидалось, но у меня, похоже, нет инструмента для аннулирования кэшированного значения.Cache.make() кажется инструментом, предназначенным для этой работы, но я не смог его успешно использовать.

Источник

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

type User.t = 
  { id : int 
  ; name : string
  }

db /user: intmap(User.t)

create_user() =
  match ?/user[0] with
  | {none} -> /user[0] <- {id=0 name="tom"}
  | _ -> void

set_name(new_name: string) =
  /user[0]/name <- new_name
  // After setting a new name, invalidate the cached result.

_get_name(uid:int) : string =
  /user[uid]/name
get_name = Cache.simple(_get_name)

page() =
  do create_user()
  <>User's name is "{get_name(0)}"</>

  <form onsubmit={_ -> set_name(Dom.get_value(#name_input))}>
    <input type="text" id=#name_input />
  </form>

server = one_page_server("User", page)

Спасибо.

1 Ответ

1 голос
/ 24 октября 2011

Действительно, Cache.make - это путь, если вы хотите больше контроля, т.е. в этом случае аннулируйте результаты.Какая проблема у вас была?

Вам нужно начать с создания кэша поверх вашей функции _get_name.Для этого вы можете имитировать Cache.simple:

get_name = Cache.make(Cache.Negotiator.always_necessary(_get_name), Cache.default_options)

, а затем вместо get_name использовать get_name.get (get_name - кэш), а в функции create_user использовать get_name.invalidate(0) для аннулированиякэшированный результат.

Помогает ли это?

...