通过AppPool Recycles保留静态数据

时间:2011-06-07 04:21:29

标签: iis-7 windows-server-2008 application-pool

我创建了一个ASP .Net MVC 3应用程序,允许用户根据文件名搜索各种媒体文件。有大量的这些文件,所以我创建了一个倒置的索引,我存储在内存中。具体来说,我将其描述为

Dictionary<string,List<string>>. 

嗯,必须首先创建此索引才能进行搜索,因此我创建了一个构建它的方法。它工作正常,一切都很好,但自然每次AppPool刷新时,我的索引都会丢失。我已经尝试关闭AppPool回收,但我认为这是一个坏主意(并且它似乎无论如何回收)。

我基本上不确定我的下一步应该是什么。有没有办法检测AppPool何时刷新并重建我的索引?或者完全禁用应用程序池回收是否安全?

干杯, -Josh

3 个答案:

答案 0 :(得分:3)

我认为迈克的回答很接近,但并不完美。问题是应用程序启动事件仅在服务器本身启动时触发一次;每次应用程序池被回收时它都不会触发。我试图做这个确切的事情,在池回收之前将一些数据序列化到磁盘并在之后将其读回(在leiu中将其存储在数据库中。)我发现应用程序启动事件在池再循环之后从未触发过所以我的数据永远不会被读回来。我找不到一个在应用程序池循环后触发的事件,所以我被迫在该对象的构造函数内部读取该数据。它可以工作,但是将数据留在磁盘上的时间比我感觉舒服的时间长。

在我看来,这不是一个理想的解决方案(即使你像我一样对数据进行加密),但是工作正是如此。希望这可以帮助其他人寻找类似的解决方案,或者有人可能偶然发现并指出在应用程序池回收后实际发生的事件。我当然有兴趣了解那个。

答案 1 :(得分:2)

假设索引可用,我原以为你可以在Application_disposed上序列化索引,然后在全局asax的application_start事件中对其进行反序列化?

答案 2 :(得分:0)

如果您需要持久性键/值存储,我建议使用Redis之类的东西。我在极高容量环境中使用该产品取得了很大成功(一小时内超过5亿次交易)。