Lưu vào bộ nhớ đệm trong asp.net-mvc


82

Tôi muốn lưu vào bộ nhớ cache các tác vụ nặng nề nhất trong cơ sở dữ liệu của mình trong trang web asp.net-mvc của tôi. Trong nghiên cứu của mình, tôi đã tìm thấy

  • donut caching trên blog của Phil
  • Bộ lọc lưu vào bộ nhớ đệm / nén trên blog của Kazi
  • Podcast của Scott Hansleman về cách họ lưu trữ mọi thứ trong SO.

Nhưng tôi chưa cảm thấy mình hiểu.
Tôi muốn có thể lưu vào bộ nhớ cache yêu cầu ĐĂNG của mình tùy thuộc vào một số trình phân tích cú pháp. Các phân tích cú pháp này nằm trong một đối tượng. Vì vậy, tôi muốn lưu vào bộ nhớ cache kết quả của yêu cầu sau:

public ActionResult AdvancedSearch(SearchBag searchBag)

Trong đó searchBag là một đối tượng chứa (một loạt) các tham số tìm kiếm tùy chọn. Bản thân các quan điểm của tôi là nhẹ (đúng như vậy), nhưng việc truy cập dữ liệu có thể khá tốn thời gian, tùy thuộc vào trường nào được điền vào túi tìm kiếm.

Tôi có cảm giác rằng tôi nên lưu vào bộ nhớ đệm trên datalayer của mình, thay vì sau đó là hành động của tôi.
Làm cách nào để sử dụng VaryByParam trong thuộc tính OutputCache?


2
Bạn đã thử với VaryByParam = "searchBag.property" chưa?
Eduardo Campañó

không, tôi chưa. Sẽ thử những gì bạn nói. Nhưng làm thế nào về việc liệt kê một số tham số?
Boris Callens

2
VaryByParam = "firstParam; secondParam; thirdParam"
Arnis Lapsa

1
Hơi muộn, nhưng Khối Ứng dụng Bộ đệm ẩn Thư viện Doanh nghiệp được bao gồm trong .Net 4.0, vì vậy bây giờ bạn có thể sử dụng Bộ nhớ đệm của System.Runtime.Caching để có hiệu quả tương tự. Bất cứ nơi nào cũng vậy :)
Carl

Câu trả lời:


74

Tôi cũng thích lưu vào bộ nhớ cache trong mô hình hoặc lớp dữ liệu. Điều này cô lập mọi thứ liên quan đến việc truy xuất dữ liệu từ bộ điều khiển / bản trình bày. Bạn có thể truy cập bộ đệm ASP.NET từ System.Web.HttpContext.Current.Cachehoặc sử dụng Khối ứng dụng bộ đệm từ Thư viện doanh nghiệp. Tạo khóa của bạn cho dữ liệu được lưu trong bộ nhớ cache từ các tham số cho truy vấn. Đảm bảo làm mất hiệu lực bộ nhớ cache khi bạn cập nhật dữ liệu.


1
Tôi nghĩ tôi nên đọc trên Thư viện Doanh nghiệp. Vì phần lớn sự chậm trễ nằm ở Lớp dữ liệu nên cuối cùng, đó sẽ là giải pháp tốt nhất. Hiện nay nó là một DB chỉ đọc, vì vậy đây eleviates vấn đề đối tượng cũ :)
Boris Callens

17
Khối ứng dụng bộ nhớ đệm có vẻ giống như một mớ hỗn độn quá mức cần thiết. Tôi nhận thấy rằng trong hầu hết mọi trường hợp, HttpRuntime.Cache là quá đủ.
Jeff Putz

3
Tại sao quá mức cần thiết? Bây giờ tôi đang tiến xa hơn trong quá trình phát triển và tôi nhận thấy hệ thống bộ nhớ cache của EL thực sự dễ sử dụng. Tham khảo đúng thư viện, thêm các dòng cấu hình chính xác và bạn có thể bắt đầu lưu vào bộ nhớ đệm và truy xuất các đối tượng với một dòng mã mỗi dòng.
Boris Callens

6
Tôi nghĩ rằng đó là bước "thêm các dòng cấu hình chính xác" khiến một số người khó chịu.
Mike Chamberlain

sẽ rất tốt nếu bạn cũng có thể giải thích cách làm mất hiệu lực bộ nhớ đệm khi có cập nhật trong cơ sở dữ liệu, bạn có sử dụng dịch vụ để kiểm tra thường xuyên không, sau đó làm cách nào để xóa bộ nhớ cache?
shaijut

66

Hoặc bạn có thể độc lập với HttpContext.Current và truy cập Cache từ HttpRuntime.Cache :)


Điều đó cũng có nghĩa là bạn sẽ vẫn có thể truy cập vào 'bộ nhớ cache' khi mã đang được chạy trên một chuỗi nền (tức là không đồng bộ / chờ đợi tốt).
Michael K. Campbell

12

Thông thường, OutputCaching có thể nhanh và hiệu quả nhất, nhưng chỉ khi nó đáp ứng yêu cầu của bạn. Không hiệu quả nhanh nếu nó sai! ;)

Trong trường hợp này, có vẻ như bộ nhớ đệm ở lớp dữ liệu là đúng vì bạn có nhu cầu bộ đệm phức tạp. Đôi khi, bạn có thể kết hợp cả hai nếu bộ thông số kiểm soát đầu ra nào được lưu vào bộ nhớ đệm là đơn giản.


0

bạn có thể sử dụng bộ nhớ đệm đầu ra như thế này

[OutputCache(Duration = 10, VaryByParam = "empID")]
      public ActionResult GetEmployeeDetail(int empID)
      {
          Employee e = new Employee();
          return Content(e.getEmployeeDetails(empID));
      }

hoặc bạn có thể sử dụng cấu hình bộ đệm đặt nó trong cấu hình web

<caching>
<outputCacheSettings>
    <outputCacheProfiles>
        <add name="Admin" 

        duration="86420" varyByParam="none"/>
    </outputCacheProfiles>
</outputCacheSettings>
</caching>

and use this tag
[OutputCache(CacheProfile="Admin")]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.