2012-06-11 36 views
8

Để gọn gàng, bộ nhớ cache trong bộ nhớ SIMPLE tồn tại trong hệ sinh thái Net..Net Bộ nhớ trong bộ nhớ đơn giản

Những gì tôi đang tìm kiếm là:

  • Không cấu hình (trừ các cuộc gọi API đơn giản). Tôi không muốn gây rối với các tập tin cấu hình bên ngoài vì chúng chỉ phức tạp triển khai.
  • Cùng một quy trình (không phải một số quy trình hoặc máy chủ bên ngoài). Ưu tiên sử dụng được tạo ra dễ dàng như
    var myCache = new SimpleCache(1024 * 1024 * 100); // 100 MB
  • giới hạn Bộ nhớ rõ
  • Items xóa từ bộ nhớ cache dựa trên ít nhất sử dụng
  • Time-based hết hạn (không bắt buộc, nhưng làm cho nó có khả năng hữu ích trong các tình huống khác)
  • trình với Net 3,5

tôi đã reasearched các tùy chọn này:

  • ASP.Net System.Web.Caching
    • API của nó không hỗ trợ bất kỳ loại kiểm soát nào đối với kích thước bộ nhớ cache, cũng như không ưu tiên dựa trên mức sử dụng. Do đó bạn hoàn toàn ở lòng thương xót của nó như khi nó quyết định có đủ áp lực bộ nhớ để làm trống bộ nhớ cache.
  • System.Runtime.Caching
    • Không một tùy chọn như thế này là đã được bổ sung trong Net 4.0, và sau này dường như chỉ ra nó có hiệu suất kém: Performance of system.runtime.caching
  • Microsoft Enterprise Library - Caching Block
    • Khác với danh tiếng nặng ký, tôi không thích cấu hình của nó bằng cách sử dụng tệp XML hoặc app.config. Hơn nữa, trong khi nó hỗ trợ giới hạn kích thước của bộ đệm dựa trên NUMBER đối tượng được lưu trữ, nó không có cơ chế để hạn chế SIZE của các đối tượng đó.
  • NCache
    • Có lẽ hơi quá đáng đối với trường hợp sử dụng tôi muốn, nhưng quan trọng nhất là nó là một sản phẩm trả tiền mà không phải là điều mà tôi muốn làm thỏa thuận với (so với tôi chỉ viết một trong một ngày hoặc hai). Như thường lệ, ấn bản tốc hành của nó có giới hạn sử dụng làm nản lòng việc sử dụng nó cho bất kỳ mục đích sản xuất nào.
  • memcached
    • ngược lại chính xác những gì tôi muốn (bên ngoài quá trình phân phối)

tôi đang làm việc với Nghị định thư Buffers Google (protobuf-net), vì vậy tôi DO có một ước lượng tương đối chính xác của dấu chân bộ nhớ của mỗi mục. Tôi đang lưu vào bộ nhớ đệm dữ liệu từ truy cập cơ sở dữ liệu, nhưng tôi không có mong muốn sử dụng một ORM chính thức (tôi thực sự đang sử dụng PetaPoco, nhưng đó là bên cạnh điểm).Ở giai đoạn này, tôi đang lên kế hoạch triển khai bộ nhớ cache của riêng mình, sử dụng danh sách liên kết kép và băm (từ điển) để cung cấp cho các mục được sử dụng gần đây nhất từ ​​bộ nhớ cache khi đạt đến giới hạn bộ nhớ cache. Tuy nhiên, tôi muốn kiểm tra xem liệu có ai biết về bất kỳ lựa chọn phù hợp nào trước khi tôi tự mình lăn.

+1

Điều này không bao giờ đơn giản, bộ nhớ cache không có chính sách hết hạn tốt là rò rỉ bộ nhớ. Không thích những gì có sẵn luôn là động lực số một để xây dựng của riêng bạn. –

+0

Thay vì chính sách hết hạn, tôi muốn chỉ định dung lượng bộ nhớ tối đa cần thiết. Bạn thực sự không thể đo được bao nhiêu đối tượng bộ nhớ đang chiếm .Net, nhưng các bộ đệm giao thức mà tôi đang sử dụng có một phép đo hợp lý hữu ích. –

+0

Nếu bạn phát triển điều này là một bộ nhớ cache khá chung chung, thì có lẽ bạn có thể đặt nó trên CodeProject hoặc tương tự, để người khác sử dụng? Nên khá đơn giản để có được một nguyên mẫu đơn giản với nhau và rất đơn giản để có được vùng phủ sóng thử nghiệm cao. – Michael

