2014-09-24 14 views
10
private Cache<Long, Response> responseCache = CacheBuilder.newBuilder() 
      .maximumSize(10000) 
      .expireAfterWrite(10, TimeUnit.MINUTES) 
      .build(); 

Tôi hy vọng rằng các đối tượng phản hồi không gửi cho khách hàng trong vòng 10 phút hết hạn và tự động xóa bộ nhớ cache nhưng tôi nhận thấy rằng đối tượng phản hồi không phải lúc nào cũng hết hạn thậm chí sau 10, 15, 20 phút. Chúng sẽ hết hạn khi bộ nhớ cache đang được phổ biến với số lượng lớn nhưng khi hệ thống không hoạt động, giống như 500 đối tượng phản hồi cuối cùng, nó sẽ ngừng xóa các đối tượng này. Ai đó có thể giúp hiểu hành vi này? Cảm ơn bạnBộ nhớ cache ổi 'hết hạnAfterWrite' dường như không hoạt động

+0

https://code.google.com/p/guava-libraries/wiki/CachesExplained#When_Does_Cleanup_Happen%3F –

+0

Tuyệt vời, cảm ơn bạn – Mark1234

Trả lời

15

này được quy định trong tài liệu:

mục Nếu expireAfterWrite hoặc expireAfterAccess được yêu cầu có thể bị đuổi trên mỗi sửa đổi bộ nhớ cache, bộ nhớ cache trên thỉnh thoảng truy cập, hoặc trên các cuộc gọi đến Cache.cleanUp(). Các mục nhập hết hạn có thể được đếm bởi Cache.size(), nhưng sẽ không bao giờ được hiển thị cho các hoạt động đọc hoặc ghi.

Và có thêm chi tiết về wiki:

Caches xây dựng với CacheBuilder không thực hiện dọn dẹp và đuổi các giá trị "tự động", hoặc ngay lập tức sau khi một giá trị hết hạn, hoặc bất cứ điều gì của phân loại. Thay vào đó, nó thực hiện một lượng nhỏ bảo trì trong quá trình ghi, hoặc trong các thao tác đọc không thường xuyên nếu viết là hiếm.

Lý do cho điều này là như sau: nếu chúng tôi muốn thực hiện bảo trì bộ nhớ cache liên tục, chúng tôi sẽ cần tạo chuỗi và hoạt động của nó sẽ cạnh tranh với các hoạt động của người dùng cho khóa được chia sẻ. Ngoài ra, một số môi trường hạn chế việc tạo chủ đề, sẽ làm cho CacheBuilder không sử dụng được trong môi trường đó.

Thay vào đó, chúng tôi đặt sự lựa chọn trong tay bạn. Nếu bộ nhớ cache của bạn là thông lượng cao, thì bạn không phải lo lắng về việc thực hiện bảo trì bộ nhớ cache để xóa các mục đã hết hạn và các mục tương tự. Nếu bộ nhớ cache của bạn chỉ viết hiếm khi và bạn không muốn dọn dẹp để chặn bộ nhớ cache lần đọc, bạn có thể tạo chuỗi bảo trì của riêng bạn gọi Cache.cleanUp() theo các khoảng thời gian đều đặn.

Nếu bạn muốn lập lịch bảo trì bộ đệm thường xuyên cho bộ nhớ cache mà chỉ hiếm khi ghi, chỉ cần lên lịch bảo trì bằng cách sử dụng ScheduledExecutorService.

+0

Vâng, cảm ơn bạn. – Mark1234

+0

chỉ cần sao chép từ tài liệu, không ấn tượng –

+17

@SimonGuo Tôi đã viết nhiều tài liệu. –

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