如何为ASP.NET Mvc从数据库缓存大量数据

4
我的网站使用linq-to-sql从数据库加载大约5万行数据。这些数据是静态的,永远不会改变。它类似于垃圾邮件过滤器,需要加载所有50k行模式。
什么是最佳编程方式?以获得最佳性能?

数据是静态的吗?例如查找数据,或者它会改变,无论是在代码中还是来自另一个来源? - PostMan
数据是静态的,不会改变。 - Rana
1个回答

4
将整个内容加载到单个静态只读数据结构中(由于它是不可变的,一旦构建完成,可以安全地从多个线程中使用),将为每次查找提供最佳的整体性能。
但是,这将导致长时间的启动时间,这可能是不可接受的。在这种情况下,您可以考虑按访问的方式加载每个项目,但这会带来并发问题(因为您正在更改由多个线程使用的数据结构)。
在两者之间的选项是在启动时加载所有索引,然后在每次访问时添加其余信息,并使用更细粒度的锁来减少锁争用。
或者您可以忽略所有内容,并根据需要从数据库中加载。这确实具有某些性能优势,因为内存不用于很少使用的信息。如果您突然发现必须允许数据更改,则这将更容易。
总体而言,没有一种方法在一般情况下是唯一合理的,这将取决于应用程序、数据和使用模式的具体情况。

单例模式的单一静态只读结构不会很好地扩展,但除此之外,在我看来它是完美的。 - PostMan
你能提供一个创建静态只读变量的示例吗?通常我只使用List<DataRow>... - Rana
取决于您想要查找项目的方式以及您想要使用它们的方式。我会开始考虑使用Dictionary<KeyType,CustomObject>或Dictionary<KeyType,List<CustomObject>>,其中KeyType是查找相关项目的一种方式(int和string是常见的),而CustomObject是从数据构建的,并以易于在需要数据时使用的方式包含相关信息。 - Jon Hanna
@PostMan 在哪个维度上进行缩放?如果有很多使用相同少量安全并发读取数据结构的情况,它可以很好地扩展。但是如果有很多这样的大型数据结构(最终会耗尽内存),则无法扩展。 - Jon Hanna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接