我有一个从 csv 文件中读取重定向规则的 httpmodule。
但是,由于它是一个 httpmodule 并且它会检查每个请求,我显然不想每次都读取该文件。
有哪些策略可以缓存规则(在数组中),这样我就不必在每次请求时都读取文件?
更新:使用 .NET 2.0
我有一个从 csv 文件中读取重定向规则的 httpmodule。
但是,由于它是一个 httpmodule 并且它会检查每个请求,我显然不想每次都读取该文件。
有哪些策略可以缓存规则(在数组中),这样我就不必在每次请求时都读取文件?
更新:使用 .NET 2.0
在缓存未命中时,您将读取您的值并将它们转换为某些对象类型的列表并缓存它们。好处:
HttpModule
附加说明
还应注意操作系统也会缓存文件。因此,如果您经常使用某些文件,如果在相对较短的时间内完成后续读取,则访问速度会更快。相对的,因为这取决于服务器负载、内存使用等。就在我的脑海中。但它仍然比所描述的缓存慢得多。
假设所有用户都将以相同的方式重定向,应用程序存储是放置此内容的合适位置。会话存储使用当前用户的上下文存储信息,并且只为该用户共享。应用程序存储功能保留信息,以便可以在所有用户和来宾之间全局共享。
如果此信息非常大(>60mb+ 或 1000s+ 个对象),您可能需要考虑一个严肃的企业级缓存组件(类似于 JCS/EhCache [但用于 .net])
我们通过将规则(或类似规则)存储在应用程序状态中来做到这一点。
我们在 Session_Start 中加载值(通过测试确保我们只执行一次) - 我在 Application_Start 中有一条评论指出:“移动到会话启动,因为它似乎工作得更好”
像这样的东西:
Application.Lock();
// Only load the rules if we haven't already
if (Application["RulesCache"] == null)
{
List<Rule> rules = LoadRules();
Application["RulesCache"] == rules;
}
Application.Unlock();
我们实际上比这更复杂一点——但基本前提是有效的。
务实地说,您希望将负载封装到一个单独的例程中,并可能提供一种机制来更新缓存而无需重新启动应用程序
有两种方法。创建一个数组变量并将其设置为静态。
public class RulesTable
{
private static readonly RuleCollection _rules;
public RuleCollection Rules { get; }
}
在这种情况下,您必须创建一个类似的类RuleCollection
并使其成为线程安全的。
或者您可以使用简单的Cache
.
System.Web.HttpContext.Current.Cache.Insert("Rules", RulesArray, new System.Web.Caching.CacheDependency("CSV Filename"));
字典怎么样?你可以使用 dict[rule] 来获取你想要的。还是比这更复杂?将 csv 转换为 XML 并使用 XQueryXPath 搜索?