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.
Nein, Guava hat keine Unterstützung dafür. –
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