2 Stimmen

Cache-Schlüssel-Generierung

Ich verwende ehcache (über das Grails-Plugin). Die Methode, die Objekte zum Cache hinzufügt, erfordert, dass die Schlüssel serialisierbar sind, so dass eine typische Verwendung sein würde:

def key = 22
def someObject = new Object();
cacheService.cache(key, true, someObject)

(Der boolesche Parameter gibt an, ob das Objekt einem verteilten oder lokalen Cache hinzugefügt werden soll)

Meine Frage ist, wie ich über die Generierung von Schlüsseln aus Wertobjekten wie gehen sollte:

class Person implements Serializable {
  String firstName
  String lastName
  Integer age
}

Ein Ansatz wäre, eine hashCode()- und eine equals()-Methode bereitzustellen und den hashCode als Schlüssel zu verwenden. In diesem Fall müsste ich die Klasse Person nicht Serializable implementieren.

Alternativ könnte ich auch einfach das Person-Objekt selbst als Schlüssel verwenden. Es scheint, dass ich immer noch die Methoden equals und hashCode bereitstellen müsste, aber auch Serializable implementieren müsste. Allerdings scheint die Wahrscheinlichkeit von Kollisionen bei diesem Ansatz geringer zu sein, da eine Person nur gleich einer anderen Instanz von Person sein kann.

Ich nehme an, dass ehcache die equals()-Methode eines Schlüssels verwendet, um festzustellen, ob dieser Schlüssel bereits im Cache vorhanden ist. Ist diese Annahme richtig?

Ist einer der oben beschriebenen Ansätze per se besser als der andere, oder gibt es einen anderen Ansatz, den ich nicht in Betracht gezogen habe?

Danke! Don

2voto

Chris Kessel Punkte 5281

Die Frage nach dem Hashkey hat nichts mit der Frage nach der Serialisierbarkeit zu tun. Als Antwort auf den Hashkey würde ich den Apache Commons HashCodeBuilder verwenden. Er erledigt die ganze schwere Arbeit für Sie. Ähnlich verhält es sich mit Equals, verwenden Sie den EqualsBuilder.

Denken Sie jedoch daran, dass die Hashcodes über die gesamte Lebensdauer des Objekts gleich bleiben müssen, so dass Sie nur die internen Elemente hashen, die sich nicht ändern werden.

Ich würde es vermeiden, das Person-Objekt als Schlüssel zu verwenden, da dieses seine equals() aufruft, um Schlüsselvergleiche zu überprüfen, was wahrscheinlich langsamer ist als der Vergleich eines Integer-Hashcodes.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X