2010-09-17 33 views
6

Tôi có bộ dữ liệu lớn được cập nhật mỗi ngày một lần. Tôi đang lưu vào bộ nhớ cache kết quả của một truy vấn đắt tiền trên dữ liệu đó nhưng tôi muốn cập nhật bộ nhớ cache đó mỗi ngày. Tôi đang xem xét sử dụng CacheItemRemovedCallback để tải lại bộ nhớ cache của tôi trên một khoảng thời gian hàng ngày, nhưng tôi đã có những mối quan tâm sau đây:Khi nào thích hợp để sử dụng CacheItemRemovedCallback?

  1. Không phải là nó có thể là CacheItemRemovedCallback có thể được gọi trước khi hết hạn của tôi (trong trường hợp chạy ra khỏi bộ nhớ)? Có nghĩa là tải lại nó ngay lập tức có vẻ không phải là một ý tưởng hay.
  2. CacheItemRemovedCallback có được gọi trước hoặc sau khi mục đó thực sự bị xóa không? Nếu nó là sau, không lý thuyết này để lại một khoảng thời gian mà bộ nhớ cache sẽ không có sẵn?

Những mối quan tâm này có liên quan và nếu sử dụng CacheItemRemovedCallback để tải lại bộ nhớ cache của bạn là một ý tưởng tồi, khi nào thì hữu ích?

Trả lời

2

Từ phản hồi của mọi người và từ đọc thêm, tôi đã đi đến kết luận sau:

Mối quan ngại của tôi hợp lệ. Sử dụng CacheItemRemovedCallback để làm mới các mục được lưu trong bộ nhớ cache không phải là một ý tưởng hay. Việc sử dụng thực tế duy nhất cho gọi lại này có vẻ là đăng nhập thông tin về khi bộ nhớ cache của bạn được gỡ bỏ.

Dường như CacheItemUpdateCallback là cách thích hợp hơn để làm mới bộ nhớ cache của bạn trong khoảng thời gian thông thường.

Cuối cùng, tôi đã quyết định không sử dụng một trong các cuộc gọi này. Thay vào đó, tôi sẽ viết một hành động dịch vụ để công việc nhập khẩu cơ sở dữ liệu có thể thông báo cho ứng dụng của tôi khi nó cần làm mới dữ liệu của nó. Điều này tránh sử dụng làm mới theo thời gian hoàn toàn.

+0

Vâng, có những cách sử dụng thực tế khác cho 'CacheItemRemovedCallback' - không chỉ ghi nhật ký. Ví dụ: có các tham chiếu bên ngoài được lưu bởi một mục được lưu trong bộ nhớ cache mà bạn muốn vứt bỏ khi mục được lưu trong bộ nhớ cache bị xóa. Nếu bạn không sử dụng CacheItemRemovedCallback thì bạn sẽ phải dựa hoàn toàn vào Garbage Collector mà không cung cấp sự đảm bảo nào khi nó sẽ thực hiện (nếu bao giờ trong suốt thời gian của chương trình của bạn). –

1
  1. Có, thay đổi phương pháp có thể bị sa thải vì nhiều lý do khác nhau. Tuy nhiên, tải hoặc chờ để tải lại bộ nhớ cache sẽ phụ thuộc vào những gì tốt nhất cho trường hợp sử dụng điển hình của bạn trong ứng dụng của bạn.

  2. CacheItemRemovedCallback thực sự kích hoạt sau mục sẽ bị xóa khỏi bộ nhớ cache. Phải trước khi mục này sẽ bị xóa, bạn có thể sử dụng phương thức CacheItemUpateCallback để xác định xem bạn có muốn xóa bộ nhớ cache tại thời điểm đó hay không. Có thể có lý do chính đáng để chờ trong khi xóa bộ nhớ cache, chẳng hạn như bạn hiện có người dùng trong ứng dụng của mình và mất nhiều thời gian để tạo lại bộ nhớ cache.

Nói chung, cách tốt nhất là kiểm tra mục lưu trữ của bạn thực sự tồn tại trong bộ nhớ cache trước khi sử dụng dữ liệu của nó. Nếu dữ liệu không tồn tại, bạn có thể xây dựng lại bộ nhớ cache tại thời điểm đó (gây ra phản hồi hơi lâu hơn cho người dùng) hoặc chọn làm điều gì đó khác.

1

Điều này thực sự không phải là quá nhiều bộ nhớ cache của các giá trị riêng lẻ vì nó là ảnh chụp nhanh toàn bộ tập dữ liệu. Do đó, bạn không được hưởng lợi từ việc sử dụng lớp học Cache tại đây.

Tôi khuyên bạn nên tải một bộ sưu tập tĩnh khi khởi động và thay thế nó sau mỗi 24 giờ bằng cách đặt hẹn giờ. Ý tưởng sẽ là tạo ra một bộ sưu tập mới và phân bổ nguyên tử nó, vì cái cũ vẫn có thể được sử dụng và chúng tôi muốn nó vẫn tự duy trì.

3
  1. Nếu bạn định tải lại, hãy nhớ kiểm tra CacheItemRemovedReason. Gần đây, tôi đã phải gỡ rối một vấn đề mà một nhà phát triển đã quyết định họ nên tạo lại bộ đệm trong phương thức này và trong điều kiện bộ nhớ thấp, về cơ bản nó sẽ nhai CPU trong khi nó bị kẹt trong một vòng lặp xây dựng các đối tượng bộ nhớ cache, thêm chúng vào bộ nhớ cache, hết hạn, lặp lại.

  2. Gọi lại được kích hoạt sau mục sẽ bị xóa.

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