目前我正在使用ASP.net上的C#3.5开发项目管理应用程序。为了减少对数据库的命中,我使用静态变量缓存了大量信息。例如,用户列表在静态类中保存在内存中。该类在启动时从数据库中读取所有信息,并在更改时更新数据库,但它永远不需要从数据库中读取。

该类在写入数据库的同时ping更新信息的其他Web服务器(如果存在)。 pinging机制是一个Windows服务,缓存对象使用随机可用端口进行注册。它也用于其他事情。

数据量并不是那么好。目前我正在使用它来缓存用户(密码哈希,权限,名称,电子邮件等)。它只是保存了一堆对数据库的调用。

我想知道这种方法是否存在任何陷阱和/或是否有更好的方法来缓存数据?

有帮助吗?

解决方案

陷阱:静态字段的范围是每个应用程序域,增加的负载将使服务器在池中生成更多应用程序域。如果您只读取静态数据,这不一定是个问题,但是您将在内存中获得重复数据,并且每次创建或回收应用程序域时都会受到影响。

最好使用Cache对象 - 它适用于这样的事情。

编辑:原来我对AppDomains的错误(正如评论中所指出的) - Application 的更多实例将在加载时生成,但它们都将在同一个AppDomain中运行。 (但你仍然应该使用Cache对象!)

其他提示

只要您可以预期缓存永远不会增长到大于可用内存量的大小,那就没关系。此外,请确保每个数据库只有一个此应用程序的实例,或者应用程序的不同实例中的缓存可能“不同步”。

在我工作的地方,我们有一个本土的O / RM,我们会做一些类似于你正在做的某些表格,这些表格预计不会增长或变化很大。所以,你所做的并不是前所未有的,事实上在我们的系统中,它是经过验证的。

您必须考虑的另一个陷阱是线程安全。您的所有应用程序请求都在同一AppDomain中运行,但可能出现在不同的线程上。访问静态变量必须考虑从多个线程访问它。可能比您正在寻找更多的开销。缓存对象更适合此目的。

嗯...“经典”方法将是应用程序缓存,但如果您从未更新静态变量,或者了解锁定问题,并且您了解它们可以随时通过appdomain重新启动而消失,那么我并不认为使用静态的。

我建议您研究为您的应用分配缓存的方法。您可以查看 NCache indeXus.Net

我之所以提出这个原因,是因为您推出了自己的临时更新信息的方法。静态变量/引用很好,但它们不会更新/刷新(所以你必须自己处理老化)并且你似乎有一个分布式设置。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top