2009-01-09 43 views
63

Sự khác biệt giữa lưu trữ dữ liệu có thể định được trong Session vs Cache là gì? Ưu điểm và nhược điểm là gì?Ưu điểm của Cache so với phiên

Vì vậy, nếu đó là một trang tìm kiếm đơn giản trả về kết quả trong một dữ liệu có thể định vị và liên kết nó với chế độ xem lưới. Nếu người dùng 'tìm kiếm' và tìm kiếm 'b', tốt hơn là lưu trữ trong Phiên vì mỗi người dùng có nhiều khả năng có kết quả khác nhau hoặc tôi vẫn có thể lưu trữ từng tìm kiếm của họ trong Cache hoặc điều đó không có ý nghĩa vì có chỉ một bộ nhớ cache. Tôi đoán về cơ bản những gì tôi đang cố gắng nói là Cache sẽ bị ghi đè.

+0

Bạn sẽ bộ nhớ cache dữ liệu mà bạn muốn tất cả người dùng để sử dụng trên các ứng dụng. Dữ liệu có thể không thay đổi trong lịch sử. Phiên nên được sử dụng để lưu trữ dữ liệu cho ngữ cảnh của người dùng, ví dụ như nếu như kết quả lọc của dữ liệu được lưu trong bộ nhớ cache chẳng hạn. – ppumkin

+2

*** 'HttpContext.Current.Cache vs HttpRuntime.Cache' ***? – Kiquenet

+1

@Kiquenet Tôi ngưỡng mộ bạn nỗ lực, thực sự. – ozgur

Trả lời

77

Một điểm khác biệt quan trọng là các mục trong bộ nhớ cache có thể hết hạn (sẽ bị xóa khỏi bộ nhớ cache) sau một khoảng thời gian nhất định. Các mục được đưa vào một phiên sẽ ở đó, cho đến khi phiên kết thúc.

ASP.NET cũng có thể xóa các mục khỏi bộ nhớ cache khi dung lượng bộ nhớ còn trống nhỏ.

Một khác biệt: trạng thái phiên có thể được giữ bên ngoài (máy chủ trạng thái, máy chủ SQL) và được chia sẻ giữa một số phiên bản ứng dụng web của bạn (để cân bằng tải). Đây không phải là trường hợp với bộ nhớ cache.

Bên cạnh những khác biệt này (như những người khác đã lưu ý): phiên là mỗi người dùng/phiên trong khi bộ nhớ cache là cho mỗi ứng dụng.

+6

Bộ đệm thực tế có thể được lưu trữ bên ngoài với Velocity – Webjedi

+3

Một bộ nhớ đệm có thể được thực hiện để lưu trữ các giá trị bên ngoài, nhưng khung .Net không hỗ trợ theo mặc định, bộ nhớ đệm bên ngoài. Tuy nhiên đối với phiên, phiên bên ngoài được hỗ trợ. – Kibbee

+1

mẫu mã nguồn đầy đủ trong asp.net 4.5.1? –

27

AFAIK, Sự khác biệt chính là phiên là mỗi người dùng, trong khi bộ nhớ cache sẽ dành cho các mục có ứng dụng.

Như đã lưu ý trong các câu trả lời khác, bạn có thể lưu trữ mỗi thông tin người dùng trong bộ nhớ cache, cung cấp cho bạn khóa (theo phiên hoặc cookie). Sau đó, bạn sẽ có nhiều quyền kiểm soát hơn để hết hạn các mục trong bộ nhớ cache và cũng đặt các phụ thuộc vào chúng. Vì vậy, nếu DataTable trong câu hỏi sẽ thay đổi một cách thường xuyên, thì bộ nhớ đệm có lẽ là một tùy chọn thích hợp. Nếu không, nếu đó là phiên tĩnh có thể phù hợp hơn. Steven Smith has an excellent video on caching at dnrtv đáng để trả tiền.

Nó thực sự phụ thuộc vào những gì bạn đang cố gắng đạt được, bạn đã có bao nhiêu thời gian. Có một số lựa chọn thay thế khác để xem xét về cách bạn lưu trữ trạng thái trong một ứng dụng. Tùy thuộc vào độ lớn của bảng, bạn có thể xem xét lưu trữ trạng thái trong một cookie (được mã hóa nếu đó là thông tin nhạy cảm). Ngoài ra, nếu đó là ứng dụng dữ liệu phạm vi bạn lạnh sử dụng một trường tĩnh trên một trang hoặc lớp học. Cũng có đối tượng Application.

