2012-04-03 31 views
17

Tôi có một trang web nơi tôi lưu trữ rất nhiều thông tin. Tôi thấy thông tin xung đột xung quanh việc lưu trữ nội dung trong bộ nhớ cache asp.net.Cách hiệu quả nhất để lưu trữ/truy xuất các mục trong asp.net httpContext.Cache

Ví dụ cho phép nói rằng tôi có cấu trúc dữ liệu này:

Dictionary<string, List<Car>> mydictionary; 

Tôi có thể lưu trữ toàn bộ điều với một phím chuỗi như "MyDictionary" và sau đó đi sâu một lần tôi rút ra khỏi đối tượng.

HttpContext.Cache.Add("MyDictionary", 
    mydictionary, 
    null, 
    Cache.NoAbsoluteExpiration, 
    new TimeSpan(10, 0, 0), 
    CacheItemPriority.Normal, 
    null); 

var myDict = HttpContext.Cache["MyDictionary"] as Dictionary<string, List<Car>>; 

Điều khác tôi có thể làm là chia nhỏ và lưu trữ từng mục trong từ điển riêng biệt trong bộ nhớ cache (dù bộ nhớ cache là từ điển).

Dictionary<string, List<Car>> mydictionary; 

foreach (var item in mydictionary.Keys) 
{ 
     HttpContext.Cache.Add(item, mydictionary[item], null, Cache.NoAbsoluteExpiration, new TimeSpan(10, 0, 0), CacheItemPriority.Normal, null); 
} 

var myitem = "test"; 
var myDict = HttpContext.Cache[myItem] as List<Car>; 

có ý nghĩa hiệu suất thể rất khác nhau (cho tôi đang giả định rằng tất cả mọi thứ trong bộ nhớ không?)

+4

Hãy nhớ rằng bộ nhớ đệm có nghĩa là tiết kiệm chi phí tái tạo các đối tượng 'đắt tiền 'thường được sử dụng (tức là chi phí tái tạo vượt quá chi phí bộ nhớ đệm). Nếu bộ nhớ đệm đáng giá, hãy cho phép bộ nhớ cache áp dụng các quy tắc LRU để tối đa hóa hiệu suất. Đặt tất cả các mục vào một mục nhập bộ nhớ cache duy nhất ('MyDictionary') đánh bại LRU, và rủi ro bạn mất toàn bộ rất nhiều nên bộ nhớ cache quyết định rằng giữ MyDictionary là ít hiệu quả hơn so với giữ các mục khác. – Will

Trả lời

14

Thêm câu trả lời bổ sung ở đây vì tôi cảm thấy câu trả lời hiện có là 'cái gì' nhưng không đủ 'lý do'.

Lý do tốt nhất để lưu trữ các mục nhập riêng lẻ trong bộ nhớ cache ít có liên quan đến việc hoàn thiện. Thay vào đó, nó phải làm với việc cho phép hệ thống thực hiện quản lý bộ nhớ thích hợp.

Có rất nhiều logic trong bộ nhớ cache ASP.NET để tìm ra những việc cần làm khi nó chạy vào áp lực bộ nhớ. Cuối cùng, nó cần phải đá ra một số mặt hàng, và nó cần phải làm điều này theo cách ít gây rối nhất có thể. Những mục mà nó chọn để đá ra phụ thuộc rất nhiều cho dù họ đã được truy cập gần đây. Có những yếu tố khác, như những gì cờ được thông qua tại thời gian bộ nhớ đệm. ví dụ. bạn có thể tạo một vật phẩm không thể tháo rời và nó sẽ không bao giờ bị đá ra ngoài.

Nhưng quay trở lại câu hỏi, nếu bạn lưu toàn bộ từ điển của mình dưới dạng một mục, bạn chỉ để lại hai tùy chọn cho ASP.NET quản lý bộ nhớ: giữ toàn bộ điều còn sống, hoặc giết toàn bộ điều. tức là bạn hoàn toàn mất đi lợi ích khi có các mục 'nóng' của mình trong bộ nhớ cache, trong khi các mục hogging bị lỗi truy cập hiếm khi của bạn bị loại bỏ. Nói cách khác, bạn mất bất kỳ mức độ chi tiết bộ nhớ đệm nào.

Tất nhiên, bạn có thể chọn triển khai lược đồ của riêng bạn trong từ điển để xóa các mục hiếm khi được sử dụng. Nhưng tại thời điểm đó bạn đang tái phát minh ra bánh xe, và bánh xe mới của bạn sẽ không hoạt động tốt vì nó sẽ không phối hợp với phần còn lại của hệ thống.

3

Cho đến nay, cách thứ hai là tốt hơn.

Hãy nghĩ đến việc phải cân nhắc nhiều đối tượng. Mỗi khi bạn phải có được 1 giá trị, bạn sẽ chỉ cần có được nó, thay vì lấy từ điển entyre và, từ đó, có được những gì bạn muốn.

Điều này, không saing về các thuật toán được sử dụng trong bộ nhớ cache để ưu tiên các mục được sử dụng nhiều nhất (MRU nếu tôi vẫn nhớ).

Tôi chỉ khuyên bạn nên đo lường hiệu suất đạt được với điều này trước khi áp dụng nó như là triển khai cuối cùng.

7

Như bạn nói, có hai ý kiến ​​phản đối về vấn đề này.

Điều thực sự là các mục trong bộ nhớ cache có thể được lưu trữ ở mức độ chi tiết nhất khi chúng cần thiết. Bằng cách đó, ý tôi là, nếu bạn sử dụng mọi mục nhập trong Từ điển của bạn mỗi khi nó được sử dụng, hãy lưu trữ nó ở cấp độ từ điển.

Nếu bạn chỉ sử dụng một mục từ từ điển và bạn không đi bộ từ điển, hãy lưu trữ chúng ở cấp độ cá nhân.

Vì vậy, nếu bạn xử lý toàn bộ bộ sưu tập dưới dạng một đơn vị, hãy lưu nó thành một đơn vị duy nhất. Nếu bộ sưu tập được truy cập ngẫu nhiên và chỉ một số mục nhất định là cần thiết tại một thời điểm, sau đó lưu trữ nó ở cấp độ mà nó là một đơn vị duy nhất.

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