1

我有一个从 csv 文件中读取重定向规则的 httpmodule。

但是,由于它是一个 httpmodule 并且它会检查每个请求,我显然不想每次都读取该文件。

有哪些策略可以缓存规则(在数组中),这样我就不必在每次请求时都读取文件?

更新:使用 .NET 2.0

4

5 回答 5

3

使用具有文件依赖性的缓存

在缓存未命中时,您将读取您的值并将它们转换为某些对象类型的列表并缓存它们。好处:

  • 所有用户的统一存储,因为他们所有这些值,因为你正在使用HttpModule
  • 自动内存利用率管理- 缓存速度很快,当服务器内存不足时可能会被丢弃
  • 当您更改文件时,文件依赖缓存非常有用,并且您的缓存将自动失效并在新更改文件的第一个请求中重新读取,因此您不必重新启动应用程序或执行其他一些技巧来刷新缓存值
  • 快速数据读取- 如果您还在文件读取时转换 CSV 数据,您将获得大量时间,因为您只会解析一次,因此所有后续数据读取将比仅存储 CSV 原始数据并解析每次读取的数据所花费的时间要少得多

附加说明
还应注意操作系统也会缓存文件。因此,如果您经常使用某些文件,如果在相对较短的时间内完成后续读取,则访问速度会更快。相对的,因为这取决于服务器负载、内存使用等。就在我的脑海中。但它仍然比所描述的缓存慢得多。

于 2009-11-05T10:03:16.287 回答
0

假设所有用户都将以相同的方式重定向,应用程序存储是放置此内容的合适位置。会话存储使用当前用户的上下文存储信息,并且只为该用户共享。应用程序存储功能保留信息,以便可以在所有用户和来宾之间全局共享。

如果此信息非常大(>60mb+ 或 1000s+ 个对象),您可能需要考虑一个严肃的企业级缓存组件(类似于 JCS/EhCache [但用于 .net])

于 2009-11-05T09:30:11.900 回答
0

我们通过将规则(或类似规则)存储在应用程序状态中来做到这一点。

我们在 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();

我们实际上比这更复杂一点——但基本前提是有效的。

务实地说,您希望将负载封装到一个单独的例程中,并可能提供一种机制来更新缓存而无需重新启动应用程序

于 2009-11-05T09:34:36.663 回答
0

有两种方法。创建一个数组变量并将其设置为静态。

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"));
于 2009-11-05T10:16:08.973 回答
-2

字典怎么样?你可以使用 dict[rule] 来获取你想要的。还是比这更复杂?将 csv 转换为 XML 并使用 XQueryXPath 搜索?

于 2009-11-05T09:15:20.523 回答