6

我正在尝试学习 C#.net 来编写 Web 应用程序。

在得知 stackoverflow 使用 C#.net 后,我​​很高兴发现它。

每当我刷新页面时,我都会在主页或问题部分注意到这一点。该页面始终以可接受的速度向我返回最新信息。

我不确定你是怎么做到的。对不起,一连串的问题。我正在尝试了解数据检索、分页、性能等方面的最佳实践

我知道主页只返回有限数量的问题及其统计信息,但问题部分实际上返回了所有内容。

你如何优化它?

  1. 对于主页,您是否总是获取最近问题的所有统计信息?所以您的查询类似于“select * from questions order by datetime_created limit 20”?

    所以 * 包含所有信息,包括问题标题、ID、视图等?

    您是否使用 HttpContext.Current.Server.cache 来帮助解决这个问题?

  2. 对于这些问题,这更耐人寻味。

    你如何进行分页?

    您是否总是只从数据库中获取特定页面的结果?

    或者您是否获取所有结果并将其存储到数据集中?然后你使用某种数据网格控件来帮助分页?

如果是后者,如何维护要更新的数据?

4

4 回答 4

12

在 Stack Overflow 上,我们尝试在多个级别上使用主动缓存:

  • 页面完全由 IIS 的输出缓存缓存,无论用户身份验证如何
  • 仅为匿名用户缓存的页面;注册用户看到最新的内容
  • 为所有人缓存的部分页面 html;HttpRuntime.Cache用于此

主页由三个缓存的 html 片段组成——最近的问题、最近的标签、最近的徽章——每个都有不同的持续时间。

问题列表页面将缓存Int32[]特定排序/标签过滤器的所有问题的 id ( ),从而使分页变得微不足道。对统计数据(例如问题计数、相关标签计数)的进一步缓存也已完成。

一个问题详情页面将完全缓存匿名用户,而注册用户看到最新的商品。此外,侧面的相关问题被缓存到磁盘的时间更长。

虽然我们尝试尽可能缓存整个页面,但我们确实在页面顶部显示用户信息 - 某些部分无法缓存。

因此,像拼图一样看待缓存——我的所有请求之间可以安全地共享哪些部分?根据费用,我的所有请求必须共享哪些部分?

于 2009-09-23T09:04:54.763 回答
1

SO uses MVC and LINQ2SQL. I'd listen to some of the podcasts to get more of an idea of the specifics. I do know they use a lot of caching but not sure if that includes the question list on the home page.

于 2009-03-24T07:15:11.397 回答
1

我不知道他们是怎么做到的——我没有这么写。

对于这样的事情,我会为整个 Question 类及其所有 Answers 使用某种缓存机制。缓存将是短暂的,但由于经常查看新/热门问题,它们将保持活跃。较早的问题必须向 DB 提出。当一个人回答问题而另一个线程查看问题时,这也可以防止线程问题。

您可以在这里注意到的另一件事是他们大量使用 AJAX。但是由于 AJAX.Net非常浪费带宽,他们实现了 AJAX 调用,因此他们将返回简单的 JSON 对象,例如,当只对具有新票数的成功对象进行投票或返回错误消息时,例如:(这是一个虚构的例子,并不代表发生的事情,因为我现在懒得检查)

{"status": "ok", "votes": 3}

AJAX.Net 将返回整个UpdatePanel的内容,无论其大小如何,无论多么小,仍然会很大。

于 2009-03-24T08:38:39.447 回答
0

您可能还想看看这个Stack Overflow Inspired Knowledge Exchange

这是一组试图模仿 Stack Overflow 的文章。您应该可以在 CodePlex 找到代码

于 2009-09-23T10:03:19.060 回答