2009-02-16 10 views
56

Việc cần làm và những điều nên tránh về Cache VS Session VS Cookies là gì?Cache VS Session VS cookies?

Ví dụ:
Tôi đang sử dụng các biến phiên và đôi khi gặp sự cố trong đơn đăng ký khi người dùng bắt đầu đặt hàng và sau đó đi ăn trưa và quay lại vài giờ sau đó và tiếp tục đặt chỗ. Tôi lưu trữ đặt phòng trong phiên cho đến khi người dùng xác nhận hoặc hủy đăng ký, vì vậy tôi không cần phải nói chuyện với cơ sở dữ liệu và xử lý đặt nửa chừng trong cơ sở dữ liệu khi người dùng chỉ cần nhấp vào X trong trình duyệt và không bao giờ quay lại.

Tôi có nên sử dụng bộ nhớ cache hoặc cookie thay thế hoặc một số kết hợp cho điều này không?

(Ngoài ra khi có một số lỗi trong ứng dụng, phiên đối tượng resets chính nó và tôi nhận được nhiều vấn đề hơn vì điều đó)

tôi chủ yếu là làm máy tính để bàn lập trình và cảm thấy mình thiếu nhiều kiến ​​thức ở đây để bất kỳ ai có thể mở rộng nơi sử dụng Cache, Session, Cookies (hoặc db) sẽ được đánh giá cao

Chỉnh sửa: Từ câu trả lời, có vẻ như kết hợp giữa DB và cookie là những gì tôi muốn.

  1. Tôi có để lưu trữ các đặt phòng trong cơ sở dữ liệu kết nối với một phiên id
  2. Store phiên id trong một cookie (được mã hóa).
  3. Mỗi lần tải trang kiểm tra cookie và tìm nạp đặt chỗ từ cơ sở dữ liệu
  4. Tôi có quy trình làm sạch chạy mỗi tuần một lần để xóa các đặt chỗ chưa hoàn tất.

Tôi không thể lưu trữ đặt chỗ dưới dạng cookie vì người dùng có thể thay đổi giá và dữ liệu nhạy cảm khác và tôi phải xác nhận mọi thứ (không thể tin tưởng dữ liệu).

Tôi đã nhận đúng chưa?

Và cảm ơn lời giải thích tuyệt vời cho tất cả các bạn!

+0

Trên thực tế, nếu bạn muốn để lưu trữ dữ liệu trên máy chủ, bạn có thể sử dụng ASP.NET xác định vô danh thay vì sử dụng session IDs. Bằng cách bật nhận dạng ẩn danh, đối tượng Cấu hình ASP.NET sẽ xử lý ánh xạ và lưu trữ cho bạn một cách tự động (cả đối với người dùng đã được xác thực và chưa được xác thực). –

+0

@Mehrdad, Cảm ơn! Hãy kiểm tra điều đó! – Stefan

Trả lời

71

Quản lý nhà nước là một điều quan trọng để làm chủ khi đến với thế giới web từ góc độ ứng dụng dành cho máy tính để bàn.

  • Session được sử dụng để lưu trữ mỗi người dùng thông tin cho các phiên Web hiện tại trên máy chủ . Nó hỗ trợ bằng cách sử dụng một máy chủ cơ sở dữ liệu như là cửa hàng back-end.
  • Cookie nên được sử dụng để lưu trữ mỗi người dùng thông tin cho các phiên Web hiện tại hoặc dai dẳng thông tin về khách hàng , do đó khách hàng có quyền kiểm soát các nội dung của một cookie.
  • Cache đối tượng là được chia sẻ giữa những người dùng trong một ứng dụng đơn lẻ. Mục đích chính của nó là để lưu trữ dữ liệu từ một kho dữ liệu và không nên được sử dụng như một lưu trữ chính. Nó hỗ trợ các tính năng vô hiệu hóa tự động .
  • Application đối tượng được chia sẻ giữa người dùng để lưu trữ trạng thái ứng dụng rộng và phải được sử dụng tương ứng.

