我正在尝试学习 C#.net 来编写网络应用程序。
了解到 stackoverflow 使用 C#.net 后,我很高兴发现它。
每当我刷新页面时,我都会在主页或问题部分注意到这一点。该页面总是以可接受的速度向我返回最新信息。
我不知道你是怎么做到的。抱歉问了这么长的一系列问题。我正在尝试了解数据检索、分页、性能等的最佳实践是什么
我知道主页仅返回有限数量的问题及其统计数据,但问题部分实际上返回所有内容。
如何优化?
对于主页,您是否总是获取最近问题的所有统计数据?所以你的查询类似于“select * from questions order by datetime_created limit 20”?
那么 * 包含所有信息,包括问题标题、id、视图等?
您使用 HttpContext.Current.Server.cache 来帮助解决这个问题吗?
对于问题来说,这就更耐人寻味了。
如何进行寻呼?
您是否总是从数据库中仅获取特定页面的结果?
或者获取所有结果并将其存储到数据集中?然后你使用某种数据网格控件来帮助分页?
如果是后者,如何维护数据更新?
在 Stack Overflow 上,我们尝试在多个级别上使用积极的缓存:
HttpRuntime.Cache
用于此主页由三个缓存的 html 片段组成 - 最近的问题、最近的标签、最近的徽章 - 每个片段都有不同的持续时间。
问题列表页面将缓存特定排序/标签过滤器的所有问题的ID(
Int32[]
),使分页变得微不足道。 还完成了对统计数据(例如问题计数、相关标签计数)的进一步缓存。
一个问题详情页面将完全为匿名用户缓存,而注册用户则看到最新的商品。 此外,旁边的相关问题会缓存到磁盘更长的持续时间。
虽然我们尝试尽可能缓存整个页面,但我们确实在页面顶部显示用户信息 - 有些部分无法缓存。
因此,将缓存视为一个谜题 - 哪些部分可以在我的所有请求之间安全共享? 根据费用,哪些部分必须在我的所有请求中共享?
我不知道他们是怎么做到的 - 我没有这么写。
对于这样的事情,我会对整个问题类及其所有答案使用某种缓存机制。缓存的寿命是短暂的,但由于新的/热门的问题经常被查看,因此它们会保持活动状态。较旧的问题必须向数据库请求。当一个人回答问题而另一个线程查看问题时,这也可以防止出现线程问题。
您可以在这里注意到的另一件事是,他们大量使用 AJAX。但由于 AJAX.Net 非常浪费带宽,因此他们实现了 AJAX 调用,以便返回简单的 JSON 对象,例如当仅对具有新票数的成功对象进行投票或返回错误消息时,例如:(这是一个虚构的示例,并不代表所发生的情况,因为我现在懒得检查)
{"status": "ok", "votes": 3}
AJAX.Net 将返回整个
UpdatePanel
的内容,无论其大小如何,无论多小,仍然会很大。
这是一组试图模仿 Stack Overflow 的文章。您应该能够在 CodePlex here 找到代码库。