Maison >Java >javaDidacticiel >Notes sur la configuration de la clé de cache dans Java Spring

Notes sur la configuration de la clé de cache dans Java Spring

黄舟
黄舟original
2017-10-17 09:29:272098parcourir

Cet article présente principalement les précautions à prendre pour la configuration de la clé Java Spring-Cache. L'éditeur pense que c'est assez bon, je vais le partager avec vous ici pour référence des amis qui en ont besoin.

Afin d'améliorer les performances de concurrence du projet, envisagez d'introduire un cache de mémoire locale pour mettre en cache trois types de résultats de traitement de fonctions : accès à des sources de données externes, appels d'API Restful et calculs complexes réutilisables. Actuellement, la méthode d'annotation @Cacheable de Spring Cache est utilisée et l'implémentation spécifique du cache est Guava Cache.
La configuration spécifique du cache ne sera pas présentée ici. L'accent est mis sur la configuration des clés :

1. 🎜>

2. Formulaire de combinaison

@Cacheable(value="cacheName", key"#id")  
public ResultDTO method(int id);

3. 🎜>

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

4. Générateur de clés personnalisées


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

Remarque : SimpleKeyGenerator par défaut de Spring ne le fera pas. combinez le nom de la fonction dans la clé

comme suit :


@Cacheable(value="gomeo2oCache", keyGenerator = "keyGenerator") 
public ResultDTO method(User user);


Nous attendons le résultat :


Le résultat réel est :
@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"; } 
}


De plus, les tableaux de types atomiques ne prendront pas effet lorsqu'ils sont utilisés directement comme clés.
1 
2 
3 
4

Afin de résoudre les deux problèmes ci-dessus, un KeyGenerator a été personnalisé comme suit :


1 
1 
1 
ClassCastException: java.lang.Long cannot be cast to java.lang.String


L'utilisation de cette méthode peut résoudre : De nombreux problèmes tels que les paramètres, les tableaux de types atomiques et l'identification du nom de la méthode

Résumé

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn