2011-02-08 13 views
13

Tôi đang sử dụng không gian tên bộ đệm .NET 4.0 mới: System.Runtime.Caching.Làm thế nào để kiểm tra các chính sách bộ đệm ẩn bên trong System.Runtime.Caching.ObjectCache?

Bây giờ, tôi chỉ đang làm một số nguyên mẫu/không quan trọng với API mới, để tìm ra cách phù hợp nhất cho ứng dụng thực.

Phù hợp với điều đó, tôi đang cố gắng để tạo ra một trang (ASP.NET MVC) mà về cơ bản bãi ra tất cả mọi thứ trong bộ nhớ cache, đặc biệt là các thông tin sau:

  • cache chính
  • cache Object
  • cache chính sách (ngày hết hạn, vv)
  • Dependencies cache (nếu có)

Tuy nhiên, tôi dường như không thể có được bất cứ điều gì ngoại trừ khóa/đối tượng.

Dưới đây là đoạn code tôi hiện đang chơi với:

public ActionResult Index() 
{ 
    var cache = MemoryCache.Default; 

    // i can get the list of cache keys like this: 
    var cacheKeys = cache.Select(kvp => kvp.Key).ToList(); 

    // i can also get a strongly-typed "CacheItem" like this: 
    CacheItem item = cache.GetCacheItem("someKey"); 

} 

tôi sẽ hy vọng lớp "CacheItem" sẽ phơi bày những thông tin tôi yêu cầu (hết hạn, phụ thuộc, vv - ít nhất là "thu khí") .

Nhưng không. Tất cả những gì nó có là thuộc tính cho khóa, giá trị và tên vùng.

Làm cách nào tôi có thể kiểm tra các mục trong bộ nhớ cache và nhổ thông tin tôi yêu cầu?

Có không gian tên/lớp tôi đang thiếu không?

EDIT

Hình như có một lớp ChangeMonitor, nhưng một lần nữa - điều này không cho thông tin hết hạn, nó chỉ cho phép bạn đăng ký vào các sự kiện khi mục bộ nhớ cache được loại bỏ.

phải là cách để chỉ lấy các mục trong bộ nhớ cache và khi chúng hết hạn.

EDIT 2

Không biết nếu điều này nên là một câu hỏi riêng biệt, mà còn - tôi bối rối như những gì cuộc đời tôi nên cho ObjectCache tôi. MSDN nói nó không phải là một singleton, và bạn có thể tạo ra nhiều cá thể ObjectCache. Điều đó có nghĩa là gì mặc dù, tôi phải sử dụng một singleton hoàn toàn bị khóa khi truy cập vào dụ ObjectCache?

Trả lời

9

Nó không nhìn vào tôi rằng có một cách để lấy CacheItemPolicy một khi nó đã được thêm vào bộ sưu tập bộ nhớ cache. Cách tốt nhất xung quanh điều này là có thể nghĩ đến là để đệm đối tượng chính sách cùng với mục bạn muốn lưu vào bộ nhớ cache nhưng chỉ thêm "Chính sách" vào tên khóa để sau này bạn có thể truy lục chính sách. Điều này rõ ràng giả định bạn có quyền kiểm soát thực sự thêm mục vào bộ nhớ cache ở nơi đầu tiên. Ví dụ bên dưới:

public ActionResult Index() 
    { 
     string key = "Hello"; 
     string value = "World"; 

     var cache = MemoryCache.Default; 
     CacheItemPolicy policy = new CacheItemPolicy(); 
     policy.AbsoluteExpiration = DateTime.Now.AddDays(1); 
     cache.Add(new CacheItem(key, value), policy); 
     cache.Add(new CacheItem(key + "Policy", policy), null); 

     CacheItem item = cache.GetCacheItem(key); 
     CacheItem policyItem = cache.GetCacheItem(key + "Policy"); 
     CacheItemPolicy policy2 = policyItem.Value as CacheItemPolicy; 

     ViewBag.Message = key + " " + value; 

     return View(); 
    } 
+0

Yup, tôi đã nghĩ về điều này.Có lẽ chỉ cho prototyping, tôi sẽ làm điều này - sau đó thay đổi mã trở lại bình thường khi im hoàn thành. Tuy nhiên, tôi đã hy vọng cho một chương trình theo dõi bộ nhớ cache nhẹ trên máy chủ sống - có vẻ như nó sẽ không thể. – RPM1984