2016-07-28 31 views
0

Hey alle so mit Googles CacheBuilder/Cacheloader:Guava CacheBuilder und speichern Schlüssel unterscheidet sich von Lookup-Schlüssel

CacheBuilder.newBuilder().maximumSize(MAX_SIZE).expireAfterAccess() 
            .build(new CacheLoader<String, Object>() { 
             @Override 
             public Object load(String key) throws Exception { 
              return Query(key); 
             } 
            }); 

ziemlich geradlinig. Thing ist der Schlüssel wird in der Abfrage zum Laden verwendet, wenn nicht im Cache und kann eigentlich ziemlich groß sein. Ich möchte den Hash des Schlüssels tatsächlich im Cache speichern, und wenn eine Suche im Cache tatsächlich ausgeführt wird, verwendet er den Hash des Schlüssels, aber wenn die Last erledigt ist, ist der Schlüssel tatsächlich die vollständige Abfrage.

Grundsätzlich würde ich wollen, dass mein Programm den Cache verwendet, indem ich die Abfrage senden, um Funktion zu erhalten, aber kurz vor Schlüsselsuche oder Cache-Speicher frage ich mich, ob es eine Hook-Funktion gibt, die ich überschreiben kann, um den Schlüssel für endgültigen Cache-Speicher und Nachschlagen ?

Vielen Dank im Voraus

Update:

Also habe ich eine Lösung mit abrufbaren Version von get out. Wenn ich den Cache in meinem eigenen Behälter wickeln:

class WrappedCache { 
    private Cache<String, Object> mInnerCache; 

    public Object get(String key) { 
     String hashedKey = Hash(key); // get hashed key 

     return mInnerCache.get(hashedKey, new Callable<Object>() { 
      return Query(key); 
     } 
    } 
} 

diese Weise die innere Cache nur mit Hash-Werten befasst sich aber die abrufbaren erhält die ursprüngliche Abfrage, wenn er es braucht, um es Aktionen auszuführen.

Wenn ich eine komplexere Lösung brauchte, hätte ich die WrappedCache Schnittstelle Cache<K,V> implementieren können, aber mein Anwendungsfall ist ein wenig einfacher, und ich kann oben damit durchkommen.

+1

Nein, Guava hat keine Unterstützung dafür. –

+0

FYI: Guava hat einen 'AbstractCache' und einen' AbstractLoadingCache', die es erleichtern sollten, einen eigenen'Cache'/'LoadingCache' zu ​​implementieren, wenn Sie sich dafür entschieden haben. – mfulton26

Antwort

0

Ich glaube nicht, die Guava Cache-Implementierung unterstützt so etwas, aber Sie könnten einen Dekorateur erstellen, um die Übersetzung auf Put und Get vor dem Speichern zu tun.

Würde so etwas funktionieren?

public class CacheDecorator<K1, K2, V> { 

    private final Function<K1, K2> keyConversion; 
    private final LoadingCache<K2, V> cache; 

    public CacheDecorator(Function<K1, K2> keyConversion, LoadingCache<K2, V> cache) { 
     this.keyConversion = keyConversion; 
     this.cache = cache; 
    } 

    public V get(K1 key) throws ExecutionException { 
     return cache.get(keyConversion.apply(key)); 
    } 

    public void put(K1 key, V value) { 
     cache.put(keyConversion.apply(key), value); 
    } 

}