F#更新缓存列表

时间:2015-05-05 20:23:27

标签: caching f#

目前我正在教自己一些F#并且正在研究(哑)应用程序,该应用程序读取和更新存储在数据库中的客户。每个客户都有一个属性'客户类型',它存储在数据库的单独表中。由于客户类型列表几乎是不变的,我想缓存获取这些客户类型的数据库查询,例如

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。但是,memoization的目的是返回一个值,如果它先前已经计算过,但这不适合我的场景。

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

2 个答案:

答案 0 :(得分:1)

[促进对答案的评论]

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

如果您使用的是最简单的内存中键值缓存,则IDictionary<TKey,TValue>是明显可用的选项。

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

答案 1 :(得分:0)

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

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

我不确定你的意思&#34;缓存数据库查询&#34; - 在我看来你必须实际执行查询才能知道你是否有新的客户,这似乎打败了缓存的目的。