内存缓存还是并发字典?

Abh*_*jar 29 .net wcf caching

我希望在WCF服务的请求级别实现缓存.对此服务的每个请求都执行大量数据库调用.想想多个数据收集器.我们需要允许一个数据收集器访问先前数据收集器已经检索的信息.

我希望通过为每个请求创建一个特定的实例来使用新的.Net 4.0内存缓存.

这是一个好主意吗 ?或者我应该只使用Dictionary对象?

顺便说一句:数据收集将是并行的,因此锁定会有更多复杂性,但我也可以使用并发集合.

Yiğ*_*ner 40

如果您不需要某种过期逻辑,我建议使用并发集合.您可以轻松实现单个条目缓存机制组合ConcurrentDictionaryLazy类.这是关于Lazy和ConcurrentDictionary组合的另一个链接.

如果您需要项目过期,那么最好使用内置的MemoryCache并实现双重检查锁定模式以保证单个检索缓存项.可以在锁定模式中找到准备好的双重检查锁定实现,以正确使用.NET MemoryCache

  • 顺便说一下,如果在服务启动之前很好地定义了缓存项(即没有动态缓存),并且可以将缓存中的所有数据加载一次,则可以使用服务类的静态构造函数来加载这些缓存项.这是更好的,因为保证静态构造函数每个应用程序域执行一次,并且在执行该类型的任何实例构造函数之前.很简单. (5认同)
  • @zync 将 ConcurrentDictionary 与 Lazy 结合使用的想法是确保您为每个应用程序域检索一次缓存项,并且永远不会更改它们。如果不是这种情况,MemoryCache 更好。但是,如果您需要单条目检索逻辑,则使用 ConcurrentDictionary 更合适,因为 MemoryCache.AddOrGetExisting 方法需要一个值,并且您在检索此值时仍必须实现锁定。但是将 ConcurrentDictionary.GetOrAdd(TKey key, Func<TKey, TValue> valueFactory) 与 Lazy 结合使用,您可以将所有锁定内容留给框架库。 (4认同)
  • @YiğitYener 当然,除非您只能通过“async” API 获取数据(尽管您可以拥有“ConcurrentDictionary<TKey,Task<TValue>>”或什至“ConcurrentDictionary<TKey,Lazy<Task<TValue>>>” )。 (2认同)