Nếu ứng dụng của bạn được sử dụng bởi một số người dùng chưa được xác thực, tôi khuyên bạn nên lưu trữ dữ liệu trong cookie. Nếu nó yêu cầu xác thực, bạn có thể lưu trữ dữ liệu trong DB theo cách thủ công hoặc sử dụng các tính năng quản lý hồ sơ ASP.NET.

+0

Bạn có thể mở rộng trên "ASP.NET fetures quản lý hồ sơ" không? – Stefan

+2

Đối tượng ASP.NET 'Profile' lưu trữ thông tin hồ sơ người dùng trong một DB. Bạn sử dụng 'Hồ sơ [" Khóa "] =" Giá trị "; 'không đau đớn;) –

+0

Điều gì về Cache được phân phối trong một trang trại, bộ nhớ cache sử dụng các trang web một Dịch vụ Wcf? và AppFabric Caching? – Kiquenet

1

Phiên được lưu trữ trên máy chủ sẽ hết thời gian chờ trong 20 phút (Điều này có thể điều chỉnh được). Tôi sẽ lưu trữ này trong một cookie, hoặc trong viewstate (nếu có) để ngăn chặn thời gian chờ.

Nếu trạng thái của bạn được lưu trữ InProc (thiết lập mặc định), thì có nhiều máy chủ trong một trang trại sẽ gây ra sự cố cho bạn trừ khi bạn đã thực hiện một số loại "phiên cố định" cùng một máy chủ trong trang trại cho các cuộc gọi tiếp theo.

Tôi cố gắng tránh phiên khi có thể (đặt tải thêm và sử dụng bộ nhớ trên máy chủ), đồng thời giữ cho chế độ xem bị tắt khi có thể để giữ kích thước trang thấp. Cookie thường là tùy chọn nhẹ nhất nhưng người dùng của bạn có thể đã tắt tính năng này và bạn sẽ cần chế độ dự phòng vẫn cho phép họ sử dụng trang web.

Sửa (thêm làm rõ dựa trên phản hồi từ hỏi):

ViewState được lưu trữ trong một lĩnh vực ẩn, và là một đại diện tuần tự của tất cả các đối tượng trong lưu trữ ViewState. Viewstate được tự động sử dụng để lưu trữ trạng thái của trang, nhưng bạn có thể thêm và lấy các đối tượng của riêng bạn một cách rõ ràng và từ Viewstate theo chương trình nếu bạn chọn.

Vì vậy, có, bộ dữ liệu có thể được lưu trữ trong Viewstate.

+0

Viewstate, là khi nó được lưu trữ dưới dạng chuỗi nhị phân dài trong trang? Tôi làm việc với các tập dữ liệu và chỉ lưu trữ tập dữ liệu trong đối tượng phiên, liệu có thể sử dụng ViewState quá hay tôi phải lưu trữ các đối tượng khác ở đó? – Stefan

+1

Hi Stefan, tôi đã làm rõ thêm câu trả lời của tôi dựa trên câu trả lời của bạn. –

4

Web là do mô hình bị ngắt kết nối tự nhiên và không có tùy chọn nào được đề cập (Phiên, Ứng dụng, Bộ nhớ cache, ...) đủ đáng tin cậy. Phiên sẽ hết giờ, quá trình tái chế của công nhân, v.v.

Nếu bạn thực sự cần lưu trữ tiến trình người dùng, đáng tin cậy và qua thời gian dài, cơ sở dữ liệu là giải pháp duy nhất của bạn. Nếu bạn có hồ sơ người dùng (nếu người dùng phải đăng nhập), thì nó đơn giản. Nếu không, hãy tạo một Id duy nhất, lưu nó trong cookie (hoặc URL) và theo dõi người dùng dựa trên nhận dạng đó.

Chỉ cần đảm bảo Id được mã hóa và sau đó chuỗi được mã hóa base64 và không chỉ là giá trị số.

EDIT:

