首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HttpRuntime.Cache最佳实践

HttpRuntime.Cache最佳实践
EN

Stack Overflow用户
提问于 2009-04-16 03:32:15
回答 4查看 24.2K关注 0票数 20

在过去,我在访问HttpRuntime.Cache机制时设置了一个锁。我不确定我是否真的研究过这个问题,盲人用锁把它包围起来。

你认为这真的有必要吗?

EN

回答 4

Stack Overflow用户

发布于 2010-02-25 08:07:40

本文建议使用锁:

http://msdn.microsoft.com/en-us/magazine/cc500561.aspx

引用:

问题是,如果您有一个耗时30秒的查询,并且您每秒都在执行页面,则在填充缓存项所用的时间内,将有29个其他请求进入,所有这些请求都会尝试使用它们自己对数据库的查询来填充缓存项。要解决此问题,您可以添加一个线程锁,以阻止其他页面执行从数据库请求数据。

下面是他们的代码片段:

代码语言:javascript
复制
// check for cached results
object cachedResults = ctx.Cache["PersonList"];
ArrayList results = new ArrayList();

if  (cachedResults == null)
{
  // lock this section of the code
  // while we populate the list
  lock(lockObject)
  {
    cachedResults = ctx.Cache["PersonList"];
    // only populate if list was not populated by
    // another thread while this thread was waiting
    if (cachedResults == null)
    {
      cachedResults = ...
      ctx.Cache["PersonList"] = cachedResults;
    }
  }
}

我还没有测试过这段代码,但如果有人在生产环境中评估过这种方法,我会非常感兴趣。

票数 10
EN

Stack Overflow用户

发布于 2009-04-16 08:19:24

根据该文档,对缓存对象的http://msdn.microsoft.com/en-us/library/system.web.caching.cache(VS.80).aspx访问是线程安全的。至于你存储在缓存中的对象,线程的安全性必须来自其他地方。

票数 8
EN

Stack Overflow用户

发布于 2009-04-16 08:32:39

我认为没有必要用锁包装对HttpRuntime.Cache属性的访问,因为.Cache属性是静态的,也是线程安全的。

访问缓存对象有许多不同的方法(HttpRuntime.Cache、HttpContext.Current.Cache、Page.Cache等)。它们都访问相同的Cache对象,因为每个应用程序域只有一个Cache对象,因为它实际上是线程安全的Singleton对象。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/754661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档