StackOverflow 如何优化问题显示的性能?

问题描述 投票:0回答:4

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

了解到 stackoverflow 使用 C#.net 后,我很高兴发现它。

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

我不知道你是怎么做到的。抱歉问了这么长的一系列问题。我正在尝试了解数据检索、分页、性能等的最佳实践是什么

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

如何优化?

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

    那么 * 包含所有信息,包括问题标题、id、视图等?

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

  2. 对于问题来说,这就更耐人寻味了。

    如何进行寻呼?

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

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

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

c# asp.net database-design pagination
4个回答
12
投票

在 Stack Overflow 上,我们尝试在多个级别上使用积极的缓存:

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

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

问题列表页面将缓存特定排序/标签过滤器的所有问题的ID(

Int32[]
),使分页变得微不足道。 还完成了对统计数据(例如问题计数、相关标签计数)的进一步缓存。

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

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

因此,将缓存视为一个谜题 - 哪些部分可以在我的所有请求之间安全共享? 根据费用,哪些部分必须在我的所有请求中共享?


1
投票

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

对于这样的事情,我会对整个问题类及其所有答案使用某种缓存机制。缓存的寿命是短暂的,但由于新的/热门的问题经常被查看,因此它们会保持活动状态。较旧的问题必须向数据库请求。当一个人回答问题而另一个线程查看问题时,这也可以防止出现线程问题。

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

AJAX.Net 将返回整个 
UpdatePanel

的内容,无论其大小如何,无论多小,仍然会很大。

    


1
投票

您可能还想看看这个

Stack Overflow 启发的知识交流

0
投票

这是一组试图模仿 Stack Overflow 的文章。您应该能够在 CodePlex here 找到代码库。

© www.soinside.com 2019 - 2024. All rights reserved.