introduire
Lorsque vous utilisez MyBatis, vous pouvez utiliser le cache secondaire pour augmenter la vitesse de requête et ainsi améliorer l'expérience utilisateur.
Utilisez Redis pour fabriquer le cache secondaire de MyBatis, mais la mémoire est contrôlable. Si un serveur séparé est déployé pour le cache secondaire>, il est facile à gérer.
1. introduce redis dépendes dans le fichier pom.xml
<dependency> <proupId> org.springframework.boot </rombasid> <ArtefactId> printemp-boot-starter-data-redis </retifactid> </pedidency>
2. Configurer Redis dans l'application.
## redis printemps.redis.database = 0spring.redis.host = 172.16.3.123spring.redis.port = 6379spring.redis.password = printemps.redis.pool.ma x-active = 8spring.redis.pool.max-wait = -1spring.redis.pool.max-idle = 8spring.redis.pool.min-idle = 0spring.redis.timeout = 0
3. Créez un package de cache, puis créez deux classes, une applicationContexTholder implémente l'interface ApplicationContextAware. Le contenu spécifique est le suivant
package com.ruijie.springbootandredis.cache; import org.springframework.beans.beansexception; import org.springframework.context.applicationContext; import org.springframework.context.applicationcontextware; import org.springframework.sterreotype.composon implémente applicationContextAware {private static applicationContext applicationContext; @Override public void setApplicationContext (applicationContext ctx) lève beanSexception {applicationContext = ctx; } / ** * Obtenez un contexte d'application de partout * * @return * / public static applicationContext getApplicationContext () {return applicationContext; } / ** * Get Bean by Class * * @param Clazz * @param <T> * @return * / public static <T> t getbean (class <T> Clazz) {return applicationContext.getBean (Clazz); } / ** * Get Bean par nom de classe * * @param name * @param <T> * @return * / public static <T> t getbean (String name) {return (t) applicationContext.getBean (name); }}4. Créez la classe Rediscache pour implémenter l'interface de cache, le contenu spécifique est le suivant:
package com.ruijie.springbootandredis.cache; import org.apache.ibatis.cache.cache; import org.slf4j.logger; import org.slf4j.loggerfactory; import org.springframework.data.redis.core.rediscallback; importation; org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.core.ValueOperations;import java.util.concurrent.TimeUnit;import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent.locks.ReentrantReadWriteLock;public class Rediscache implémente cache {private static final logger logger = loggerfactory.getLogger (rediscache.class); Private Final ReadWriteLock ReadWriteLock = new ReentRanTreadWriteLock (); ID de chaîne finale privée; // ID d'instance de cache ID privé Redemplate Redemplate; Final statique privé Long expire_time_in_minutes = 30; // redis Expiration Time Public Rediscache (String id) {if (id == null) {Throw New illégalArgumentException ("Les instances de cache nécessitent un id"); } this.id = id; } @Override public String getID () {return id; } / ** * Placez le résultat de la requête à redis * * @param key * @param value * / @Override public void putObject (clé d'objet, valeur d'objet) {try {redetemplate reistetemplate = getRedistEemplate (); ValueOperations opsForValue = redetemplate.opsForValue (); opsforvalue.set (key, valeur, expire_time_in_minutes, timeUnit.Minutes); Logger.debug ("Mettez le résultat de la requête à redis"); } catch (throwable t) {logger.error ("redis put a échoué", t); }} / ** * Obtenez le résultat de la requête en cache à partir de redis * * @param key * @return * / @Override public objet getObject (objet key) {try {redetetemplate reistetemplate = getRedistEemplate (); ValueOperations opsForValue = redetemplate.opsForValue (); Logger.debug ("Get Cached Query Resultation de Redis"); System.out.println ("****" + opsforvalue.get (key) .toString ()); return opsforvalue.get (key); } catch (Throwable T) {Logger.Error ("redis est échoué, échec sur db", t); retourner null; }} / ** * Supprimez le résultat de la requête en cache de redis * * @param key * @return * / @Override @SuppressWarnings ("Unchecked") Objet public SupportObject (objet Key) {try {redemplate redetemplate = getreDisteTemplate (); Redistetemplate.delete (clé); Logger.debug ("Supprimer le résultat de la requête en cache de redis"); } catch (throwable t) {logger.error ("redis supprimé a échoué", t); } return null; } / ** * Effiche cette instance de cache * / @Override public void clear () {redetemplate reidemplate = getRedistEemplate (); Redistemplate.ExECUTE ((redécallback) Connection -> {connection.flushdb (); return null;}); Logger.debug ("effacer tous les résultats de la requête en cache de redis"); } / ** * Cette méthode n'est pas utilisée * * @return * / @Override public int getSize () {return 0; } @Override public readWriteLock getReadWriteLock () {return readWriteLock; } private reidemplate getRedistEemplate () {if (redetemplate == null) {redetemplate = applicationContexTholder.getBean ("redetemplate"); } return reidemplate; }}5. L'interface sérialisable doit être implémentée dans la classe d'entité et le numéro de séquence doit être déclaré.
Final statique privé long SerialVersionUID = -2566441764189220519L;
6. Allumez le cache de niveau 2 de Mybatis
Configurer dans le fichier de configuration pom.xml
mybatis.configuration.cache-compatible = true
Ajouter à l'interface du mappeur
@Cachenamespace (implémentation = (com.demo.testdemo.cache.rediscache.class))
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.