我正在尝试学习C#.net来编写一个Web应用程序。
了解到stackoverflow使用C#.net后我很高兴发现它。
我注意到在主页或问题部分,每当我刷新页面时。该页面总是以可接受的速度向我返回最新信息。
我不知道你是怎么做到的。很抱歉这一系列问题很长。我正在尝试了解数据检索,分页,性能等的最佳实践
我知道主页只会返回有限数量的问题及其统计信息,但问题部分实际上会返回所有内容。
你如何优化它?
对于首页,您是否总是抓住最近问题的所有统计数据?所以您的查询类似于“按日期时间 - 创建限制20来选择问题顺序”?
所以*包含所有信息,包括问题标题,ID,视图等?
你使用HttpContext.Current.Server.cache来帮助吗?
对于这些问题,这更令人感兴趣。
你如何进行传呼?
您是否始终只从数据库中获取特定页面的结果?
或者您获取所有结果并将其存储到数据集中?然后你使用某种数据网格控件来帮助分页?
如果是后者,您如何维护要更新的数据?
答案 0 :(得分:12)
在Stack Overflow上,我们尝试在很多层面上使用积极的缓存:
HttpRuntime.Cache
用于此主页由三个缓存的html片段组成 - 最近的问题,最近的标签,最近的徽章 - 每个都有不同的持续时间。
问题列表页面会缓存特定排序/标记过滤器的所有问题的ID(Int32[]
),从而使分页变得微不足道。还完成了对统计数据的进一步缓存(例如问题计数,相关标签计数)。
问题明细页面将完全缓存给匿名用户,而注册用户则会看到最新商品。此外,侧面的相关问题会缓存到磁盘上较长时间。
虽然我们尝试尽可能地缓存整个页面,但我们确实在页面顶部显示用户信息 - 某些部分无法缓存。
所以看看像拼图一样的缓存 - 我的所有请求之间可以安全地共享哪些部分?根据费用,我的所有要求必须分享哪些部分?
答案 1 :(得分:1)
SO使用MVC和LINQ2SQL。我会听一些podcasts来了解具体细节。我知道他们使用了很多缓存,但不确定是否包含主页上的问题列表。
答案 2 :(得分:1)
我不知道他们是怎么做到的 - 我没写过。
对于这样的事情,我会使用某种缓存机制来处理整个Question类及其所有的答案。缓存将是短暂的,但由于经常查看新/热问题,它们将保持活跃状态。必须从DB请求较旧的问题。当一个人回答问题而另一个线程查看问题时,这也可以防止线程问题。
你可以注意到的另一件事是他们大量使用AJAX。但是由于AJAX.Net非常带宽浪费,他们实现了AJAX调用,因此他们将返回简单的JSON对象,例如:当仅使用新的投票数对一个成功对象进行upvot或返回错误消息时,例如:(这是一个简单的示例,并不代表发生的事情,因为我不能打扰正确检查现在)子>
{"status": "ok", "votes": 3}
AJAX.Net将返回整个UpdatePanel
的内容,无论其大小如何,无论多小,都会非常大。
答案 3 :(得分:0)
您可能还想查看此Stack Overflow Inspired Knowledge Exchange。
这是一组试图模拟Stack Overflow的文章。您应该能够在CodePlex找到代码库here。