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

时间:2011-10-23 23:40:59

标签: opa

设置

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

  1. 第一次请求记录时,会缓存其值。
  2. 后续请求返回缓存记录。
  3. 更改记录时,缓存的版本标记为无效。
  4. 下一个记录请求会缓存一个新值。
  5. 问题

    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 个答案:

答案 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.getget_name是缓存),并在create_user函数中使用get_name.invalidate(0)使缓存的结果无效。

这有帮助吗?