F# 更新缓存列表

F# updating a cached list

目前我正在自学一些 F#,并在一个(愚蠢的)应用程序上工作,该应用程序读取和更新存储在数据库中的客户。每个客户都有一个属性 'customer type',存储在数据库中单独的table。由于客户类型列表实际上是不变的,我想缓存获取这些客户类型的数据库查询,例如

let getCustomerTypes = 
    let allTypes = SomeDbFunction |> Seq.map SomeMappingFunction
    Seq.cache allTypes

现在我偶然发现了一个问题,当我插入一个新的客户类型时(同样,这种情况每月发生一次),对 getCustomerTypes 的调用不反映新插入的客户类型。为了解决这个问题,我研究了记忆,例如http://blogs.msdn.com/b/dsyme/archive/2007/05/31/a-sample-of-the-memoization-pattern-in-f.aspx。但是,记忆的目的是 return 一个值,如果它以前已经计算过,但这不适合我的场景。

更新缓存的推荐功能/F# 方法是什么?

正如所写,getCustomerTypes 不是函数。它是一个只计算一次的值。要强制对每个引用重新计算,请将其设为函数:

let getCustomerTypes () = 
  let allTypes = SomeDbFunction |> Seq.map SomeMappingFunction
  Seq.cache allTypes

我不确定你所说的 "cache the database query" 是什么意思——在我看来你必须实际执行查询才能知道你是否有任何新客户,这似乎打败了缓存的目的。

[将评论提升为答案]

我会使用 MemoryCache 来避免重新创建缓存逐出规则,同时也是为了安全和安心。

如果您追求的是最简单的内存中键值缓存,那么 IDictionary<TKey,TValue> 显然是可用的选项。

另外,在使用字典时要注意竞争条件。 :)