2012-06-14 39 views
10

Tôi có một ứng dụng ASP.NET MVC 3 về cơ bản chỉ là một tập hợp các dịch vụ web. Các dịch vụ web này được hiển thị bởi một tập hợp các hành động của Bộ điều khiển. Mỗi hành động điều khiển truy vấn cơ sở dữ liệu của tôi. Bởi vì dữ liệu của tôi hiếm khi thay đổi và dữ liệu cũ không phải là mối quan tâm, tôi nghĩ tôi sẽ triển khai một số bộ đệm ẩn để cải thiện hiệu suất. Mục tiêu của tôi là:Caching Data trong ASP.NET MVC 3

  1. Không bao giờ nhớ lại phản hồi cho người dùng.
  2. Cache các bản ghi cơ sở dữ liệu trong tối đa 24 giờ. Nếu 24 giờ trôi qua, hãy nhấn lại vào cơ sở dữ liệu.

Điều đó có hợp lý không? Tôi biết cách ngăn chặn phản hồi từ bộ nhớ đệm. Tôi chỉ sử dụng các thông tin sau:

HttpContext.Response.Cache.SetCacheability(cacheability) 

Tuy nhiên, tôi không chắc chắn cách lưu trữ bản ghi cơ sở dữ liệu trong bộ nhớ trong tối đa 24 giờ. Có ai có bất cứ đề nghị về làm thế nào để làm điều này? Tôi thậm chí không chắc chắn nơi để tìm.

Cảm ơn bạn

+0

Bạn có đơn giản muốn lưu toàn bộ nội dung của bảng vào bộ nhớ hay bạn muốn lưu một phần bằng bộ nhớ cache LRU? – hatchet

+1

Nó không có vẻ như bạn đang tìm kiếm một giải pháp được cung cấp bởi khung MVC. Khung MVC được thiết kế để tạo ra các phản hồi cho một người dùng và có thể lưu trữ các phản hồi đó bằng cách sử dụng thuộc tính OutputCache dựng sẵn. Vì bạn không muốn các câu trả lời được lưu trữ, bạn có thể muốn tìm một phương thức trừu tượng hơn để lưu các kết quả truy vấn không gắn với khung MVC (memcached, vv). – ken

+0

Tôi muốn lưu toàn bộ nội dung của bảng vào bộ nhớ. Trên thực tế, trong instace của tôi, bảng của tôi đã được chuyển đổi thành các đối tượng CLR. Vì vậy, lý tưởng, tôi chỉ muốn cache các đối tượng. – user70192

Trả lời

0

Here là một bài viết tốt mà thảo luận về một số thông lệ liên quan đến hiệu suất cho ASP.NET MVC 3 và bộ nhớ đệm được đề cập.

2

Khung MVC là kiên trì thuyết phục. Không có phương tiện tích hợp để lưu trữ dữ liệu, do đó không có phương tiện tích hợp để lưu trữ dữ liệu được lưu trữ.

Thuộc tính OutputCache có thể được sử dụng để cache phản hồi của máy chủ. Nhưng bạn đã tuyên bố rõ ràng rằng đó không phải là điều bạn muốn làm.

Tuy nhiên, bạn vẫn có thể sử dụng được xây dựng trong OutputCache nếu bạn muốn ở trong khuôn khổ MVC. Cân nhắc lộ dữ liệu bạn muốn để cache như là kết quả JSON

[OutputCache(Duration = 86400)] 
public JsonResult GetMyData() { 
    var results = QueryResults(); 
    return Json(results); 
} 

Chuỗi JSON tại /ControllerName/GetMyData sẽ được lưu trữ trong 24 giờ, vì vậy truy vấn thực tế sẽ chỉ được chạy một lần mỗi ngày. Điều đó có nghĩa là bạn phải thực hiện cuộc gọi AJAX trên trang cuối cùng của bạn hoặc thực hiện cuộc gọi HTTP khác từ máy chủ của bạn. Không ai trong số đó là lý tưởng.

