2009-03-24 35 views
6

Tôi đang cố gắng tìm hiểu C# .net để lập trình một ứng dụng web.StackOverflow tối ưu hóa hiệu suất để hiển thị các câu hỏi như thế nào?

Và khi biết được rằng quá trình stackoverflow sử dụng C# .net Tôi rất vui khi khám phá nó.

Tôi nhận thấy rằng ở trang chủ hoặc tại phần câu hỏi, bất cứ khi nào tôi làm mới trang. Trang luôn trả về cho tôi thông tin mới nhất mà không bị lỗi và ở tốc độ chấp nhận được.

Tôi không chắc chắn bạn làm điều đó như thế nào. Xin lỗi vì chuỗi câu hỏi dài. Tôi đang cố gắng tìm hiểu các phương pháp hay nhất để truy xuất dữ liệu, phân trang, hiệu suất, v.v.

Tôi biết rằng trang chủ chỉ trả về một số câu hỏi và số liệu thống kê của chúng.

Làm thế nào để bạn tối ưu hóa nó?

  1. Đối với trang chủ, bạn luôn lấy TẤT CẢ các số liệu thống kê của các câu hỏi gần đây? để truy vấn của bạn giống như "chọn * từ thứ tự câu hỏi theo giới hạn datetime_created 20"?

    Vì vậy, * chứa TẤT CẢ thông tin bao gồm tiêu đề câu hỏi, id, lượt xem, v.v ...?

    Bạn có sử dụng HttpContext.Current.Server.cache để trợ giúp không?

  2. Đối với các câu hỏi, điều này thậm chí còn hấp dẫn hơn.

    Làm cách nào để thực hiện phân trang?

    Bạn luôn lấy từ cơ sở dữ liệu chỉ các kết quả cho trang cụ thể không?

    Hoặc bạn có lấy tất cả các kết quả và lưu trữ nó vào tập dữ liệu không? Sau đó, bạn sử dụng một số loại điều khiển dữ liệu để giúp phân trang?

Nếu sau này, làm thế nào để bạn duy trì dữ liệu được cập nhật?

+0

Tách các câu hỏi của bạn. – Cherian

+0

Vui lòng gửi câu hỏi SO cụ thể cho Jeff, không ai ở đây biết cách anh ấy triển khai công cụ của mình –

+0

hi bạn có ý nghĩa gì không bằng email tới [email protected]? Nếu đó là nơi chính xác để gửi, tôi sẽ. Tôi chỉ hy vọng tôi không lạm dụng nó, đó là tất cả. –

Trả lời

1

SO sử dụng MVC và LINQ2SQL. Tôi sẽ nghe một số trong số podcasts để có thêm ý tưởng về các chi tiết cụ thể. Tôi biết họ sử dụng rất nhiều bộ nhớ đệm nhưng không chắc chắn nếu điều đó bao gồm danh sách câu hỏi trên trang chủ.

1

Tôi không biết họ đã làm như thế nào - tôi không viết SO.

Đối với một cái gì đó như thế này, tôi sẽ sử dụng một số loại cơ chế lưu bộ nhớ cache cho toàn bộ Lớp câu hỏi với tất cả các câu trả lời của nó. Bộ nhớ cache sẽ tồn tại trong thời gian ngắn, nhưng vì các câu hỏi mới/nóng được xem rất thường xuyên, chúng sẽ vẫn còn sống. Câu hỏi cũ hơn sẽ phải được yêu cầu từ DB. Điều này cũng sẽ ngăn chặn vấn đề luồng khi một người trả lời câu hỏi và trong khi một luồng khác xem câu hỏi.

Một điều khác bạn có thể nhận thấy ở đây, là họ sử dụng nhiều AJAX. Nhưng vì AJAX.Net là cực kỳ lãng phí băng thông, họ đã triển khai các cuộc gọi AJAX để họ trả về các đối tượng JSON đơn giản, ví dụ:khi upvoting chỉ một đối tượng thành công với số lượng phiếu bầu mới hoặc một thông báo lỗi được trả về, ví dụ: (đây là một ví dụ được tạo và không đại diện cho điều gì xảy ra vì tôi không thể bị kiểm tra ngay bây giờ)

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

AJAX.Net sẽ trả lại toàn bộ UpdatePanel 's nội dung, bất kể kích thước của nó, mà không có vấn đề nhỏ như thế nào, vẫn sẽ là khá lớn.

12

Ở đây trên Stack Overflow, chúng tôi cố gắng sử dụng bộ nhớ đệm tích cực trên nhiều cấp độ:

  • trang hoàn toàn cache bởi output cache IIS', bất kể xác thực người dùng
  • những trang lưu trữ chỉ cho người dùng vô danh; người dùng đã đăng ký xem nội dung gần đây nhất
  • một số trang html được lưu trong bộ nhớ cache cho tất cả mọi người; HttpRuntime.Cache được sử dụng cho điều này

Trang nhà được tạo thành từ ba phần cache html - câu hỏi gần đây, thẻ gần đây, phù hiệu gần đây - mỗi với một khoảng thời gian khác nhau.

A trang danh sách câu hỏi sẽ lưu bộ nhớ cache các id (Int32[]) của tất cả các câu hỏi cho bộ lọc loại/thẻ cụ thể, làm cho phân trang không đáng kể. Việc lưu vào bộ nhớ đệm cao hơn về số liệu thống kê (ví dụ: số lượng câu hỏi, số lượng thẻ có liên quan) cũng được thực hiện.

A trang chi tiết câu hỏi sẽ được lưu trữ hoàn toàn cho người dùng ẩn danh, trong khi người dùng đã đăng ký thấy hàng mới nhất. Ngoài ra, các câu hỏi liên quan ở phía bên được lưu vào đĩa trong thời gian dài hơn.

Mặc dù chúng tôi cố gắng lưu toàn bộ trang bất cứ khi nào có thể, chúng tôi hiển thị thông tin người dùng ở đầu trang - một số phần không thể lưu vào bộ nhớ cache được.

Vì vậy, hãy xem bộ nhớ đệm như một câu đố - phần nào có thể được chia sẻ an toàn giữa tất cả các yêu cầu của tôi? Dựa trên chi phí, những phần nào PHẢI được chia sẻ trên tất cả các yêu cầu của tôi?

+2

Trực tiếp từ miệng ngựa. –

Các vấn đề liên quan