在IIS Web服务器上的所有工作进程中刷新HttpRuntime.Cache对象

时间:2013-04-11 22:40:30

标签: c# asp.net iis-7

我在web-garden模式下运行IIS 7设置的asp.net Web应用程序。我想使用单步清除所有工作进程中的运行时缓存项。我可以设置数据库键值,但这意味着在每个工作进程上执行的线程,在我的每个负载均衡方案Web服务器上将轮询该键值和刷新缓存的更改。这将是一个非常糟糕的机制,因为我每天最多刷新一次缓存项目。此外,我无法使用带有Service Broker通知的SqlCacheDependency实现推送通知,因为我有一个MySql数据库。有什么想法吗?有没有肮脏的解决方法?一种可能的解决方法,公开aspx页面,并使用托管站点的ip和端口多次点击该页面而不是域名 - 例如http://ip.ip.ip.ip:82/CacheClear.aspx,以便可以发送对该页面的请求对于该Web服务器中的所有工作进程,并在Page_Load上清除缓存项。但这是一个非常脏的黑客攻击,并且在所有请求都发送到同一个工作进程的情况下可能无效。

1 个答案:

答案 0 :(得分:3)

您需要设置进程间通信。 对于缓存,有两种常用的方法:

  • 设置共享缓存(memcached等)。
  • 设置一个消息队列(例如ms-mqueue或rabbitMq)并使用它将状态传播到本地缓存。

共享缓存是最终的解决方案,因为它意味着整个缓存是分布式的,但它也是最复杂的:它需要设置,以便缓存负载在节点之间正确分布,并确保它不会成为瓶颈。

第二个选项需要更多代码,但如果您不想共享缓存内容(如您的情况那样),则会更容易。 最简单的方法是设置一个侦听器线程或任务来处理缓存清除或单个条目失效消息。如果没有消息,则此线程将处于休眠状态,因此对性能的影响很小。 您还可以通过处理消息作为常用iis请求管道的一部分来放弃侦听器线程。即设置一个过滤器/模块,检查队列中的消息并在处理请求之前处理它们;但表现明智的第一个选择是(稍微)更好。