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>
显然是可用的选项。
另外,在使用字典时要注意竞争条件。 :)
目前我正在自学一些 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>
显然是可用的选项。
另外,在使用字典时要注意竞争条件。 :)