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

黄舟
Libérer: 2017-10-17 09:29:27
original
2104 Les gens l'ont consulté

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);
Copier après la connexion

3. 🎜>

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

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


@Cacheable(value="cacheName", key"#user.id) 
public ResultDTO method(User user);
Copier après la connexion

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);
Copier après la connexion


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"; } 
}
Copier après la connexion


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

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
Copier après la connexion


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(); 
  } 
}
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal