2012-06-13 26 views
8

Có bất kỳ thay thế/triển khai chung nào cho MemoryCache không?Cài đặt chung của System.Runtime.Caching.MemoryCache

Tôi biết rằng MemoryCache sử dụng Hashtable dưới mui xe, vì vậy tất cả những gì cần thực hiện là chuyển sang sử dụng từ điển <,>, là phiên bản chung của một Hashtable.

Điều này sẽ cung cấp loại an toàn và cung cấp các lợi ích hiệu suất như không có quyền anh/unboxing.

EDIT: Một điều tôi quan tâm là có loại khóa khác. Mặc định là System.String.

+0

Nhưng bạn sẽ chỉ có thể để cache một loại? Tôi sẽ không lo lắng về chi phí này quá nhiều, phần boxing sẽ rất không đáng kể về các loại giá trị nguyên thủy. –

+0

@AdamHouldsworth: Có, đó là dự định.Tôi đang gói bộ nhớ cache trên một bản đồ cơ sở dữ liệu với trượt hết hạn mà chỉ trả về một loại. – caesay

+0

Đó có phải là loại giá trị không? –

Trả lời

13

Có bất kỳ thay thế/triển khai chung nào cho MemoryCache không?

Không có trong thư viện lớp cơ sở. Bạn sẽ phải cuộn của riêng bạn, mặc dù tôi, cá nhân, sẽ chỉ làm cho một wrapper xung quanh MemoryCache cung cấp các API bạn muốn.

Điều này sẽ cung cấp loại an toàn và đem lại lợi ích hiệu suất như không boxing/unboxing

Sự an toàn loại có thể bị xử lý khá dễ dàng trong một lớp wrapper. Việc đánh boxing/unboxing sẽ chỉ là vấn đề nếu bạn đang lưu trữ các loại giá trị (không phải lớp), và thậm chí sau đó, có thể sẽ là tối thiểu, vì không chắc bạn đang đẩy và kéo bộ nhớ cache thường đủ để có được hiệu suất thực sự vấn đề.

Vì an toàn và khả năng sử dụng, tôi đã thực sự viết các phương thức của riêng mình để bao bọc các cuộc gọi của mục MemoryCache trong phương thức chung , cho phép sử dụng tốt hơn một chút từ quan điểm API. Điều này rất dễ dàng - thường chỉ yêu cầu một phương pháp như:

public T GetItem<T>(string key) where T : class 
{ 
    return memoryCache[key] as T; 
} 

Tương tự, bạn có thể tạo phương pháp để đặt giá trị theo cùng một cách.

EDIT: Một điều tôi quan tâm là có loại khóa khác. Mặc định là System.String.

Điều này không được hỗ trợ trực tiếp với MemoryCache, vì vậy nó sẽ yêu cầu một chút công bằng để tạo ra thế hệ khóa của riêng bạn. Một tùy chọn sẽ là tạo một trình bao bọc an toàn loại mà cũng cung cấp một Func<T, string> để tạo khóa chuỗi dựa trên giá trị của bạn - điều này cho phép bạn tạo mục nhập bộ nhớ cache cho bất kỳ loại nào T. Bạn sẽ phải cẩn thận, tất nhiên, để bao gồm tất cả dữ liệu trong chuỗi mà bạn muốn như một phần của so sánh của bạn, tuy nhiên.

+0

Tôi nghĩ rằng boxing/unboxing là một mối quan tâm hợp lệ - nếu bạn đang thực sự bộ nhớ đệm các loại giá trị. Một trong những lý do chính để sử dụng cache là vì bạn đang tính giá trị với tần số cao. Do đó nó sẽ là một tình huống phổ biến cho một bộ nhớ cache được nhận được nhấn rất nhiều. Có thể bị đánh đủ để làm boxing đắt tiền là một trường hợp bất thường, nhưng nó phụ thuộc vào mức độ nhạy cảm của ứng dụng của bạn đối với áp lực GC –

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