2012-06-13 3 views
6

Używam CacheBuilder i LoadingCache do implementowania pamięci podręcznej danych bazy danych w pamięci.Guava LoadingCache - obsługa kluczy, których nie ma w sklepie kopii zapasowej.

Załóżmy, że klient wysyła zapytanie do pamięci podręcznej o produkt, który nie istnieje w magazynie zaplecza. Chcę, aby klient wiedział, że nie znaleziono żadnych danych dla określonego klucza. Jakie jest najlepsze podejście do radzenia sobie z tym?

  • Zapisuj wartość specjalną w pamięci podręcznej, która oznacza "brak danych".
  • Nie przechowuj niczego w pamięci podręcznej i zgłaszaj wyjątków.
  • Inne pomysły?
+3

Cóż ... czy to oznacza wyjątkowy stan, czy jest to normalne zjawisko w twoim programie? Jeśli pierwszy, wyrzuć wyjątek, jeśli drugi, zapisz specjalną wartość. –

+0

Nieco niechętnie użyłem opcji "Opcjonalnie" w tych ostatnich przypadków Louisa. – Ray

+0

W moim przypadku "brak danych" ma znaczenie. Początkowo próbowałem przechowywać wartość null w pamięci podręcznej, która nie powiodła się z powodu "InvalidCacheLoadException". Dzięki za sugestię, Ray. Również znalazłem dobre informacje tutaj: http://stackoverflow.com/questions/8298285/handle-null-value-using-guava-mapmaker-cachebuilder – frankadelic

Odpowiedz

9

Zawsze rozwiązałem to w następujący sposób.

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(); 
    } 

} 

Najlepiej byłoby zmienić interfejs dla KeyValueService, aby zawsze zwracać Opcjonalnie, ale czasami nie jest to możliwe.

Możesz użyć funkcji ważenia, aby szybko wyeksmitować wszystkie odniesienia Optional.ABSENT.

+0

Nie sądzę, że możesz użyć ważenia, aby spowodować eksmisję Opcjonalnego.ABSENT szybko. Z dokumentacji CacheBuilder: "waga jest używana tylko do określenia, czy pamięć podręczna ma zbyt dużą pojemność, nie ma wpływu na wybór, który wpis powinien zostać eksmitowany w następnej kolejności". – frankadelic

+0

Masz rację, ponieważ nie ułatwia to wyboru, jednak gdy zacznie się eksmitować, będzie eksmitować aż do momentu, w którym stanie się on mniejszy, jeśli wrzucisz Optional.ABSENT niższą masę niż zwykły przedmiot, zostaną one wyeksmitowane podczas cykl eksmisji. Standardowe zasady LRU nadal obowiązują. – Emily

Powiązane problemy