Heim > Java > javaLernprogramm > Hinweise zur Cache-Schlüsselkonfiguration in Java Spring

Hinweise zur Cache-Schlüsselkonfiguration in Java Spring

黄舟
Freigeben: 2017-10-17 09:29:27
Original
2104 Leute haben es durchsucht

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);
Nach dem Login kopieren

3. Objektform

@Cacheable(value="cacheName", key"T(String).valueOf(#name).concat('-').concat(#password))  
public ResultDTO method(int name, String password);
Nach dem Login kopieren

4. Benutzerdefinierter Schlüsselgenerator

@Cacheable(value="cacheName", key"#user.id) 
public ResultDTO method(User user);
Nach dem Login kopieren

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);
Nach dem Login kopieren


Wir erwarten die Ausgabe:


@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"; } 
}
Nach dem Login kopieren

Die tatsächliche Ausgabe ist:


1 
2 
3 
4
Nach dem Login kopieren

Außerdem werden Arrays atomarer Typen nicht wirksam, wenn sie direkt als Schlüssel verwendet werden.


Um die beiden oben genannten Probleme zu lösen, wurde ein KeyGenerator wie folgt angepasst:
1 
1 
1 
ClassCastException: java.lang.Long cannot be cast to java.lang.String
Nach dem Login kopieren


Mit dieser Methode können folgende Probleme gelöst werden: Viele Probleme wie Parameter, Arrays atomarer Typen und Identifizierung von Methodennamen


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(&#39;,&#39;); 
        } 
      } 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(&#39;-&#39;); 
    } 
    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(); 
  } 
}
Nach dem Login kopieren
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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage