1

セットアップ

かなり一般的なキャッシュパターンを実装しようとしています。これが私がしたいことです:

  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)

ありがとう。

4

1 に答える 1

1

確かCache.makeに、より詳細な制御が必要な場合、つまりこの場合は結果を無効にする場合の方法です。どんな問題がありましたか?

関数上にキャッシュを作成することから始める必要があります_get_name。そのためにあなたは模倣することができますCache.simple

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

get_name次に、 use get_name.getget_nameはキャッシュ)の代わりに、create_user関数get_name.invalidate(0)でキャッシュされた結果を無効にするために使用します。

それは役に立ちますか?

于 2011-10-24T07:03:22.240 に答える