2012-06-13 30 views
6

Tôi đang sử dụng CacheBuilderLoadingCache để triển khai bộ nhớ cache trong dữ liệu của cơ sở dữ liệu.Ổ cứng LoadingCache - cách xử lý các khóa không tồn tại trong cửa hàng sao lưu

Giả sử một khách hàng truy vấn bộ nhớ cache cho một mục không tồn tại trong cửa hàng sao lưu. Tôi muốn khách hàng biết rằng không tìm thấy dữ liệu nào cho khóa được chỉ định. Cách tiếp cận tốt nhất để xử lý điều này là gì?

  • Lưu trữ giá trị đặc biệt trong bộ nhớ cache có nghĩa là "không có dữ liệu".
  • Không lưu trữ gì trong bộ nhớ cache và tăng ngoại lệ.
  • Các ý tưởng khác?
+3

Vâng ... điều đó có phải là một điều kiện đặc biệt hay đây là sự kiện bình thường trong chương trình của bạn? Nếu đầu tiên, ném một ngoại lệ, nếu thứ hai, lưu trữ một giá trị đặc biệt. –

+0

Tôi phần nào miễn cưỡng sử dụng một 'Tùy chọn' trong trường hợp của Louis. – Ray

+0

Trong trường hợp của tôi, "không có dữ liệu" là có ý nghĩa. Ban đầu, tôi đã cố gắng để lưu trữ null trong bộ nhớ cache, mà không thành công do 'InvalidCacheLoadException'. Cảm ơn lời đề nghị, Ray. Cũng tìm thấy một số thông tin tốt ở đây: http://stackoverflow.com/questions/8298285/handle-null-value-using-guava-mapmaker-cachebuilder – frankadelic

Trả lời

9

Tôi đã luôn giải quyết vấn đề này theo cách sau.

interface KeyValueService<K,V> { 
    V get(K key); 
} 

class CachingKeyValueService<K,V> { 
    Cache<K,Optional<V>> cache; 
    V get(K key) { 
     return cache.get(key).orNull(); 
    } 

} 

Lý tưởng nhất là bạn sẽ thay đổi giao diện cho KeyValueService để luôn trả về Tùy chọn, nhưng đôi khi điều đó là không thể.

Bạn có thể sử dụng trọng số để làm cho tất cả các tham chiếu Optional.ABSENT bị xóa nhanh chóng.

+0

Tôi không nghĩ rằng bạn có thể sử dụng cân để khiến Optional.ABSENT bị trục xuất Mau. Từ tài liệu CacheBuilder: "trọng lượng chỉ được sử dụng để xác định xem bộ nhớ cache có vượt quá dung lượng hay không, nó không có tác dụng khi chọn mục nhập nào sẽ được gỡ bỏ tiếp theo". – frankadelic

+0

Bạn ở ngay tại chỗ nó không hỗ trợ lựa chọn, tuy nhiên khi nó bắt đầu đuổi nó sẽ tiếp tục đuổi cho đến khi nó ở dưới trọng lượng, nếu bạn đặt Optional.ABSENT trọng lượng thấp hơn đối tượng thông thường, chúng sẽ được loại bỏ một cách ưu tiên trong chu kỳ trục xuất. Các quy tắc LRU chuẩn vẫn áp dụng tất nhiên. – Emily

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