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

Hinweise zur Cache-Schlüsselkonfiguration in Java Spring

黄舟
黄舟Original
2017-10-17 09:29:272053Durchsuche

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);


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"; } 
}

Die tatsächliche Ausgabe ist:


1 
2 
3 
4

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


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(); 
  } 
}
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!

Stellungnahme:
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