Tôi sẽ tìm giải pháp khác cho vấn đề của bạn bên ngoài khuôn khổ MVC. Hãy xem xét memcached, được tạo cho chính xác mục đích này.

1

Nếu bạn đang sử dụng MSSQL, bạn có thể muốn xem SQL Cache Dependency.

Tôi không chắc liệu bạn có thể định cấu hình bộ nhớ cache hết hạn trong 24 giờ hay không nhưng phụ thuộc vào bộ nhớ cache mà bạn có thể không cần - nó sẽ làm mất hiệu lực bộ nhớ cache ngay sau khi có bản cập nhật trên cơ sở dữ liệu (tức là hiệu quả hơn so với chiến lược hết hạn thời gian).

2

Điều bạn đang nói đến không phải là trách nhiệm chính xác của MVC. ASP.Net cho phép bạn cahce chỉ những điều nó sản xuất (và điều này họ là responces, obviosly).

Nếu bạn muốn lưu vào bộ nhớ cache dữ liệu, tốt nhất nên đặt nó vào cùng một vị trí được tạo - ở đâu đó trong BL hoặc Lớp dữ liệu.

Bạn có thể làm một cái gì đó như thế:

public class DataCacher 
{ 
    private static String data; 
    private static DateTime updateTime; 

    private DataCacher() { } 

    public static String Data 
    { 
     get 
     { 
      if (data == null || updateTime > DateTime.Now) 
      { 
       data = "Insert method that requests your data form DB here: GetData()"; 
       updateTime = DateTime.Now.AddDays(1); 
      } 
      return data; 
     } 
    } 
} 

String data trình bày dữ liệu thực tế của bạn ở đây. Sau khi thêm lớp này, hãy thay thế các phương thức GetData() của bạn bằng DataCacher.Data.

Hy vọng điều đó sẽ giúp hoặc ít nhất dẫn bạn đến một số suy nghĩ thêm.

8

Bạn có thể sử dụng không gian tên System.Runtime.Caching (hoặc bộ nhớ cache ASP.NET, nhưng đây là cũ hơn và chỉ có thể được sử dụng trong các ứng dụng web).

Đây là một chức năng mẫu mà bạn có thể sử dụng để bọc xung quanh cơ chế truy xuất dữ liệu hiện tại của mình. Bạn có thể thay đổi các tham số trong MemoryCache.Add để kiểm soát mức độ lưu trữ của nó, nhưng bạn đã yêu cầu 24h ở trên.

using System.Runtime.Caching; // At top of file 

public IEnumerable<MyDataObject> GetData() 
{ 
    IEnumerable<MyDataObject> data = MemoryCache.Default.Get(MYCACHEKEY) as IEnumerable<MyDataObject>; 
    if (data == null) 
    { 
     data = // actually get your data from the database here 
     MemoryCache.Default.Add(MYCACHEKEY, data, DateTimeOffset.Now.AddHours(24)); 
    } 
    return data; 
} 

Như đã đề cập bởi @Bond, bạn cũng có thể muốn xem xét sử dụng bộ nhớ cache SQL phụ thuộc nếu dữ liệu bạn đang lưu vào bộ nhớ cache có thể thay đổi trong vòng 24 giờ. Nếu nó khá tĩnh mặc dù, điều này sẽ làm những gì bạn yêu cầu.

+0

Chủ yếu là bị mắc kẹt trên .NET 3.5, tôi đã không nghe nói về điều này. Trông nó thật đẹp - giống như một chiếc hộp được phác thảo. Có thể phân phối trên nhiều máy không? – ken

+0

Nó không phải trên nhiều máy, nó chỉ là một giải pháp trong bộ nhớ. Nó chính xác giống như bộ nhớ cache ASP.NET ('System.Web.Caching') nhưng cũng có sẵn cho các ứng dụng non -ASP.NET. – Richard