2012-03-14 58 views
9

我有一个很多产品和其他内容的网上商店。目前我将所有内容加载到Application_Start的全局列表中,这需要15到25秒的时间。最佳实践 - 在application_start中加载很多东西?

这使得网站真的很快,因为我可以在O(1)时间获得任何产品/内容。

但是,这是最佳实践吗?

目前我有一个不是VPS /专用服务器的webhotel,所以它随时回收应用程序,这使得随机访问者的加载时间高达15-25秒(只有成为一个更大的数字与更多内容)。这当然是完全不能接受的,但我想这将通过VPS解决。

这样做的正常方法是什么?我想像亚马逊这样的网上商店可能不会将他们的所有产品加载到一个巨大的列表中:-D

任何想法和想法将不胜感激。

+0

中小型网站可以接受。它可能无法很好地扩展到多个服务器。也取决于数据。 – 2012-03-14 18:42:05

+0

你使用的是什么数据库? – 2012-03-14 18:49:09

+0

我使用MSSQL作为数据库。当我们获得50.000+种产品时,我还想要一个解决方案,而且这种方法可能不是可缩放的。:) – 2012-03-14 18:49:50

回答

6

看起来你已经回答了你的问题你的的情况“这当然是完全不能接受的”。

如果您的目标O(1)对单个产品的数据库的正常请求可能是O(1),除非您需要在产品之间进行复杂的连接。考虑尝试删除所有预缓存逻辑并查看是否存在性能问题。您可以改用惰性缓存来限制启动影响。

大型网站通常使用像MemcaheD这样的分布式缓存。

5

更具扩展性的设置是设置一个Web服务来提供网站在需要时调用的内容。 Web服务将需要缓存经常需要的内容以实现快速响应时间。

2

分离职责将帮助您扩展未来。

使用您当前的设置,您仅限于Web服务器的资源,并且像您所说的那样,随着您继续添加更多产品,启动时间将会失去控制。

如果您与SQL Server共享每个页面请求的负担,那么您可以打开应用程序以允许它根据需要进行缩放。随着时间的推移,您可能会决定添加更多的Web服务器,群集SQL Server或完全切换到新的数据库后端。但是,如果所有的负担都在应用程序池上,那么您将极大地限制自己。

+0

您能分享示例中的链接/代码吗? – Pankaj 2012-03-14 18:59:12

2

首先,15-20秒加载的数据太多的时间,所以我怀疑这种情况下

  • 该时间是编译,而不是数据加载
  • 的数据是太多了,你完全内存
  • 您用来读取数据的方法是很慢的
  • 的数据存储速度太慢,或者是结构上的文本文件,它的读取速度慢

我的意见是,你只需要在短时间内缓存少量需要使用的数据。由于某些原因,你描述它的方式并不是很好的做法。

  1. 如果您有许多池,您可以在所有池上读取相同的数据,并且无需花费内存。
  2. 您缓存的数据不能更改它们 - 仅用于读取
  3. 即使您缓存了一些数据,您仍然需要渲染页面,并且存在实际需要制作缓存的位置渲染,而不是数据。

什么和如何缓存。

  • 我们缓存最终的渲染页面。
  • 我们还为页面和其他元素设置缓存给客户端。
  • 我们从数据库读取和写入数据,因为他们来了,我们离开数据库做缓存,他知道更好。
  • 如果我们缓存数据,那么它们的数量必须很少,需要用于长循环,我们会避免多次数据库调用。

另外我们缓存,因为他们要求它,如果不使用很长时间,或内存需要空间这部分缓存消失。如果数据的某些部分来自许多表格的复杂组合,那么我们制作一张临时的平坦大表格,将所有数据连在一起,每一行都是一行一行。这张表是临时的,如果我们需要太多的话,我们会创建第二个临时数据库文件来保存这部分数据。

数据库读取速度有多快?好的速度非常快,你不需要担心,你需要检查其他的延迟点,就像我说的完整的页面渲染或页面的某些部分。

你需要担心的是一个好的数据库设计,一种快速检索数据的好方法,以及一个很好的优化代码来展示它们。