Cập nhật: Tôi nghĩ rằng câu hỏi chính bạn phải tự hỏi mình, là ai sẽ xem dữ liệu này.

Are they going to access the data frequently? 

(Không, đừng bận tâm).

Is it going to change? 

(Không, sử dụng trường tĩnh hoặc Ứng dụng).

Is it acceptable for user a and user b to see the same results? 

(Không, sử dụng bộ nhớ cache có khóa bao gồm tên người dùng và cụm từ tìm kiếm).
(Có, sử dụng bộ nhớ cache bằng cách sử dụng khóa của cụm từ tìm kiếm).

Thành thật mà nói, nếu bạn không ở xa trong sự phát triển của bạn, tôi sẽ xem xét việc đậu xe vấn đề bộ nhớ đệm/trạng thái cho một ngày sau đó - thậm chí bạn có thể không cần đến nó.

Ba quy tắc điều chỉnh hiệu suất đầu tiên là: 1. Đo lường, 2. Đo lường thêm. 3. Đo lại ...

+3

chỉ khi bạn tạo khóa bộ nhớ cache cụ thể cho sessionID đó – StingyJack

+2

*** HttpContext.Current.Cache vs HttpRuntime.Cache ***? HttpContext.Current.Cache là ** cho mỗi người dùng **? – Kiquenet

+0

Bạn nói _Measure more, more, again_. Làm thế nào để đo lường tốt hơn, ** mô hình và thực hành **? bất kỳ mẫu nào? –

5

Bộ nhớ cache nằm trong phạm vi Ứng dụng với mục đích giảm số lần thu thập dữ liệu. Phiên nằm trong phạm vi phiên của người dùng với mục đích cung cấp trạng thái người dùng cụ thể.

5

Cũng phụ thuộc vào cách bạn đã định cấu hình phiên cho ASP.NET. Bạn đang lưu trữ phiên trong cơ sở dữ liệu hoặc trong bộ nhớ? Nếu trong bộ nhớ bạn đang sử dụng một máy chủ riêng biệt hoặc bạn đang sử dụng máy chủ web hiện tại cho phiên?

Tùy thuộc vào cách mọi thứ được thiết lập cho bạn có thể có những tác động về hiệu suất khi bạn đang sử dụng thứ gì đó như dữ liệu có thể cho tôi biết rằng bạn có thể lưu trữ một lượng lớn dữ liệu.

Ngoài ra Phiên được lưu trữ cho mỗi người dùng và được truy xuất cho mỗi người dùng bằng vé phiên được lưu trữ trong cookie phiên hoặc trên URL nếu họ không chấp nhận cookie và bạn đã thiết lập chế độ ASP.NET thành cookieless . Bất cứ thứ gì mà bạn nhớ cache sẽ được lưu trữ ở cấp ứng dụng và sẽ có sẵn cho tất cả các phiên người dùng có thể hoặc không thể là những gì bạn muốn.

3

Phiên là mỗi người dùng, Cache dành cho ứng dụng.

Các mục trong Cache có thể và sẽ được xóa tự động dựa trên thời gian hết hạn (trượt hoặc cố định) và các ràng buộc về bộ nhớ của quy trình công nhân IIS.

Vì vậy, các mục cơ bản trong Cache không bao giờ được bảo đảm tồn tại nhưng Phiên sẽ ở đó cho đến khi phiên kết thúc.

Lưu trữ các mục trên cơ sở từng người dùng (thông qua Phiên hoặc sử dụng bộ nhớ cache sáng tạo) có thể dẫn đến nhiều việc sử dụng bộ nhớ và cần được xem xét cẩn thận.

Trên tất cả điều này, nếu IIS đặt lại quy trình công nhân, bạn có thể mất Cache và Phiên của mình.

+1

phiên không được đảm bảo. – StingyJack

+2

*** HttpContext.Current.Cache vs HttpRuntime.Cache *** _differences_? HttpContext.Current.Cache là ** cho mỗi người dùng **? – Kiquenet

2

Xem this answer.

Phiên có thể giết hiệu suất ứng dụng của bạn, trừ khi bạn sử dụng một số nhà cung cấp phụ trợ như memcached hoặc vận tốc. Nói chung bạn nên tránh nó.

8

Một khác biệt quan trọng, phiên Nhà nước sẽ bị chặn nếu đồng thời async yêu cầu Ajax được thực hiện, nó sẽ ảnh hưởng đến hiệu suất

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