2013-09-21 49 views
49

Gần đây tôi đã hỏi một câu hỏi về việc lưu dữ liệu ứng dụng trong ứng dụng ASP.NET MVC WebAPI và nó dẫn tôi đến một câu hỏi mới. Ưu điểm/khuyết điểm của các phương pháp lưu trữ khác nhau có sẵn trong ASP.NET là gì?Ưu điểm/nhược điểm của các tùy chọn ASP.NET Caching khác nhau

tôi đã đến trên:

  • Bộ nhớ Cache

    http://msdn.microsoft.com/en-us/library/system.runtime.caching.memorycache.aspx

  • Sử dụng biến tĩnh Member: Tiểu bang

    private static Northwind.SuppliersDataTable suppliers = null; 
    
  • Ứng dụng:

    HttpContext.Current.Application["key"] ="Value" 
    
  • dữ liệu bộ nhớ cache:

    HttpRuntime.Cache.Insert(
        /* key */    "key", 
        /* value */    "value", 
        /* dependencies */  null, 
        /* absoluteExpiration */ Cache.NoAbsoluteExpiration, 
        /* slidingExpiration */ Cache.NoSlidingExpiration, 
        /* priority */   CacheItemPriority.NotRemovable, 
        /* onRemoveCallback */ null); 
    

Tôi chắc chắn có những người khác, và tôi biết tất cả họ đều lưu trữ kỹ thuật dữ liệu trong bộ nhớ ... vì vậy bất kỳ ý tưởng những gì tôi nên sử dụng cho một ASP.NET MVC webapi?

Câu hỏi trước của tôi: Caching application data in memory: MVC Web API

+0

Điều đó phụ thuộc, bạn có thể nói những gì bạn muốn làm, nhưng, tôi không thích mục 'Application'. Tôi sử dụng một 'IDictionary '. 'Cache' là tốt nếu bạn có thể làm lại dữ liệu của bạn. –

Trả lời

32

Mỗi Caching công nghệ/phương pháp đã thiết lập riêng của họ về tính năng. Những tính năng này có vẻ là bất lợi trong một yêu cầu ứng dụng nhưng có thể thuận lợi trong các yêu cầu ứng dụng khác.

Vì vậy, trong ngắn hạn, tùy thuộc vào yêu cầu của bạn quyết định công nghệ Caching nào và những tính năng nào là tốt nhất cho bạn.

For example, Let us discuss some client side Caching techniques.

MSDN nói rằng chúng tôi cũng có thể sử dụng HiddenField để chỉ lưu trữ một lượng nhỏ dữ liệu thay đổi thường xuyên trong các trường ẩn vì dữ liệu này được bao gồm trong vòng lặp tới máy chủ trên mỗi bài đăng.

Lợi thế của tính năng này: Giảm tải công việc trên máy chủ của bạn bằng cách lưu trữ thông tin trang bằng cách sử dụng tùy chọn phía máy khách.

Tuy nhiên, MSDN nói rõ ràng rằng: Phương pháp này có hỗ trợ bảo mật tối thiểu.

Do đó, người ta có thể hoặc không thể sử dụng tính năng này luôn vì những cân nhắc về bảo mật cũng có ở đó.

Consider one more example, Page Output caching: nó là của 2 loại, trang sản lượng bộ nhớ đệm và trang mảnh bộ nhớ đệm.

Bộ nhớ đệm đầu ra của trang lưu trữ toàn bộ trang Web và chỉ phù hợp khi nội dung của trang đó là khá tĩnh. Nếu các phần của trang đang thay đổi, bạn có thể quấn các phần tĩnh dưới dạng điều khiển người dùng và lưu vào bộ nhớ cache các điều khiển người dùng bằng cách sử dụng bộ nhớ đệm của phân đoạn trang.

And one last comment onApplication vs HttpRuntime.cache:

Application không phải là một bộ nhớ cache, một bộ sưu tập có tên là giá trị toàn cầu của mình. nếu bạn thêm một đối tượng vào Application, nó sẽ ở lại cho đến khi một tái chế miền ứng dụng.

  • biến ứng dụng được chia sẻ biến trong số tất cả những người dùng của một ứng dụng web
  • biến ứng dụng hoạt động giống như các biến tĩnh và họ là thay thế các biến tĩnh như các biến tĩnh là stateless trong các ứng dụng web
  • giá trị Chỉ chia sẻ nên tồn tại trong các biến Ứng dụng, và ngay sau khi chúng không được sử dụng, chúng sẽ được loại bỏ một cách rõ ràng.