Sau khi giải thích bổ sung của bạn trong câu hỏi ban đầu và bình luận từ Mehrdad Afshari, giải pháp tốt cho bạn là nên sử dụng phiên nhưng thiết lập lưu trữ để Sql Server thay vì InProc.

Dưới đây là chi tiết và hướng dẫn làm thế nào để thiết lập nó: http://msdn.microsoft.com/en-us/library/ms178586.aspx

Có nhớ rằng bạn sẽ vẫn có timeouts phiên, nhưng họ sẽ tồn tại hồ bơi ứng dụng tái chế, thậm chí khởi động lại máy chủ.

Nếu bạn thực sự cần một bộ nhớ vĩnh viễn, giải pháp tùy chỉnh với cơ sở dữ liệu, như tôi đã phác thảo ban đầu là giải pháp duy nhất.

+0

'Session' hỗ trợ sử dụng SQL Server làm cửa hàng phụ trợ. –

1

Bạn không nên sử dụng đối tượng Cache để lưu dữ liệu phiên cache, vì bộ nhớ cache được chia sẻ giữa tất cả người dùng. Thay vào đó, bạn có thể sử dụng Asp.Net Profile properties để lưu trữ dữ liệu của mình hoặc bạn có thể thêm trình xử lý sự kiện vào sự kiện Session_End và lưu trữ dữ liệu nếu người dùng rời khỏi máy tính quá lâu.

+1

Bạn có thể - miễn là bạn tiền tố/postfix/cái gì khác các phím của bạn với ID phiên. Tôi làm nó suốt. Đừng làm cho tôi sai - Tôi không lưu trữ dữ liệu phiên trong bộ nhớ cache, tôi cache dữ liệu phiên trong bộ nhớ cache. –

1

Điều đầu tiên bạn phải biết! cookie được sử dụng theo phiên! Máy chủ biết ai là người dùng của bạn nhờ vào cookie được trao đổi giữa máy khách và máy chủ theo yêu cầu (điều này hoạt động với các tiêu đề HTTP được đặt cookie và cookie).

Câu hỏi thực sự là:

  • Nếu bạn muốn lưu trữ thông tin người dùng trong thời gian chuyển hướng, sau đó bạn nên sử dụng phiên.

  • Nếu khách hàng của bạn không hỗ trợ cookie, bạn có thể quyết định lưu trữ cookie bên trong mỗi yêu cầu, được mã hóa trong URL (máy chủ sẽ sử dụng URL thay vì cookie để tìm phiên phù hợp cho yêu cầu) .

Sau đó, xem xét nơi bạn muốn lưu trữ phiên của bạn:
Nếu trang web của bạn phải có disponibility cao và hiệu suất cao, sau đó bạn không phải lưu trữ phiên bên trong quá trình này nhưng bên trong một cơ sở dữ liệu. Bằng cách này bạn sẽ có thể chia sẻ công việc giữa một số máy chủ web. Nhưng bạn sẽ mất tính đơn giản (vì các đối tượng bạn lưu trữ trong phiên của bạn phải được tuần tự hóa), và bạn có thêm một chuyến đi vòng giữa máy chủ web và máy chủ cơ sở dữ liệu của mình.

0

Cookies được lưu trữ trong trình duyệt như một tập tin văn bản được lưu trữ format.It lượng giới hạn của data.It chỉ cho phép 4KB [4096bytes] Nó không giữ biến nhiều trong các tập tin cookie.

chúng ta có thể truy cập vào các giá trị cookie trong easily.So nó là kém an toàn .Công setcookie() chức năng phải xuất hiện TRƯỚC thẻ.

Phiên được lưu trữ ở phía máy chủ.Đó được lưu trữ lượng dữ liệu không hợp lệ. Nó đang giữ nhiều biến trong phiên. chúng tôi không thể truy cập các giá trị cookie một cách dễ dàng.Vì vậy, nó là an toàn hơn.

Links:cache-vs-session-vs-cookies