2011-11-05 2 views
19

Tôi đang sử dụng bộ nhớ cache được cung cấp bởi System.Runtime.Caching.MemoryCache.Tôi có thể lặp qua .NET4 MemoryCache không?

Tôi muốn liệt kê trên mục của bộ nhớ cache để tôi có thể làm mất hiệu lực (đuổi sau đó tải lại) các mặt hàng như vậy

foreach (var item in MemoryCache.Default) { item.invalidate() } 

Nhưng các tài liệu chính thức found here nhà nước:

Quan trọng: Việc truy xuất một điều tra viên cho một cá thể MemoryCache là một hoạt động chặn và chặn tài nguyên . Do đó, điều tra viên nên không được sử dụng trong các ứng dụng sản xuất.

Chắc chắn phải có một cách đơn giản và hiệu quả để lặp qua các mục của bộ nhớ cache?

+0

Có thể bằng cách nào đó bạn cần biết ADVANCE những thứ trong bộ nhớ cache ... Nhưng điều này có nghĩa là sử dụng một mảng hoặc một thứ gì đó. – sinni800

+0

Vâng, đó là những gì tôi đang làm bây giờ, nhưng đó là điên vì nó có nghĩa là tôi đang theo dõi những gì bộ nhớ cache đã được theo dõi! :) –

+0

Chính xác. Nhưng nếu bộ nhớ cache giữ một lượng lớn dữ liệu và mảng của bạn chỉ có thông tin để REACH dữ liệu đó nắm giữ tốt. – sinni800

Trả lời

9

Đề xuất thực hiện cho đến nay vẫn tuyệt vời, nhưng nhu cầu của tôi vẫn như đã nêu: để lặp qua các mục trong bộ nhớ cache. Nó có vẻ như một nhiệm vụ đơn giản như vậy, và tôi hy vọng rằng bộ nhớ cache trong nội bộ có một số loại cấu trúc danh sách anyway. Các tài liệu và tính năng được đặt cho MemoryCache là mong muốn.

Vì vậy, như đã thảo luận ở trên, tôi đã thêm danh sách vào lớp bộ điều hợp bộ nhớ cache của mình, chứa tham chiếu đến từng mục tôi đặt trong bộ nhớ cache. Nếu tôi cần phải lặp qua bộ nhớ cache - không chỉ để vô hiệu hóa, mà còn để thu thập số liệu thống kê, v.v.-- sau đó tôi lặp lại danh sách của mình.

Nếu số lượng mục được đặt trong bộ nhớ cache không thay đổi, thì đây là giải pháp hợp lý. Nếu số này thay đổi, thì bạn cần phải chèn/xóa thông qua lớp bộ điều hợp, để giữ cho danh sách được đồng bộ với bộ nhớ cache thực. Lộn xộn nhưng nó hoạt động, và tránh những hình phạt perf perfuded trong tài liệu.

Hy vọng rằng MemoryCache nhà cung cấp bộ nhớ cache sẽ được cung cấp trong bản phát hành nền tảng tiếp theo.

+0

Hehe, tôi đã quá chậm :). Đừng lo lắng! – sinni800

+1

Cuối cùng tôi đã nhận ra lý do tại sao lớp học được viết theo cách của nó. Khi lặp qua bộ nhớ cache, bạn có thể gặp phải tình trạng cuộc đua vì một mục bị đuổi ra trong quá trình lặp lại! Vì vậy, bạn cần phải khóa bộ nhớ cache. NHƯNG, nếu bạn có trường hợp sử dụng, như tôi đã làm, nơi bạn đặt các mục không bao giờ hết hạn, thì điều này không áp dụng được (tất nhiên các mục của tôi có thể bị trục xuất vì bộ nhớ thấp, nhưng đó là trường hợp biên giới nếu bộ nhớ cache của bạn là nhỏ và bạn đang sử dụng một máy chủ hiện đại). –

+0

Ghi chú khác. Điều này khiến tôi nghĩ rằng giải pháp của tôi thực sự khá * nguy hiểm * và có thể là ngu ngốc. Nó là hợp lý hơn nhiều để chấp nhận các hit perf, và cho phép MemoryCache được khóa trong thời gian lặp lại - hoặc sử dụng một số cách khác để vô hiệu hóa tất cả các mục của nó. Nếu bộ nhớ cache không bị vô hiệu hóa thường xuyên, sau đó nó tốt để chỉ sống với hit perf: chỉ cần nghĩ về thời gian cần để làm ấm một bộ nhớ cache - làm mất hiệu lực toàn bộ điều là không khác nhau. Tuy nhiên, các tài liệu làm cảnh báo không sử dụng điều tra trong mã sản xuất: Tôi tự hỏi tại sao? Có lẽ có những vấn đề khác mà tôi không biết? –

1

Cân nhắc sử dụng ChangeMonitors, cho phép bạn tự động gỡ bỏ mục nhập cũ khi đáp ứng một số điều kiện nhất định.

Xem Is there some sort of CacheDependency in System.Runtime.Caching?

này tương tự như System.Web.Caching CacheDependencys, ai cho phép bạn để đuổi mục khi các tập tin hoặc mục cache khác thay đổi.

-2

Trong năm 2014,

Đây là cách chính xác để có được tất cả các mục:

Dim AllItems = MemoryCache.Default.Select(Of ItemType)(Function(O) O.Value)

Hope this helps một ai đó.

+2

Downvote. Điều này giống như 'liệt kê' các mục trong bộ nhớ đệm mà OP nêu trong tài liệu chính thức là 'tốn nhiều tài nguyên' và nên tránh. Xem [Vấn đề với liệt kê] (http://stackoverflow.com/a/22388943/219516). – publicgk

+0

Xin lỗi @publicgk Tôi đã không đọc câu hỏi hoàn toàn. – Dejisys