Câu hỏi Bản đồ với các phần tử tự động hết hạn [đã đóng]


tôi cần một Map (hoặc bất kỳ bộ sưu tập nào) hỗ trợ time-to-idle cho các mục nhập và tự động loại bỏ chúng.

Tôi biết có ổi MapMaker, nhưng nó hết hạn các thành phần của nó trên các hoạt động đọc / ghi tiếp theo thay vì tự động, bởi một luồng đang chạy. Hơn nữa 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 phần 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ó tốt hơn để tái sử dụng một cái gì đó)


9
2017-10-13 22:02


gốc


Bạn có cần các yếu tố để bằng cách 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) về thời gian? 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
Bạn có thể có một chuỗi đang chạy đị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). - Ben Manes
@Ben Manes cảm ơn lời đề nghị. 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
Đó là công bằng. Đã có cuộc tranh luận về việc liệu một trở về null từ một bộ tải có được chấp nhận không (ví dụ: bộ nhớ cache bị thiếu). Việc dễ dàng nới lỏng một ràng buộc hơn là thêm nó, điều đó có thể thay đổi trước khi xóa trạng thái @Beta. Bạn có thể sử dụng cache.asMap () để sử dụng chế độ xem bản đồ của bộ nhớ cache, trong đó get () sẽ không tính toán và ghi được cho phép (trong 10.0.1). - Ben Manes
@Ben Manes yup, nhưng điều đó sẽ không làm mới quyền truy cập và các mục sẽ hết hạn - Bozho


Các câu trả lời:


Có lẽ: http://code.google.com/p/concurrentlinkedhashmap/wiki/ExpirableCache 
Thay vào đó không ... nó có rất nhiều hàng nhập khẩu chưa được giải quyết.


2
2017-10-13 22:11



tốt, tôi sẽ kiểm tra nó vào ngày mai - Bozho
Một hướng dẫn minh họa (cũ) của nó thay vì một 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. - Ben Manes


Nếu không có gì khác, bạn có thể cung cấp một giả CacheLoader mà chỉ ném ngoại lệ, sau đó chỉ cần không gọi Cache.get - chỉ tương tác với asMap lượt xem. Nó không phải đẹpnhư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à vâng, Cache.cleanUp là có cho bạn để gọi thường xuyên như bạn muốn từ bất kỳ chủ đề bạn muốn.


2
2017-10-17 05:07



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


Bản đồ ExpiringMap 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


0
2017-12-17 01:19



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? - Jeroen Vannevel
Kiểm tra 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


Tôi khuyên bạn nên sử dụng Map mà 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-seconds và max-idle-seconds) và sử dụng Map như thể Java HashMap sẽ là.

Thông tin thêm có thể được tìm thấy ở đây: Bản đồ phân tán Hazelcast


0
2017-12-17 01:23