Câu hỏi Bộ nhớ cache hoặc từ điển đồng thời?


Tôi đang tìm cách triển khai bộ nhớ đệm ở mức yêu cầu cho một Dịch vụ WCF. Mỗi yêu cầu đối với dịch vụ này thực hiện một số lượng lớn các cuộc gọi cơ sở dữ liệu. Hãy suy nghĩ nhiều người thu thập dữ liệu. Chúng tôi cần cho phép một bộ thu thập dữ liệu truy cập thông tin đã được trình thu thập dữ liệu trước đó truy xuất.

Tôi đang tìm cách sử dụng bộ nhớ cache Bộ nhớ Net 4.0 mới cho việc này bằng cách tạo một cá thể cụ thể theo yêu cầu.

Đây có phải là một ý tưởng tốt ? Hoặc tôi chỉ nên sử dụng một đối tượng từ điển?

BTW: Việc thu thập dữ liệu sẽ song song, vì vậy sẽ có nhiều phức tạp hơn về khóa nhưng tôi có thể sử dụng các bộ sưu tập đồng thời cho điều đó.


22
2017-09-26 06:39


gốc


Cập nhật - Tôi đã quyết định sử dụng bộ sưu tập Đồng thời vì các mô hình của tôi cần tốt hơn bộ nhớ cache mức hệ thống. - Abhinav Gujjar
Khi tôi hiểu lớp MemoryCache, đó là một bộ nhớ cache cấp độ quá trình .. - Legends
hoặc thậm chí cấp AppDomain, chưa thử nghiệm nó. - Legends


Các câu trả lời:


Nếu bạn không cần một loại logic hết hạn, tôi sẽ đề nghị sử dụng các bộ sưu tập đồng thời. Bạn có thể dễ dàng thực hiện cơ chế lưu vào bộ nhớ đệm đơn kết hợp ConcurrentDictionary và Lazy các lớp học. Đây là khác liên kết về sự kết hợp Lazy và ConcurrentDictionary.

Nếu bạn cần các mục của bạn hết hạn, thì bạn nên sử dụng MemoryCache tích hợp sẵn và thực hiện -mẫu khóa được kiểm tra kép để đảm bảo truy xuất một lần các mục trong bộ nhớ cache. Sẵn sàng để thực hiện kiểm tra khóa kép có thể được tìm thấy trong Khóa mẫu để sử dụng đúng cách.


29
2017-09-26 06:55



Ok - Tôi đã suy nghĩ trên cùng một dòng, nhưng tôi vẫn không hiểu "tại sao?" của nó. MemoryCache cung cấp cho tôi một số chức năng bộ nhớ cache cụ thể như AddOrGet. Tôi sẽ mất điều đó khi tôi chuyển sang các bộ sưu tập đồng thời. Chức năng hết hạn có phải là lý do duy nhất để chọn giữa Bộ sưu tập đồng thời so với MemoryCache không? - Abhinav Gujjar
@zync Ý tưởng sử dụng ConcurrentDictionary với Lazy là đảm bảo rằng bạn truy xuất các mục trong bộ nhớ cache một lần cho mỗi miền ứng dụng và bạn không bao giờ thay đổi chúng. Nếu đây không phải là trường hợp MemoryCache thì tốt hơn. Tuy nhiên nếu bạn cần logic truy xuất đơn, sử dụng ConcurrentDictionary thích hợp hơn vì phương thức MemoryCache.AddOrGetExisting cần một giá trị và bạn sẽ vẫn phải thực hiện khóa trong khi lấy giá trị này. Nhưng với ConcurrentDictionary.GetOrAdd (phím TKey, Func <TKey, TValue> valueFactory) kết hợp với Lazy, bạn để lại tất cả những thứ khóa đó vào thư viện framework. - Yiğit Yener
Bằng cách này, nếu các mục trong bộ nhớ cache của bạn được xác định rõ ràng trước khi các dịch vụ của bạn bắt đầu (tức là bạn không nhớ cache) và bạn có thể phân tích tất cả dữ liệu trong bộ nhớ cache một lần, bạn có thể sử dụng hàm tạo tĩnh của các lớp dịch vụ để tải các mục trong bộ nhớ cache đó. Điều này là tốt hơn bởi vì các hàm tạo tĩnh được đảm bảo được thực hiện một lần cho mỗi miền ứng dụng và trước bất kỳ hàm tạo nào của thực thể được thực thi kiểu đó. Nó đơn giản. - Yiğit Yener