2008-09-20 32 views
13

Câu hỏi này là về sự khác biệt giữa ReadWrite và NonStrictReadWrite cache các chiến lược đồng thời cho bộ nhớ cache cấp hai của NHibernate.Các chiến lược tương thích với bộ nhớ cache chính xác và không hạn chế

Như tôi đã hiểu, sự khác biệt giữa hai chiến lược này có liên quan khi bạn có một bộ đệm được phân bổ - không đảm bảo rằng một bộ nhớ cache có cùng giá trị với bộ nhớ cache khác, trong khi đọc/ghi nghiêm ngặt - giả sử nhà cung cấp bộ nhớ cache thực hiện khóa phân phối thích hợp.

Phần tôi không hiểu là sự khác biệt nghiêm ngặt và không nghiêm ngặt có liên quan như thế nào khi bạn có một bộ nhớ cache hoặc một bộ nhớ cache được phân bổ được phân bổ (không nhân rộng). Nó có liên quan không? Dường như với tôi rằng trong các trường hợp không được nhân bản, bộ nhớ cache timestamps sẽ đảm bảo rằng các kết quả cũ không được phục vụ. Nếu nó có thể có liên quan, tôi muốn xem một ví dụ.

Trả lời

18

Điều bạn cho là đúng, trong một môi trường mục tiêu/chủ đề có ít sự khác biệt. Tuy nhiên nếu bạn nhìn vào các nhà cung cấp bộ nhớ cache có một chút xảy ra ngay cả trong một kịch bản đa luồng.

Cách đối tượng được lưu trữ lại từ trạng thái đã sửa đổi của nó là khác nhau ở mức độ không nghiêm ngặt. Ví dụ: nếu đối tượng của bạn có nhiều tải lại nhưng bạn muốn nó sau khi cập nhật thay vì đặt chân người dùng tiếp theo với hóa đơn, thì bạn sẽ thấy hiệu suất khác nhau với mức độ nghiêm ngặt và không nghiêm ngặt. Ví dụ: không nghiêm ngặt chỉ đơn giản là đổ một đối tượng từ bộ nhớ cache sau khi cập nhật được thực hiện ... giá được trả cho tìm nạp trên truy cập tiếp theo thay vì trình xử lý sự kiện sau khi cập nhật. Trong mô hình nghiêm ngặt, bộ nhớ cache được lưu lại tự động. Một điều tương tự xảy ra với chèn, không nghiêm ngặt sẽ không làm gì mà nghiêm ngặt sẽ đi phía sau và tải đối tượng mới được chèn vào bộ nhớ cache.

Trong trường hợp không nghiêm ngặt, bạn cũng có khả năng đọc bị bẩn, vì bộ nhớ cache không bị khóa tại thời điểm đọc, bạn sẽ không thấy kết quả thay đổi của một chủ đề khác đối với mục đó. Trong khóa bộ nhớ cache nghiêm ngặt cho mục đó sẽ khóa và bạn sẽ được tổ chức nhưng thấy kết quả mới nhất tuyệt đối. Vì vậy, ngay cả trong một môi trường đích duy nhất, nếu có một lượng lớn các lần đọc/chỉnh sửa đồng thời trên các đối tượng thì bạn có cơ hội xem dữ liệu không thực sự chính xác. Điều này tất nhiên trở thành một vấn đề khi một lưu được thực hiện và một màn hình chỉnh sửa đang tải: người nghĩ rằng họ đang chỉnh sửa phiên bản mới nhất của đối tượng thực sự không phải là, và họ đang ở trong một bất ngờ khó chịu khi họ cố gắng lưu các chỉnh sửa vào dữ liệu cũ mà họ đã tải.

+0

Cảm ơn Nick, điều này rất hữu ích. Tôi nhầm tưởng rằng bộ nhớ thời gian sẽ ngăn chặn đọc bẩn, nhưng tôi có thể thấy làm thế nào điều này là không thể mà không khóa bộ nhớ cache (mà không nghiêm ngặt sẽ không làm). –

+0

Rất nhiều thông tin, cảm ơn bạn. – ctrlplusb

2

Tôi đã tạo một bài đăng here giải thích sự khác biệt. Xin vui lòng có một cái nhìn và cảm thấy tự do để bình luận.

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