Trả lời

1

Điều gì về các tính năng lưu trong bộ nhớ cache trong AppFabric cho Windows Server? Hãy thử một lần ! http://msdn.microsoft.com/en-us/windowsserver/ee695849.aspxhttp://msdn.microsoft.com/en-us/library/hh334364.aspx

Nhưng nếu không có sản phẩm nào trên thị trường cung cấp hành vi mong muốn, bạn sẽ phải triển khai lớp bộ nhớ đệm tùy chỉnh của riêng bạn bằng cách sử dụng Mẫu thiết kế.

+0

khái niệm tốt đẹp, tôi đã yêu nó! +1! –

+0

Thật tuyệt khi thấy một tùy chọn mà tôi chưa xem xét, và cũng tốt đẹp mặc dù nó có vẻ hướng tới cấu hình XML, nó có các tùy chọn cấu hình có lập trình tương đương. Tuy nhiên, nó không phải là những gì tôi đang tìm kiếm vì nó dường như không cung cấp khả năng hạn chế dựa trên việc sử dụng bộ nhớ. Hạn chế một bộ nhớ cache theo số đối tượng là khá vô ích bởi vì những đối tượng có thể là gốc của tress tiêu thụ 1 KB mỗi hoặc 1 GB mỗi. –

1

Nó là khá cũ, nhưng tôi giống như những gì bạn đang nói về

Generic cache with memory consumption

và đây là một SO với một kịch bản có liên quan:

performance of system runtime caches

+0

+1 bởi vì đây thực sự là bài viết tôi đã đọc hai tháng trước, cung cấp cơ sở cho việc thiết kế của riêng tôi. Tôi đã không xem xét mã nguồn đầy đủ, nhưng bài báo là một điểm khởi đầu tốt. –

3

Vì vậy, những gì đã làm bạn kết thúc lên làm với bộ nhớ cache?

Tôi có một nguyên mẫu của Universal Cache mà tôi đã làm việc trên đó khá nhiều những gì bạn muốn ngoại trừ giới hạn bộ nhớ cache là dung lượng (số lượng mục) thay vì sử dụng bộ nhớ nhưng nó có một tính năng bổ sung mà bạn có thể đánh giá cao: độ bền cục bộ.

Bộ nhớ cache được cấu trúc theo lớp nơi bạn có thể có một lớp: bộ nhớ, một lớp kép: bộ nhớ + độ bền cục bộ hoặc lớp ba: bộ nhớ + độ bền cục bộ + chia sẻ mạng. Bạn có thể sử dụng bất kỳ sự kết hợp của các lớp như bạn cần. Mặc dù chia sẻ mạng được thiết kế như một dịch vụ truy cập từ xa .net có thể được cài đặt trên bất kỳ máy tính nào trên mạng và có thể tự phát hiện được bởi bộ đệm ứng dụng khách chưa hoạt động.

Bộ đệm là các lớp chung được truy cập qua giao diện ICache < TKey, TValue >. Bộ nhớ cache liên tục cục bộ sử dụng SQL Express Compact 4 để tạo cơ sở dữ liệu và bảng trực tuyến có tất cả các trường của TKey, dấu thời gian và TValue được tuần tự hóa thành cột Hình ảnh. Trong trường hợp cấu hình nhiều lớp, khi bạn sử dụng phương thức TryGetValue (khóa TKey, giá trị TValue) trên bộ đệm mức cao nhất, nếu lớp đầu tiên (bộ nhớ đệm) không có mục nó kiểm tra nội bộ với lớp tiếp theo (liên tục cục bộ), sau đó tiếp theo ... cho đến khi không có bộ nhớ cache nào có sẵn để cung cấp dữ liệu. Khi bộ nhớ cache loại bỏ một mục, nó cho phép bộ nhớ cache tiếp theo của opprtunity thêm mục vào lớp của nó để trong trường hợp bộ nhớ cache liên tục, dữ liệu được lưu trữ cho các yêu cầu trong tương lai.

Bộ đệm có thông số thời gian lưu do người dùng xác định (nghĩa là vài phút cho bộ nhớ cache, 30 ngày cho bộ nhớ cache liên tục cục bộ) và dung lượng.

Tôi có thể đăng nó dưới dạng mã miền công cộng nếu ai đó quan tâm.

+2

Bạn nên đăng mã bạn đề cập ở đây. –

0

Kiểm tra MemoryCache và bài viết này trên CodeProject về cách sử dụng MemoryCache.

+0

Nó có hoạt động với 3,5 không? Nó có vẻ là khung 4.0. –

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