2013-06-25 15 views
5

Tôi có một hệ thống cấp phép khá phức tạp sử dụng sáu bảng cơ sở dữ liệu và để tăng tốc, tôi muốn lưu các bảng này vào bộ nhớ thay vì phải nhấn vào cơ sở dữ liệu mỗi lần tải trang.Làm thế nào để cache dữ liệu cơ sở dữ liệu vào bộ nhớ để sử dụng bởi ứng dụng MVC?

Tuy nhiên, tôi cần cập nhật bộ nhớ cache này khi người dùng mới được thêm hoặc quyền được thay đổi. Tôi không chắc chắn làm thế nào để đi về việc này trong bộ nhớ cache, và làm thế nào để cập nhật nó một cách an toàn mà không gây ra vấn đề nếu truy cập của nó cùng một lúc như cập nhật

Có ai có một ví dụ về làm thế nào để làm một cái gì đó như thế này hoặc có thể chỉ cho tôi đi đúng hướng để nghiên cứu?

+0

Caching 6 bảng không giống như ý tưởng hay. –

+0

trùng lặp [Caching trong C# /. Net] (http://stackoverflow.com/questions/1276569/caching-in-c-net) – Romoku

Trả lời

0

Cơ sở dữ liệu có truy cập vào mọi trang tải là vấn đề hay là nó tham gia sáu bảng là vấn đề?

Nếu chỉ là tham gia chậm, tại sao không tạo bảng cơ sở dữ liệu tóm tắt dữ liệu theo cách dễ dàng hơn và nhanh hơn để truy vấn?

Bằng cách này, bạn chỉ cần cập nhật bảng tóm tắt của mình mỗi khi bạn thêm người dùng hoặc cập nhật quyền. Nếu bạn nhóm tất cả điều này thành một giao dịch, bạn không nên gặp sự cố với dữ liệu không đồng bộ hóa.

0

Bạn có thể sử dụng đối tượng Cache được tích hợp trong ASP.Net. Dưới đây là một số article giải thích cách thực hiện.

1

Nếu không biết thêm về cấu trúc của ứng dụng, có rất nhiều tùy chọn có thể. Một tùy chọn như vậy có thể là trừu tượng truy cập dữ liệu phía sau một giao diện kho lưu trữ và xử lý bộ nhớ đệm trong bộ nhớ trong kho lưu trữ đó. Một cái gì đó đơn giản như một IEnumerable<T> riêng trên đối tượng kho lưu trữ.

Ví dụ: giả sử bạn có đối tượng User chứa thông tin về người dùng (tên, quyền, v.v.). Bạn sẽ có một số UserRepository với một số phương pháp tìm nạp/lưu cơ bản trên đó. Bên trong kho lưu trữ đó, bạn có thể duy trì một static tĩnh HashSet<User> chứa các đối tượng User đã được truy lục từ cơ sở dữ liệu.

Khi bạn tìm nạp User từ kho, trước tiên hãy kiểm tra HashSet để đối tượng quay lại và nếu không tìm thấy nó từ cơ sở dữ liệu, hãy thêm nó vào HashSet, sau đó trả về. Khi bạn lưu User, nó sẽ cập nhật cả HashSet và cơ sở dữ liệu.

Một lần nữa, không biết các chi tiết cụ thể của bộ mã và thiết kế tổng thể, thật khó để đưa ra một câu trả lời cụ thể hơn. Tuy nhiên, đây phải là một giải pháp chung đủ để làm việc trong bất kỳ ứng dụng nào.

0

Tôi có thể đề xuất dữ liệu bộ nhớ cache như vậy trong Application state object. Để sử dụng an toàn cho chủ đề, hãy xem xét sử dụng lock operator. Mã của bạn sẽ giống như thế này:

public void ClearTableCache(string tableName) 
{ 
    lock (System.Web.HttpContext.Current) 
    { 
     System.Web.HttpContext.Current.Application[tableName] = null; 
    }   
} 

public SomeDataType GetTableData(string tableName) 
{ 
    lock (System.Web.HttpContext.Current) 
    { 
     if (System.Web.HttpContext.Current.Application[tableName] == null) 
     { 
      //get data from DB then put it into application state 
      System.Web.HttpContext.Current.Application[tableName] = dataFromDb; 
      return dataFromDb; 
     } 
     return (SomeDataType)System.Web.HttpContext.Current.Application[tableName]; 
    }    
} 
1

tôi sẽ bộ nhớ cache mặt hàng như bạn sử dụng nó, có nghĩa là trên lớp dữ liệu của bạn khi bạn đang nhận được cho bạn dữ liệu sao lưu bạn kiểm tra bộ nhớ cache của bạn nếu nó có sẵn ở đó nếu không bạn đi vào cơ sở dữ liệu và lưu trữ kết quả sau.

public AccessModel GetAccess(string accessCode) 
{ 
    if(cache.Get<string>(accessCode) != null) 
      return cache.Get<string>(accessCode); 

    return GetFromDatabase(accessCode); 
} 

Sau đó, tôi sẽ nghĩ tiếp theo về chiến lược bộ nhớ cache không hợp lệ. Bạn có thể theo hai cách:

Một thiết bị sẽ hết hạn sau 1 giờ và sau đó bạn chỉ cần nhấn cơ sở dữ liệu một lần trong một giờ.

Hoặc làm mất hiệu lực bộ nhớ cache bất cứ khi nào bạn cập nhật dữ liệu. Điều đó chắc chắn là tốt nhất nhưng phức tạp hơn một chút.

Hy vọng điều đó sẽ hữu ích.

Lưu ý: bạn có thể sử dụng ASP.NET Cache hoặc giải pháp khác như memcached tùy thuộc vào cơ sở hạ tầng của bạn

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