2009-11-24 35 views
12

Tôi đang cố gắng lưu trữ giá trị bằng cách sử dụng HttpRuntime.Cache.Insert(), nhưng chỉ xuất hiện để giữ giá trị trong một vài giờ hoặc một cái gì đó trước khi xóa nó ra . Tôi đang làm gì sai? Tôi muốn giá trị ở lại trong bộ nhớ cache trong 3 ngày.C# HttpRuntime.Cache.Insert() Không giữ giá trị được lưu trong bộ nhớ cache

HttpRuntime.Cache.Insert(CacheName, Price, null, DateTime.Now.AddDays(3), TimeSpan.Zero); 
+0

Làm cách nào để xác minh rằng nó đã bị xóa? –

+0

@ J.W. : Cache [CacheName] sẽ là null nếu mục nhập đã bị xóa/hết hạn. – RickNZ

Trả lời

31

Câu trả lời ngắn

Hồ bơi hoặc trang web ứng dụng của bạn sắp bị tắt quá sớm. Mở rộng thời gian chờ nhàn rỗi trên trang web, kéo dài tuổi thọ của ứng dụng cho hồ bơi chạy trang web. Tăng cấp phát bộ nhớ và yêu cầu giới hạn.

Full câu trả lời

Nếu bạn muốn biết khi nào và tại sao một cái gì đó đã được loại bỏ khỏi bộ nhớ cache, bạn cần phải đăng nhập việc loại bỏ mục bằng cách sử dụng CacheItemRemovedCallback tùy chọn trên chèn ... Sau đó, bạn có thể đăng nhập lý do sử dụng đối số CacheItemRemovedReason.Do đó bạn có thể đăng nhập lý do là một trong bốn lý do được liệt kê:

  1. Removed Các mục được lấy ra từ bộ nhớ cache bởi một cuộc gọi Remove phương pháp hoặc bằng một lời gọi phương thức Insert rằng quy định chìa khóa tương tự.
  2. Hết hạn Mục này bị xóa khỏi bộ nhớ cache vì đã hết hạn.
  3. Đã sử dụng Mục này bị xóa khỏi bộ nhớ cache vì hệ thống đã xóa mục đó để giải phóng bộ nhớ.
  4. DependencyChanged Mục này bị xóa khỏi bộ nhớ cache vì phụ thuộc bộ nhớ cache được liên kết với nó đã thay đổi.

Thông thường, bạn sẽ thấy Hết hạn và Bị lạm dụng là lý do cho những điều không có giải thích Xóa cuộc gọi được thực hiện đối với bộ nhớ cache và không có phụ thuộc.

Bạn có thể sẽ tìm hiểu, trong khi truy tìm thông qua nội dung thú vị này, rằng các mục của bạn không bị hết hạn hoặc không được sử dụng. Thay vào đó, tôi nghi ngờ bạn sẽ thấy rằng AppDomain đang được dỡ xuống.

Một cách có thể xảy ra do tệp web.config (hoặc thư mục bin hoặc .aspx, v.v.) bị thay đổi. Để biết thêm thông tin về thời điểm điều này xảy ra, hãy xem phần Khởi động lại ứng dụng của this page. Khi điều đó xảy ra, các yêu cầu hiện đang chờ xử lý sẽ bị cạn kiệt, bộ nhớ cache đã làm trống và AppDomain sẽ được tải xuống. Bạn có thể phát hiện tình huống này bằng cách kiểm tra AppDomain.IsFinalizingForUnload và ghi nhật ký trong khi gọi lại.

Một lý do khác cho AppDomain để tái chế là khi IIS quyết định tái chế AppPool vì bất kỳ lý do nào mà nó đã được cấu hình. Ví dụ về được xxx bộ nhớ đã được phân bổ qua các đời, yyy giây của thời gian chạy cho AppPool, ttt theo lịch trình thời gian tái chế, hoặc iiii thời gian nhàn rỗi (không yêu cầu gửi đến). Để biết thêm chi tiết, hãy kiểm tra this article for IIS6 hoặc this article for IIS7

+0

Tôi đã gặp sự cố này và không thể nhận được iis express để ngừng khởi động lại ứng dụng, thật lạ lùng đây chỉ là vấn đề đối với các dự án mvc. Tôi đã nâng cấp lên đầy đủ và vấn đề đã biến mất. – Jimmy

+1

Câu trả lời hay và tên người dùng tuyệt vời! – theycallmemorty

1

Kiểm tra thời gian tái chế trên Hồ bơi ứng dụng của bạn.

4

Tài liệu http://msdn.microsoft.com/en-us/library/4y13wyk9.aspx nói rằng Cache.NoSlidingExpiration phải được sử dụng nếu sử dụng hết hạn tuyệt đối.

HttpRuntime.Cache.Insert(CacheName, Price, null, DateTime.Now.AddDays(3), Cache.NoSlidingExpiration); 

điều này có thể không phải là vấn đề của bạn, mặc dù tôi chỉ thấy rằng Cache.NoSlidingExpiration phải giống như TimeSpan.Zero.

Tiếp theo, tôi sẽ kiểm tra xem hồ bơi ứng dụng của bạn chưa hết hạn chưa và kiểm tra lượng bộ nhớ cache bạn đang sử dụng. Nếu đó là một trang lưu lượng truy cập cao sử dụng nhiều bộ nhớ (tức là bộ nhớ cache) thì nó sẽ hết hạn các mục trong bộ nhớ cache vì bộ nhớ là cần thiết cho những thứ khác.

cũng kiểm tra nhận xét cuối cùng tại đây http://bytes.com/topic/net/answers/717129-c-asp-net-page-cache-getting-removed-too-soon có người dường như đã tìm thấy giải pháp cho vấn đề của bạn.

+0

Điều này đã giúp tôi trong một câu hỏi không liên quan. Cảm ơn! – klkitchens

0

Theo mặc định, các mục được thêm vào bộ nhớ cache không hết hạn, vì vậy đây chắc chắn là một cái gì đó bên ngoài bộ nhớ cache. Tôi đồng ý với Josh, bạn nên kiểm tra thời gian tái chế trên App Pool của bạn.

Kiểm tra trang này để xem ví dụ về cách bạn có thể thêm đại biểu để cho bạn biết chính xác khi nào mục của bạn đang bị xóa khỏi bộ nhớ cache. Điều này có thể giúp bạn trong việc xử lý sự cố nếu nó không phải là App bơi của bạn:

http://msdn.microsoft.com/en-us/library/system.web.caching.cache.add.aspx

~ md5sum ~

5

Đối tượng bộ nhớ cache không đảm bảo rằng nó sẽ giữ được đối tượng được lưu trữ ở tất cả, ít nhiều cho các toàn bộ thời gian mà bạn đề xuất.

Nếu bạn muốn khuyến khích mạnh mẽ hơn để làm như vậy, bạn có thể đặt CacheItemPriority.High hoặc CacheItemPriority.NotRemovable khi bạn chèn một mục vào Cache. Với mức ưu tiên bình thường mặc định, thời gian chạy có một chính sách khá tích cực để loại bỏ các đối tượng khi áp lực bộ nhớ tăng lên.

Trên hết, theo mặc định, IIS AppPool sẽ tái chế một lần/ngày hoặc lâu hơn, điều này sẽ xóa mọi thứ trong Cache.

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