asp.net - ASP.NET HttpModules 中的线程安全缓存

标签 asp.net multithreading caching thread-safety httpmodule

这是场景

我有一个 ASP.NET 4.0 应用程序,它有很多旧版 URL 重写。我想构建一个 HTTP 模块,该模块将查看这些重写的数据库,并在需要时进行 301 重定向。这张表有几万条记录。

所以很明显我需要做某种缓存,所以我不会访问数据库并搜索每个页面请求的所有这些记录。

我们的要求之一是在我们的应用程序由于某种原因(工作进程回收或您有什么)回收时具有快速启动时间。所以我不想在应用程序启动时加载整个表。该应用程序的启动速度已经非常缓慢。

我的绝妙/荒谬的想法是,

  • 在应用程序启动时,在我的 HttpModule 中创建一个空字典来保存重写。
  • 启动后台工作线程。应用程序继续启动。
  • 后台工作线程用说,哦,最常用的 1000 次重写来更新字典。

  • 问题

    我的问题是:
  • 这很荒谬吗?
  • 有没有这样的事情
    一个线程安全的字典?这
    后台线程可能正在更新
    新请求时的字典
    来了。
  • 将所有的锁定
    以线程安全的方式进行
    收集减慢传入请求?

  • 谢谢!!

    最佳答案

    如果您的目标是 .NET 4.0,您可以使用 ConcurrentDictionary 它会在并发方面为您处理所有的魔法。只需使用 GetOrAdd对于传入的请求和 AddOrUpdate为您的背景人口想法。

    我也想提出一些让你思考的问题。如果您有这数千个 URL,您真的只在一台服务器上运行吗?我问这个是因为您在这里只谈论本地缓存方案。如果您有三台服务器,所有这些服务器都将在数据库中获取 URL 数据。您是否正在研究像 Windows Server AppFabric 或 Memcached 这样的分布式缓存技术?

    关于asp.net - ASP.NET HttpModules 中的线程安全缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6380804/

    相关文章:

    c# - 关于 ResetEvents 和 Threading,此 tcp 监听器代码是否正确实现?

    java - android中Message和String之间的转换?

    c# - 在 Entity Framework 4.0 中缓存 POCO 对象

    caching - 如何禁用 Laravel View 缓存?

    c++ - 线程之间通过共享 vector 进行通信

    asp.net-mvc - 防止用户在 asp.net mvc 注销后返回

    asp.net - 将 SQL CE 4 部署到 IIS 7 - 需要特殊权限吗?

    c# - 验证内容页中内容控件的 ContentPlaceHolderID 属性

    jquery - ASP.NET AJAX PageMethods 调用加载 .NET 4.5 IIS 7.5 的整个页面

    javascript - 如何使用 asp.net 禁用 Firefox 默认 PDF 查看器/插件?