【发布时间】:2012-12-06 05:26:58
【问题描述】:
我正在制作一个很酷的 (imo) T4 模板,这将使缓存变得更加容易。我在制作这个模板时的一个选项是允许“加载一次”类型的功能,尽管我不确定它有多安全。
基本上,我想做这样你就可以做这样的事情:
var post=MyCache.PostsCache.GetOrLockLoad(id, ()=>LoadPost(id));
并且基本上做到了,当必须加载缓存时,它将在PostsCache 上放置一个阻塞锁。这样,其他线程将阻塞,直到 LoadPost() 函数完成。这使得 LoadPost 只会在每次缓存未命中时执行一次。执行此操作的传统方式是 LoadPost 将在缓存为空的任何时候执行,如果在第一次加载缓存之前对它的多个请求可能会执行多次。
这是一个合理的做法,还是因为这种危险或浪费的事情而阻塞其他线程?我在想线程锁定开销大于大多数操作,但也许不是?
有没有人看到过这种事情,这是个好主意还是很危险?
此外,虽然它被设计为在任何缓存和应用程序类型上运行,但它最初的目标是 ASP.Net 的内置缓存机制。
【问题讨论】:
-
Yes 是众所周知的模式,例如由 .NET Lazy 类支持(尽管这本身不是缓存)。当您的示例中的 .LoadPost 会消耗大量资源/根据时间/变异数据返回不同的结果时,这很有用。但是,对于其他情况,我倾向于避免使用它来提高吞吐量。
-
@FuleSnabel 很有趣。这实际上是我第一次看到 Lazy
的东西。
标签: c# asp.net caching concurrency t4