Update : Die aktuelle Spring-Cache-Implementierung verwendet alle Methodenparameter als Cache-Schlüssel, sofern nicht anders angegeben. Wenn Sie ausgewählte Schlüsselverwenden möchten, lesen Sie die Antwort von Arjan, in der die SpEL-Liste verwendet wird. Dies{#isbn, #includeUsed}
ist der einfachste Weg, um eindeutige Schlüssel zu erstellen.
Aus der Frühlingsdokumentation
Die Standardstrategie zur Schlüsselgenerierung wurde mit der Veröffentlichung von Spring 4.0 geändert. Frühere Versionen von Spring verwendeten eine Schlüsselgenerierungsstrategie, bei der für mehrere Schlüsselparameter nur der hashCode () der Parameter und nicht gleich () berücksichtigt wurde. Dies kann zu unerwarteten Schlüsselkollisionen führen (Hintergrund siehe SPR-10237). Der neue 'SimpleKeyGenerator' verwendet für solche Szenarien einen zusammengesetzten Schlüssel.
Vor dem Frühjahr 4.0
Ich empfehle Ihnen, die Werte der Parameter im Spel-Ausdruck mit etwas zu verknüpfen key="#checkWarehouse.toString() + #isbn.toString()")
, das meiner Meinung nach funktionieren sollte, da org.springframework.cache.interceptor.ExpressionEvaluator Object zurückgibt, das später als Schlüssel verwendet wird, damit Sie es nicht angeben müssen ein int
in Ihrem SPEL-Ausdruck.
Der Hash-Code mit einer hohen Kollisionswahrscheinlichkeit kann nicht als Schlüssel verwendet werden.
Jemand in diesem Thread hat vorgeschlagen, zu verwenden, T(java.util.Objects).hash(#p0,#p1, #p2)
aber es wird nicht funktionieren und dieser Ansatz ist leicht zu brechen, zum Beispiel habe ich die Daten von SPR-9377 verwendet :
System.out.println( Objects.hash("someisbn", new Integer(109), new Integer(434)));
System.out.println( Objects.hash("someisbn", new Integer(110), new Integer(403)));
Beide Zeilen drucken -636517714 in meiner Umgebung.
PS Eigentlich in der Referenzdokumentation haben wir
@Cacheable(value="books", key="T(someType).hash(#isbn)")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)
Ich denke, dass dieses Beispiel FALSCH und irreführend ist und aus der Dokumentation entfernt werden sollte, da die Schlüssel eindeutig sein sollten.
PPS finden Sie auch unter https://jira.springsource.org/browse/SPR-9036 für einige interessante Ideen zur Standardschlüsselgenerierung.
Ich möchte aus Gründen der Korrektheit und als unterhaltsame Tatsache hinzufügen , dass eine sichere Verwendung von verschlüsselter Hash - Funktion wie SHA256, aufgrund der Eigenschaften solchen Funktion IST für diese Aufgabe möglich, aber es zu berechnen , jedes Mal kann zu teuer sein.