Intégration SSM + Redis
Le cadre SSM a déjà été construit, donc aucune copie de code n'est effectuée ici.
Ici, nous utilisons principalement Redis pour faire du cache secondaire de Mybatis. Tous les sélections dans le fichier de mappage des mybaits actualiseront le cache existant. S'il n'existe pas, un nouveau cache sera créé. Toutes les opérations d'insertion et de mise à jour mettront à jour le cache.
Les avantages de Redis sont également évidents, ce qui peut augmenter les performances d'accès aux données du système. Cette section ne montre que les méthodes et les effets d'intégration, et sera complété plus tard par les articles partageant des clusters Redis, l'équilibrage de la charge et les séances.
Commençons le travail d'intégration:
Le backend démarre d'abord (la méthode de démarrage et de connexion à distance aux services Linux nécessite de modifier le fichier redis.conf) et de démarrer la commande "./src/redis-server ./redis.conf"
Je l'ai développé sous Windows System. Je recommande un outil visuel "Redis Desktop Manager". Il nécessite une connexion distante à Redis dans Linux, et le port doit être ouvert au public sous Linux (la méthode spécifique consiste à modifier le fichier / etc / sysconfig / iptables et à ajouter des commandes de développement de port externes).
Une fois toutes les opérations ci-dessus terminées, la connexion distante sera réussie, comme indiqué sur la figure:
Il n'y a pas encore de dossier de cache. Entrons l'étape du code. Tout d'abord, ajoutez le package Redis requis à pom.xml.
<dependency> <proupId> redis.clients </rom grouped> <Artifactid> jedis </letifactid> <version> 2.9.0 </ version> </dependency> <dependency> <proupId> org.springframework.data </proupId> <Artifactid> Spring-data-redis </ptetifactid> <version> 1.6.2.Release </dependence> </ version> 1.6.2.22 <GroupId> org.mybatis </prouprid> <letifactid> mybatis-ehcache </ artifactid> <version> 1.0.0 </-version> </dependency> <! - Ajouter le package de piscine de connexion Druid -> <dependency> <proupId> com.alibaba </proupId> <Artifactid> druid </rtifactid> </Dependance>
Une fois le pom.xml écrit, deux nouveaux fichiers de configuration doivent être ajoutés: redis.properties
redis.host = 192.168.0.109redis.port = 6379redis.pass = 123456redis.maxidle = 200redis.maxactive = 1024redis.maxwait = 10000redis.testonBorrow = True
Les champs sont également faciles à comprendre, puis ajouter le fichier de configuration: spring-redis.xml
<Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns: p = "http://www.springfrrame xmlns: mvc = "http://www.springframework.org/schema/mvc" xmlns: util = "http://www.springframework.org/schema/util" xmlns: aop = "http:" xmlns: context = "http://www.springframework.org/schema/context" xmlns: task = "http://www.springframework.org/schema/task" xsi: schemalocation = "http://www.springfrramework.org/schema/Beans http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsdd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd "> <! - Configuration de paramètre de base de la connexion Pool, similaire à Database Pool -> <Contexte: <pare-location d'emplacement de l'emplacement =" ClassPath *: Redis.propers " id = "poolConfig"> <propriété name = "maxtotal" value = "$ {redis.maxactive}" /> <propriété name = "maxidle" value = "$ {redis.maxidle}" /> <propriété name = "testonBorrow" value = "$ {redis.testonBorrow}" /> </EAND> <! id = "JedisconnectionFactory"> <propriété name = "hostname" value = "$ {redis.host}"> </ propriété> <propriété name = "port" value = "$ {redis.port}"> </ propriété> propriété = propriété = "PoolConfig" Ref = "PoolCon"> </ / propriété> </ Property Name = "PoolConfig" </EAN> <! - Connex Connexion Configuration d'usine de pool -> <! - <bean id = "redesttemplate"> <propriété name = "jedisconnectionfactory" ref = "jedisconnectionfactory"> </ / propriété> Si le sérialiseur n'est pas configuré, utilisez la chaîne intelligemment lors du stockage. Si vous utilisez le type d'utilisateur pour stocker, il invitera une erreur que l'utilisateur ne peut pas lancer en chaîne! ! ! <propriété name = "keySerializer"> <an bean /> </ propriété> <propriété name = "ValueRializer"> <Eban /> </ Property> </ Bean> -> <Bean Id = "RedisCachetRansfer"> <propriété name = "JedisconnectionFactory" Ref = "JedisconnectionFactory" /> </ank> </ Beans>Une fois le fichier de configuration écrit, commencez à écrire le code Java:
Jedisclusterfactory.java
package com.cjl.util; import java.util.hashset; import java.util.properties; import java.util.set; import java.util.regex.pattern; import org.apache.commons.pool2.impl.gerericobjectpoolconfig; import org.springframework.Beans.factory.factory. org.springframework.beans.factory.InitializingBean;import org.springframework.core.io.Resource;import redis.clients.jedis.HostAndPort;import redis.clients.jedis.JedisCluster;public class JedisClusterFactory implements FactoryBean<JedisCluster>, InitializingBean { private Resource addressConfig; chaîne privée AdresseKeyPreFix; Jediscluster privé Jediscluster; Timeout entier privé; Maxredirections entières privées; private genericObjectPoolConfig genericObjectPoolConfig; Modèle privé p = motif.compile ("^. + [:] // d {1,5} // s * $"); public Jediscluster getObject () lève une exception {return jediscluster; } classe publique <? étend Jediscluster> getObjectType () {return (this.JeDiscluster! = null? this.jedescluster.getClass (): jediscluster.class); } public boolean issingleton () {return true; } set privé <hostandport> parsehostandport () lève l'exception {try {Properties prop = new Properties (); Prop.Load (this.addressconfig.getInputStream ()); Set <hostandport> hasps = new hashset <hostandport> (); for (object key: Prop.KeySet ()) {if (! ((string) key) .startswith (AddressKeyPreFix)) {continuant; } String val = (string) prop.get (key); booléen iSipport = p.matcher (val) .matches (); if (! Isipport) {lancer un nouveau IllégalArgumentException ("IP ou port est illégal"); } String [] ipandport = val.split (":"); HostAndort hap = new hostandport (ipandport [0], Integer.ParseInt (ipandport [1])); haps.add (hap); } return hasps; } catch (illégalArgumentException ex) {throw ex; } catch (exception ex) {lancez une nouvelle exception ("Parse Jedis Configuration Fichier a échoué", ex); }} public void AfterProperTiESSet () lève une exception {set <hostandport> hasps = this.parsehostandport (); jediscluster = new Jediscluster (haps, timeout, maxredirections, genericObjectPoolConfig); } public void setAddressConfig (Resource AddressConfig) {this.addressConfig = AddressConfig; } public void setTimeout (int timeout) {this.timeout = timeout; } public void setMaxRedirections (int maxredirections) {this.maxredirections = maxredirections; } public void setAddressKeyPreFix (String AddressKeyPreFix) {this.addressKeyPrefix = AddressKeyPreFix; } public void SetGenericObjectPoolConfig (générique-objetPoolConfig genericObjectPoolConfig) {this.GenericObjectPoolConfig = généricObjectPoolConfig; }}Rediscache.java
package com.cjl.util; importer java.util.concurrent.locks.readwritelock; import java.util.concurrent.locks.reentrantreadwritelock; import org.apache.ibatis.cache.cache; import org.slf4j.logger; import org.slf4j.loggerfactory; import org.springframework.data.redis.connection.jedis.jedeconnection; import org.springframework.data.redis.connection.jedis.jedisconnectionfactory; import org.springframework.data.redis.serializer.jdkserializationRediserializer; Importa.redris. org.springframework.data.redis.serializer.redisserializer; import redis.clients.jedis.exception.JeDisconnectionException; public class rediscache implémente cache {private static Logger Logger = loggerfactory.getLogger (rediscache.class); Jedisconnection statique privée JedisconnectionFactory Jedisconnection; ID de chaîne finale privée; Private Final ReadWriteLock Rwl = new ReentRanTreadWriteLock (); public rediscache (Final String id) {if (id == null) {throw new illégalArgumentException ("Les instances de cache nécessitent un id"); } logger.debug ("mybatisrediscache: id =" + id); this.id = id; } / ** * effacer tous les caches * / public void clear () {rwl.readlock (). Lock (); Connexion de jedisconnection = null; try {connection = jedisconnectionfactory.getConnection (); connection.flushdb (); connection.flushall (); } catch (JedisconnectionException e) {e.printStackTrace (); } enfin {if (connection! = null) {connection.close (); } rwl.readlock (). unlock (); }} public String getID () {return this.id; } / ** * Obtenez le nombre total de caches * / public int getSize () {int result = 0; Connexion de jedisconnection = null; try {connection = jedisconnectionfactory.getConnection (); result = Integer.ValueOf (connection.dbSize (). ToString ()); Logger.info ("Ajouter le numéro de cache secondaire des Mybaits:" + résultat); } catch (JedisconnectionException e) {e.printStackTrace (); } enfin {if (connection! = null) {connection.close (); }} Retour Résultat; } public void putObject (clé d'objet, valeur objet) {rwl.writelock (). Lock (); Connexion de jedisconnection = null; try {connection = jedisconnectionfactory.getConnection (); Redisserializer <Bject> Serializer = new JDKSerializationDisserializer (); connection.set (serializeUtil.serialize (key), serializeUtil.serialize (valeur)); Logger.info ("Ajouter Mybaits Cache secondaire Key =" + Key + ", Value =" + Value); } catch (JedisconnectionException e) {e.printStackTrace (); } enfin {if (connection! = null) {connection.close (); } rwl.writelock (). unlock (); }} public objet getObject (clé d'objet) {// Obtenez d'abord des données du cache, ajoutez le verrouillage de lecture rwl.readlock (). Lock (); Résultat de l'objet = null; Connexion de jedisconnection = null; try {connection = jedisconnectionfactory.getConnection (); Redisserializer <Bject> Serializer = new JDKSerializationDisserializer (); result = serializer.deserialize (connection.get (serializer.serialize (key))); Logger.info ("Hit Mybaits Level 2 Cache, Value =" + Result); } catch (JedisconnectionException e) {e.printStackTrace (); } enfin {if (connection! = null) {connection.close (); } rwl.readlock (). unlock (); } Retour Résultat; } Objet public SupporObject (Key Object) {rwl.WriteLock (). Lock (); Connexion de jedisconnection = null; Résultat de l'objet = null; try {connection = jedisconnectionfactory.getConnection (); Redisserializer <Bject> Serializer = new JDKSerializationDisserializer (); result = connection.expire (serializer.serialize (key), 0); } catch (JedisconnectionException e) {e.printStackTrace (); } enfin {if (connection! = null) {connection.close (); } rwl.writelock (). unlock (); } Retour Résultat; } public static void setJeDisconnectionFactory (JedisconnectionFactory JedisconnectionFactory) {rediscache.JeDisconnectionFactory = JedisconnectionFactory; } public readWriteLock getReadWriteLock () {// TODO Méthode générée automatique Stub return Rwl; }}Rediscachetransfer.java
package com.cjl.util; import org.springframework.beans.factory.annotation.autowired; import org.springframework.data.redis.connection.jedis.jedeconnectionfactory; / ** * Injection statique de classes intermédiaires * / public class rediscachetransfer {@Autowired Public Void Public Void. setJeDisconnectionFactory (JedisconnectionFactory JedisconnectionFactory) {rediscache.setJeDisconnectionFactory (JedisconnectionFactory); }}Serializeutil.java
Package com.cjl.util; import java.io.bytearrayinputStream; import java.io.bytearrayoutputStream; import java.io.objectInputStream; import java.io.objectOutStream; / ** * * @author cjl * * / public class serializeutil {/ ** * sérialisation * / public Static byte [ objet) {objectOutputStream oos = null; ByteArrayOutputStream baos = null; try {// serialization baos = new bytearrayoutputStream (); OOS = new ObjectOutputStream (BAOS); oos.writeObject (objet); octet [] bytes = baos.toByteArray (); RETOUR des octets; } catch (exception e) {e.printStackTrace (); } return null; } / ** * désérialisation * / objet statique public Unserialize (byte [] octets) {if (bytes! = Null) {bytearRayInputStream bais = null; essayez {// désérialiser bais = new ByteArrayInputStream (octets); ObjectInputStream oiS = new ObjectInputStream (bais); return ois.readObject (); } catch (exception e) {}} return null; }}Une fois que tout est prêt, vous devez modifier le fichier de mappage
Pour rendre le cache Mybaits efficace, vous devez également activer le cache secondaire comme indiqué dans la figure ci-dessus. Le fichier de configuration doit également être chargé dans web.xml pour prendre effet
Quand tout est prêt, commencez le service
Une fois le démarrage qui réussit, cliquer sur le formulaire des employés peut déclencher la méthode d'interrogation de tous les employés. Lorsque l'instruction de requête est effectuée pour la première fois, vous pouvez voir que MyBatis a imprimé l'instruction de requête et mis à jour un cache dans le serveur Redis.
Nous effacons la console et cliquez sur le bouton de l'employé de requête pour exécuter la méthode de requête. Nous pouvons voir qu'aucune instruction de requête n'est exécutée, prouvant que la deuxième requête prend directement la valeur du cache, et il n'y a pas de connexion à MySQL pour la requête.
Résumer
Ce qui précède est la méthode d'intégration de Redis et SSM (MyBatis Level 2 Cache) vous a présenté par l'éditeur. J'espère que ce sera utile à tout le monde. Si vous avez des questions, veuillez me laisser un message et l'éditeur répondra à tout le monde à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!