2011-10-13 34 views
7

Tôi cần một số Map (hoặc bất kỳ bộ sưu tập nào) hỗ trợ thời gian không sử dụng cho các mục nhập và tự động xóa chúng.Bản đồ với các yếu tố tự động hết hạn

Tôi biết có ổi MapMaker, nhưng nó hết hạn các yếu tố của nó trên các hoạt động đọc/ghi tiếp theo thay vì tự động, bởi một chuỗi đang chạy. Ngoài ra, khả năng hết hạn của MapMaker hiện được chuyển đến CacheBuilder. Vấn đề là, tôi không muốn bộ nhớ cache - Tôi muốn các yếu tố hết hạn

Có điều gì đó sẵn sàng để sử dụng không? (nó không khó để thực hiện nó bản thân mình, nhưng nó là tốt hơn để tái sử dụng một cái gì đó)

+0

Bạn có cần những yếu tố nào đó một cách rõ ràng "chết" (ví dụ bằng cách gọi một số phương pháp) đúng thời hạn? Nếu bạn chỉ cần vứt bỏ các yếu tố đã hết hạn, kiểm tra dấu thời gian của các yếu tố tại thời điểm truy cập là đủ. – 9000

+1

Bạn có thể chạy một chuỗi định kỳ gọi Cache.cleanup() để kích hoạt việc gỡ bỏ các mục đã hết hạn. Trong khi không phải ngay lập tức, một thread đang chạy trong nội bộ có quá nhiều hạn chế (không phải J2EE/GAE tương thích, bị ảnh hưởng của dogpile, vv). –

+0

@Ben Manes cảm ơn đề xuất. Tuy nhiên tôi không thích giao diện Cache. Đầu tiên, nó buộc bạn phải xác định tính toán giá trị. Tôi không cần điều đó. Nếu tôi trả về null, nó sẽ ném NPE. Đó là bởi vì nó luôn gọi getOrCompute, và tôi chỉ cần nhận - giống như một bản đồ đơn giản. Sau đó, ngay cả khi bắt NPE, tôi không thể làm cho nó hoạt động (có lẽ là lỗi của tôi), nhưng nó luôn luôn là mục nhập hết hạn, mặc dù chúng được truy cập. – Bozho

Trả lời

2

Có thể: http://code.google.com/p/concurrentlinkedhashmap/wiki/ExpirableCache
Thay vì ... nó có rất nhiều nhập khẩu chưa được giải quyết.

+0

tốt, tôi sẽ kiểm tra nó vào ngày mai – Bozho

+0

Hướng dẫn minh họa (cũ) thay vì thư viện được cung cấp, vì vậy nhập khẩu chưa được giải quyết có vẻ công bằng. Đó là một cách tiếp cận ngây thơ và phổ biến. Tôi thích phương pháp phân bổ amortized chúng tôi thêm vào ổi vì nó tránh sự kiện cũ chồng chất lên. –

2

Nếu không có gì khác, bạn có thể cung cấp giả CacheLoader chỉ cần ném ngoại lệ, sau đó chỉ cần không gọi Cache.get - chỉ tương tác với chế độ xem asMap. Nó không phải là khá, nhưng chúng tôi đang nỗ lực để hỗ trợ trường hợp này tốt hơn trong phiên bản 11.0. Đảm bảo bạn có Guava 10.0.1 nếu bạn dùng thử.

Và có, Cache.cleanUp là ở đó để bạn có thể gọi bao nhiêu lần tùy thích bất kỳ chủ đề nào bạn muốn.

+0

đã thử điều đó, nhưng tương tác xem dạng 'asMap' không làm mới quyền truy cập cuối cùng. – Bozho

0

Bản đồ Expiring của Apache Mina chính xác là những gì bạn đang tìm kiếm.

http://mina.apache.org/mina-project/apidocs/org/apache/mina/util/ExpiringMap.html

+2

Câu trả lời chỉ liên kết không phải là loại câu trả lời hay nhất.Bạn có thể mở rộng về điều này bằng cách cung cấp một mẫu mã nhỏ không? –

+0

Xem [ExpiringMap] (https://github.com/jhalterman/expiringmap). Nó có thể hết hạn các mục dựa trên thời gian tạo hoặc truy cập. – Jonathan

0

tôi sẽ khuyên bạn nên sử dụng Map rằng Hazelcast cung cấp. Nó cũng cung cấp capabilites phân tán nhưng có thể bạn không quan tâm đến chúng. Bạn chỉ cần định cấu hình chính sách hết hạn (time-to-live-secondsmax-idle-seconds) và sử dụng số Map như thể là HashMap của Java.

Thông tin thêm có thể được tìm thấy ở đây: Hazelcast Distributed Map

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