In diesem Artikel werden hauptsächlich die Vorsichtsmaßnahmen für die Konfiguration des Java-Spring-Cache-Schlüssels vorgestellt. Der Herausgeber ist der Meinung, dass er hier als Referenz an Freunde weitergegeben werden kann, die ihn benötigen.
Um die Parallelitätsleistung des Projekts zu verbessern, sollten Sie die Einführung eines lokalen Speichercaches in Betracht ziehen, um drei Arten von Funktionsverarbeitungsergebnissen zwischenzuspeichern: Zugriff auf externe Datenquellen, Restful-API-Aufrufe und wiederverwendbare komplexe Berechnungen. Derzeit wird die Annotationsmethode @Cacheable von Spring Cache verwendet, und die spezifische Implementierung des Caches ist Guava Cache.
Die spezifische Cache-Konfiguration wird hier nicht vorgestellt. Der Schwerpunkt liegt auf der Schlüsselkonfiguration:
1 🎜>
2. Kombinationsform
@Cacheable(value="cacheName", key"#id") public ResultDTO method(int id);
3. Objektform
@Cacheable(value="cacheName", key"T(String).valueOf(#name).concat('-').concat(#password)) public ResultDTO method(int name, String password);
4. Benutzerdefinierter Schlüsselgenerator
@Cacheable(value="cacheName", key"#user.id) public ResultDTO method(User user);
Hinweis: Der Spring-Standard-SimpleKeyGenerator funktioniert nicht Kombinieren Sie den Funktionsnamen wie folgt mit dem Schlüssel
@Cacheable(value="gomeo2oCache", keyGenerator = "keyGenerator") public ResultDTO method(User user);
@Component public class CacheTestImpl implements CacheTest { @Cacheable("databaseCache") public Long test1() { return 1L; } @Cacheable("databaseCache") public Long test2() { return 2L; } @Cacheable("databaseCache") public Long test3() { return 3L; } @Cacheable("databaseCache") public String test4() { return "4"; } }Die tatsächliche Ausgabe ist:
1 2 3 4Außerdem werden Arrays atomarer Typen nicht wirksam, wenn sie direkt als Schlüssel verwendet werden.
1 1 1 ClassCastException: java.lang.Long cannot be cast to java.lang.String
class CacheKeyGenerator implements KeyGenerator { // custom cache key public static final int NO_PARAM_KEY = 0; public static final int NULL_PARAM_KEY = 53; @Override public Object generate(Object target, Method method, Object... params) { StringBuilder key = new StringBuilder(); key.append(target.getClass().getSimpleName()).append(".").append(method.getName()).append(":"); if (params.length == 0) { return key.append(NO_PARAM_KEY).toString(); } for (Object param : params) { if (param == null) { log.warn("input null param for Spring cache, use default key={}", NULL_PARAM_KEY); key.append(NULL_PARAM_KEY); } else if (ClassUtils.isPrimitiveArray(param.getClass())) { int length = Array.getLength(param); for (int i = 0; i < length; i++) { key.append(Array.get(param, i)); key.append(','); } } else if (ClassUtils.isPrimitiveOrWrapper(param.getClass()) || param instanceof String) { key.append(param); } else { log.warn("Using an object as a cache key may lead to unexpected results. " + "Either use @Cacheable(key=..) or implement CacheKey. Method is " + target.getClass() + "#" + method.getName()); key.append(param.hashCode()); } key.append('-'); } String finalKey = key.toString(); long cacheKeyHash = Hashing.murmur3_128().hashString(finalKey, Charset.defaultCharset()).asLong(); log.debug("using cache key={} hashCode={}", finalKey, cacheKeyHash); return key.toString(); } }Zusammenfassung
Das obige ist der detaillierte Inhalt vonHinweise zur Cache-Schlüsselkonfiguration in Java Spring. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!