Cache: Có thể để có được những cải tiến hiệu suất đáng kể trong các ứng dụng ASP.NET của bộ nhớ đệm đối tượng và dữ liệu thường xuyên được yêu cầu trong một trong hai Application hoặc Cache lớp. Mặc dù lớp Cache chắc chắn cung cấp sự linh hoạt và kiểm soát nhiều hơn, nó chỉ xuất hiện để cung cấp một lợi thế cận biên về tăng thông lượng qua lớp học Application để lưu vào bộ nhớ đệm. Sẽ rất khó để phát triển một chương trình thử nghiệm có thể đo lường chính xác các lợi thế tiềm năng của việc quản lý tích hợp các đối tượng ít được sử dụng hơn trong lớp học thông qua quá trình nhặt rác trái ngược với thực tế là Ứng dụng không cung cấp tính năng này. Nhà phát triển cần đưa ra quyết định trong trường hợp này và phải dựa trên nhu cầu và sự tiện lợi của dự án và các mẫu sử dụng của dự án. Kiểm tra this link để biết thêm.

Tham khảo this MSDN article cho một giải thích đầy đủ lớn trên tất cả các công nghệ Caching trong Asp.net với discusiion vào các tính năng của mỗi công nghệ.

Ngoài ra, các 2 liên kết là một nguồn tuyệt vời để bắt đầu với:

+2

Tổng quan thú vị! Mặc dù bình luận của bạn là chủ yếu hướng vào các trang web asp.net và không phải là webapi, các bài viết web msdn bạn liệt kê có rất nhiều thông tin tuyệt vời. – vesuvious

+1

cả hai liên kết đều không hoạt động ngay bây giờ: ( – Interstellar

+0

@Interstellar: Liên kết thường ngừng hoạt động ... Tôi đã cố bao gồm nhiều chi tiết nhất có thể trong câu trả lời của tôi. Nhưng không muốn nó dài đến nhiều. Liên kết MSDN và liên kết Rất đầu tiên đang hoạt động tốt mà có chứa hầu hết các thông tin có giá trị.Bạn có thể tìm kiếm trên Blog của Peter Johnson cho bất kỳ Nội dung nào tại đây: https://weblogs.asp.net/pjohnson –

4

Khi sử dụng Web API lựa chọn hàng đầu của bạn cho bộ nhớ đệm nên luôn luôn để thiết lập bộ nhớ đệm tiêu đề trong phản hồi HTTP. HttpResponseMessage.CacheControlHeader.

Tùy chọn cuối cùng của bạn phải là bất kỳ thứ gì tùy thuộc vào HttpContext hoặc HttpRuntime, vì điều đó sẽ buộc bạn với các máy chủ cụ thể. Các ứng dụng Web API phải được xây dựng độc lập với máy chủ của chúng.

+0

bạn có nghĩa là lựa chọn cuối cùng nên * không * là? – user20358

+0

@ user20358 Tôi có nghĩa là bạn nên thử và sử dụng tối ưu hóa máy chủ độc lập trước khi cố gắng tối ưu hóa sử dụng các cơ chế phụ thuộc vào máy chủ. –

8

Về MemoryCache so với ASP.NET Cache: chúng cung cấp chức năng rất giống nhau. Trong một ứng dụng ASP.NET 4, tôi thường thích ASP.NET Cache, nếu không vì lý do nào khác, thì vì a bug in .NET 4, mà dường như đã được sửa trong .NET 4.5.

Trường tĩnh thích hợp để lưu trữ dữ liệu được chia sẻ không cần chính sách hết hạn.

Trạng thái ứng dụng không nhiều hơn từ điển tĩnh với ngữ nghĩa khóa tương thích với ASP cổ điển - Tôi chỉ sử dụng nó để tương thích ngược với mã ASP cổ điển cũ.

+0

Bạn có biết nếu một trong các phương pháp bộ nhớ cache này liên tục trên hết thời gian chờ của chuỗi công nhân IIS không? – vesuvious

+1

@ thatuvious - vâng, tất cả chúng sẽ tồn tại trong thời gian chờ yêu cầu: thời gian chờ như vậy không ảnh hưởng đến các trường tĩnh. Chúng sẽ bị xóa khi miền ứng dụng được tái chế. – Joe

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