我正在尝试实现一个相当常见的缓存模式。这就是我想要发生的事情:
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)
感谢。
答案 0 :(得分:1)
如果您想要更多控制,确实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)
使缓存的结果无效。
这有帮助吗?