2012-08-24 19 views
12

Tôi sử dụng NHibernate với Memcached như là một bộ nhớ cache cấp thứ hai và luôn luôn tò mò về tùy chọn cấu hình cache.use_minimal_puts.NHibernate và Memcached - nên use_minimal_puts được kích hoạt?

Theo tài liệu:

hibernate.cache.use_minimal_puts: Tối ưu hoá hoạt động bộ nhớ cache cấp thứ hai để giảm thiểu viết, với chi phí của thường xuyên hơn đọc. Cài đặt này hữu ích nhất cho các bộ nhớ nhóm được nhóm và, trong Hibernate3, được bật theo mặc định cho bộ nhớ cache được nhóm triển khai.

Để rõ ràng, tôi không chạy Memcached trong môi trường cụm, nhưng nó chạy trên máy từ xa. Một yếu tố khác cần xem xét có hay không có sự khác biệt lớn về tốc độ giữa đọc và viết cho Memcached.

Tôi có được lợi từ việc bật cache.use_minimal_puts trong trường hợp này không?

+0

"với chi phí thường xuyên hơn đọc" - cũng Reads ngụ ý ở trên không qua mạng, phải không? –

+0

@ PlínioPantaleão - Tốt .. có lẽ một câu hỏi hay hơn là: được viết (rất nhiều) đắt hơn số lần đọc trong memcached? – DanP

+0

Tôi không có bất kỳ bằng chứng nào để ủng hộ ý kiến ​​của tôi, nhưng tôi không tin điều này. Điều này chỉ đúng trong môi trường phân tán vì viết có thể khiến bạn mất lưu trữ trên các máy khác. Nếu điều này đã đúng trong trường hợp máy đơn lẻ, tôi nghĩ rằng họ sẽ làm điều đó trước :) –

Trả lời

15

Tôi không có kinh nghiệm trong NHibernate nhưng đã làm việc với bộ nhớ cache cấp hai trong Hibernate và tôi đã được cho biết rằng các khái niệm tương tự được áp dụng cho cả hai.

Ý tưởng cơ bản đằng sau cung cấp các tham số hibernate.cache.use_ minimal_puts là trước khi ngủ đông đặt một đối tượng trong bộ nhớ cache đầu tiên nó kiểm tra bộ nhớ cache mức độ thứ hai cho dù đối tượng đã có mặt ở đó, và nếu không thì chỉ đặt đó.

Điều này sẽ hữu ích CHỈ khi dữ liệu đọc từ bộ nhớ cache rất ít tốn kém hơn so với cập nhật dữ liệu. Đây là ý nghĩa của tài liệu về các số

... tối ưu hóa hoạt động bộ nhớ cache cấp hai để giảm thiểu ghi, tại chi phí đọc thường xuyên hơn.

Trường hợp phù hợp hoàn hảo cho loại tối ưu hóa này là nhân rộng trong phân cụm.

Nếu bạn đang sử dụng phân cụm thì thao tác đặt rất tốn kém vì nó kích hoạt trình lắng nghe nhân bản bộ đệm trong trường hợp bộ nhớ cache nhóm. Nếu bạn không sử dụng clustering thì thao tác đặt này tương đối rẻ.

Ngay cả trong trường hợp phân cụm có thể có các nhà cung cấp bộ nhớ cache dựa vào việc vô hiệu hóa các thực thể thay vì sao chép các thay đổi được thực hiện cho chúng. Trong trường hợp đó, tham số này sẽ là vô ích.

Một yếu tố có thể cản trở hiệu suất là loại sao chép đồng bộ hoặc không đồng bộ) được Memcache sử dụng. Tôi đã không sử dụng MemCache nhưng EhCache hỗ trợ cả hai mô hình. Vì vậy, trong trường hợp của bạn là bạn đang KHÔNG sử dụng phân nhóm và mặc dù bộ nhớ cache đang ở trên một quy trình từ xa, tôi nghiêm túc nghi ngờ rằng sẽ có bất kỳ lợi ích hiệu suất nào bằng cách đặt thông số này thành true.

0

Chỉ để thêm một vài chi tiết khác.

hibernate.cache.use_minimal_puts, đặt giá trị này thành true sẽ ngăn không cho ghi đè lên một cách mù quáng các giá trị được lưu trong bộ nhớ cache trước đó. theo hướng dẫn, nó được kích hoạt theo mặc định cho việc triển khai bộ nhớ cache nhóm.

Hibernate cung cấp thuộc tính cấu hình hibernate.cache.use_minimal_puts, tối ưu hóa quyền truy cập bộ nhớ cache cho bộ nhớ cache được nhóm bằng cách tăng số lần đọc bộ nhớ cache và giảm cập nhật bộ nhớ cache.

CacheMode.REFRESH sẽ bỏ qua hibernate.cache.use_minimal_puts hiệu lực thi hành

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