2013-06-06 12 views
23

Tôi đang nhầm lẫn về thuộc tính AbsoluteExpiration trên CacheItemPolicy.Hết hạn mục được lưu trong bộ nhớ cache qua CacheItemPolicy trong .NET MemoryCache

The MSDN documentation for it nói "Khoảng thời gian phải vượt qua trước khi mục nhập bộ nhớ cache bị xóa." Nó sử dụng một System.DateTimeOffset để xác định "khoảng thời gian".

Nhưng nếu bạn nhìn vào DateTimeOffset's MSDN documentation, nó nói rằng "đại diện cho một điểm trong thời gian ... liên quan đến Giờ quốc tế phối hợp (UTC)". Tham khảo cũng StackOverflow thread này.

Bạn có thấy sự cố không? AbsoluteExpiration mong đợi một "khoảng thời gian" (như 5 giây hoặc 2 giờ), nhưng nó đòi hỏi một đối tượng đại diện cho một "điểm trong thời gian" (như ngày 21 tháng 12 năm 2012, 06:14:00 EST).

Trong mã bên dưới, tôi xác định một chính sách cho tất cả các mục. Tôi muốn mọi mục hết hạn sau cacheExpiryInSeconds giây sau khi chúng được thêm vào. Ai đó có thể xác minh rằng tôi đang làm điều này một cách chính xác?

public class MyCache : IRoutingInfoCache 
{ 
    MemoryCache _routingInfoCache; 
    CacheItemPolicy _cachePolicy; 


    public MyCache(int cacheExpiryInSeconds) 
    { 
     _routingInfoCache = new MemoryCache("myCache"); 
     _cachePolicy = new CacheItemPolicy() { 
      AbsoluteExpiration = 
       new DateTimeOffset(
        DateTime.UtcNow.AddSeconds(cacheExpiryInSeconds)) 
     }; 
    } 


    public void Put(string key, object cacheItem) 
    { 
     // based on how I constructed _cachePolicy, will this item expire 
     // in cacheExpiryInSeconds seconds? 
     _routingInfoCache.Add(new CacheItem(key, cacheItem), _cachePolicy); 
    } 
} 

Trả lời

15

Caching tuân thủ thời gian tính theo giờ UTC để cung cấp các tính toán thời gian thống nhất, vì vậy bạn chỉ định một điểm trong thời gian mà tại đó các entry cache nên hết hạn, trong UTC, và bộ nhớ cache sẽ tính toán sự khác biệt thích hợp từ bây giờ và hết hạn nó như kỳ vọng.

Mã của bạn sẽ không hoạt động như mong đợi kể từ khi hết hạn tuyệt đối của bạn sẽ được trước mục bộ nhớ cache của bạn được nhập một lần cacheExpiryInSeconds giây trôi qua, kết quả ngay lập tức đuổi. Bạn không thể chia sẻ một thể hiện CacheItemPolicy khi AbsoluteExpiration được thiết lập trong tương lai gần, làm phiền tôi biết. :)

+1

bạn đã nhận được 30 giây ở đâu? –

+0

Đó là một sai lầm. Đã chỉnh sửa. – Haney

+1

Tuy nhiên, nếu tôi tạo chính sách bộ nhớ cache (sử dụng mã ở trên)/mỗi lần/tôi thêm một mục thì nó sẽ hoạt động như mong đợi, đúng không? –