Opa:如何手动使缓存值失效

发布于 2024-12-11 06:32:41 字数 1086 浏览 1 评论 0原文

设置

我试图实现一个相当常见的缓存模式。这就是我想要发生的事情:

  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)

谢谢。

The Setup

I'm trying to implement a fairly common caching pattern. Here's what I want to happen:

  1. The first time a record is requested, its value is cached.
  2. Subsequent requests return the cached record.
  3. When a record is changed, the cached version is marked invalid.
  4. The next request for the record caches a new value.

The Problem

Cache.simple() caches values as expected, but I don't seem to have a tool for invalidating a cached value. Cache.make() seems to be the tool intended for this job, but I've failed to successfully employ it.

The Source

This is a complete example (that builds and runs). I want to invalidate the cached record at the end of set_name (after storing a new value). If the cached record is successfully invalidated, a name submitted from the text input should be displayed when the page has refreshed.

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)

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

从来不烧饼 2024-12-18 06:32:41

事实上,如果您想要更多控制,即在这种情况下使结果无效,则 Cache.make 是可行的方法。你遇到了什么问题?

您需要首先通过 _get_name 函数创建缓存。为此,您可以模仿Cache.simple

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

然后使用get_name.get而不是get_nameget_name是缓存)并在 create_user 函数中使用 get_name.invalidate(0) 使缓存结果无效。

这有帮助吗?

Indeed Cache.make is the way to go if you want more control, i.e. in this case invalidate the results. What problem did you have?

You need to start with creating a cache over your _get_name function. For that you can mimic Cache.simple:

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

then instead of get_name use get_name.get (get_name is the cache) and in your create_user function use get_name.invalidate(0) to invalidate the cached result.

Does that help?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文