セットアップ
かなり一般的なキャッシュパターンを実装しようとしています。これが私がしたいことです:
- レコードが最初に要求されると、その値がキャッシュされます。
- 後続のリクエストは、キャッシュされたレコードを返します。
- レコードが変更されると、キャッシュされたバージョンは無効としてマークされます。
- レコードに対する次のリクエストは、新しい値をキャッシュします。
問題
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)
ありがとう。