SSM+Redis -Integration
Das SSM -Framework wurde bereits zuvor erstellt, sodass hier kein Codeskopieren durchgeführt wird.
Hier verwenden wir hauptsächlich Redis, um den sekundären Cache von MyBatis zu machen. Alle Auswahl in der MyBaits -Zuordnungsdatei aktualisieren den vorhandenen Cache. Wenn es nicht existiert, wird ein neuer Cache erstellt. Alle Einfügen- und Aktualisierungsvorgänge aktualisieren den Cache.
Die Vorteile von Redis sind ebenfalls offensichtlich, was die Datenzugriffsleistung des Systems erhöhen kann. Dieser Abschnitt zeigt nur die Integrationsmethoden und Effekte und wird später durch Artikel, die Redis -Cluster, Lastausgleich und Sitzungen teilen, ergänzt.
Beginnen wir mit der Integrationsarbeit:
Das Backend beginnt zuerst (die Methode zum Starten und der remote-Verbindung zu Linux-Diensten erfordert die Änderung der Datei redis.conf) und starten Sie den Befehl "./Src/Redis-Server ./Redis.conf".
Ich habe es unter Windows -System entwickelt. Ich empfehle ein visuelles Tool "Redis Desktop Manager". Es erfordert eine Remoteverbindung zu Redis unter Linux, und der Port muss unter Linux für die Öffentlichkeit geöffnet werden (mit der spezifischen Methode besteht die Änderung der Datei/etc/sysconfig/iptables und addiert externe Portentwicklungsbefehle).
Nachdem alle oben genannten Vorgänge abgeschlossen sind, ist die Remote -Verbindung erfolgreich, wie in der Abbildung gezeigt:
Es gibt noch keinen Cache -Datensatz. Geben Sie die Codestufe ein. Fügen Sie zunächst das erforderliche Redis -JAR -Paket zu pom.xml hinzu.
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.6.2.RELEASE</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-ehcache</artifactId> <version>1.0.0</version> </dependency> <!-- Add druid connection pool package--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.24</version> </abhängig>
Nachdem der pom.xml geschrieben wurde, müssen zwei neue Konfigurationsdateien hinzugefügt werden: redis.properties
redis.host = 192.168.0.109Redis
Die Felder sind auch leicht zu verstehen und fügen dann die Konfigurationsdatei hinzu: Spring-reDis.xml
<beans xmlns = "http://www.springframework.org/schema/bean xmlns: mvc = "http://www.springframework.org/schema/mvc" xmlns: util = "http://www.spingframework.org/schema/util" xmlns: aoop = "http://wwwwwww.Sch./Atp./wwww.spingframework xmlns: context = "http://www.springframework.org/schema/context" xmlns: task = "http://www.spingframework.org/schema/task" xsi: schemalocation = "http://wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww.Stask.Sch. http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-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.springframe.org/schema/aop/sping- http://www.springframework.org/schema/context http://www.springFramework.org/schema/context/spring-context-4.3.xsd "> <!-Basic-Parameter-Konfiguration des Anschlusspools, ähnlichem Datenträgerpool. /> <bean id = "poolconfig"> <Eigenschaft name = "maxtotal" value = "$ {redis.maxactive}"/> <Eigenschaft name = "maxidle" value = "$ {redis.maxidle}"/> <Eigenschaft name = "testonborrow" value = "$ {{redis.Teston-cononction. Pool-> <bean id = "jedisconnectionFactory"> <Eigenschaft name = "hostname" value = "$ {redis.host}"> </property> <Eigenschaft name = "port" value = "$ {redis.port}"> </Property> <Property name = "Passage" value = "$ {redis.pass}"> </</</</</</</</</</</</</</</</</</</</</</</</</</Property = "PoolNig" $ {paper. ref = "poolconfig"> </property> </bean> <!-call Connection Pool Factory-Konfiguration-> <!-<bean id = "redistemplate"> <property name = "jedisconnectionFactory" Ref = "JedisconnectionFactory"> </property> Wenn Serializer nicht konfiguriert ist, wird beim Stieren intelligent nicht konfiguriert. Wenn Sie den Benutzertyp zum Speichern verwenden, fordert ein Fehlernutzer nicht in die String ein! ! ! <Eigenschaft name = "keyserializer"> <bean/> </property> <property name = "valuerializer"> <bean/> </property> </bean> -> <bean id = "rediscachetRansfer"> <Property Name = "Nachdem die Konfigurationsdatei geschrieben wurde, schreiben Sie den Java -Code:
Jedisclusterfactory.java
Paket com.cjl.util; import Java.util.hashset; import Java.util.properties; import Java.util.set; import Java.util.regex.pattern; org.springframework.beans.factory.initializingBean; import org.springframework.core.io.resource; import REDIS.Clients.jedis.Hostandport; private String addressKeyprefix; Privat Jediscluster Jediscluster; private Ganzzahl -Zeitüberschreitung; private Ganzzahl Maxredirections; Private GenericObjectPoolConfig GenericObjectPoolConfig; private muster p = muster.comPile ("^.+[:] // d {1,5} // s*$"); public Jediscluster getObject () löst Ausnahme aus {return Jediscluster; } öffentliche Klasse <? erweitert jediscluster> getObjecttype () {return (this.jediscluster! } public boolean issingleton () {return true; } private set <HostandPort> ParseehostandPort () löst eine Ausnahme aus {try {Properties prop = new Properties (); prop.load (this.addressconfig.getInputStream ()); Set <Hostandport> HaSps = new Hashset <Hostandport> (); für (Objektschlüssel: prop.keyset ()) {if (! ((String) -Staste) .Startswith (addressKeyprefix)) {Fortsetzung; } String val = (String) prop.get (Schlüssel); boolean isipport = p.matcher (val) .patches (); if (! issipport) {werfen neuer illegalArgumentException ("IP oder Port ist illegal"); } String [] ipandport = val.split (":"); Hostandport hap = new Hostandport (Ipandport [0], Integer.ParseInt (ipandport [1])); haps.add (hap); } return HaSps; } catch (illegalArgumentException ex) {throw ex; } catch (Ausnahme ex) {neue Ausnahme werfen ("Parse Jedis -Konfigurationsdatei fehlgeschlagen", ex); }} public void AfterPropertieStieSt () löst Ausnahme aus {set <HostandPort> HaSps = this.parsehostandport (); jediscluster = new Jediscluster (HAPS, Timeout, MaxRedirections, GenericObjectPoolConfig); } public void setAddressConfig (Ressourcenadressconfig) {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 (genericObjectPoolConfig genericObjectPoolConfig) {this.genericObjectPoolConfig = GenericObjectPoolConfig; }}Rediscache.java
Paket com.cjl.util; import java.util.concurrent.locks.readwritelock; import Java.util.concurrent org.springframework.data.redis.connection.jedis.jedisconnection; Import org.springFramework.data.redis.connection.jedis.jedisconnectionFactory; Imporation org org.springFramework.data.redis.serializer.Redisserializer; import redis.clients.jedis.exceptions.jedisconnectionException; public class rediscache implements cache {private statische statische logger logger logger = loggerfactory.getLogger (rediscache.class); privat statische JedisconnectionFactory JedisconnectionFactory; private endgültige String -ID; Private Final ReadWriteLock RWL = New ReentranTreadWriteLock (); public rediscache (endgültige String -ID) {if (id == null) {neue illegalArgumentException ("Cache -Instanzen erfordern eine ID"); } logger.debug ("mybatisrediscache: id =" + id); this.id = id; } / *** Alle Caches löschen* / public void clear () {rwl.readlock (). Lock (); Jedisconnection connection = null; try {Connection = jedisconnectionFactory.getConnection (); connection.flushdb (); Connection.Flushall (); } catch (jedisconnectionException e) {e.printstacktrace (); } endlich {if (connection! = null) {connection.close (); } rwl.readlock (). Unlock (); }} public String getId () {return this.id; } / *** die Gesamtzahl der Caches erhalten* / public int getSize () {int result = 0; Jedisconnection connection = null; try {Connection = jedisconnectionFactory.getConnection (); result = Integer.ValueOf (Connection.dbsize (). toString ()); logger.info ("Mybaits sekundäre Cache -Nummer hinzufügen:" + Ergebnis); } catch (jedisconnectionException e) {e.printstacktrace (); } endlich {if (connection! = null) {connection.close (); }} Rückgabeergebnis; } public void putObject (Objektschlüssel, Objektwert) {rwl.writeLock (). lock (); Jedisconnection connection = null; try {Connection = jedisconnectionFactory.getConnection (); Redisserializer <Object> serializer = new JdkSerializationReDisSerializer (); Connection.Set (serializeUtil.Serialize (Schlüssel), SerializeUtil.Serialize (Wert)); logger.info ("Mybaits sekundäre cache key =" + taste + ", value =" + value); } catch (jedisconnectionException e) {e.printstacktrace (); } endlich {if (connection! = null) {connection.close (); } rwl.writeLock (). Unlock (); }} public Object getObject (Objektschlüssel) {// Daten aus dem Cache abrufen. Fügen Sie zuerst die Lesesperrung rwl.readlock (). Lock (); Objektergebnis = null; Jedisconnection connection = null; try {Connection = jedisconnectionFactory.getConnection (); Redisserializer <Object> serializer = new JdkSerializationReDisSerializer (); result = Serializer.Deserialize (Connection.get (Serializer.Serialize (Schlüssel))); logger.info ("MyBaits Level 2 Cache, Value =" + Ergebnis); } catch (jedisconnectionException e) {e.printstacktrace (); } endlich {if (connection! = null) {connection.close (); } rwl.readlock (). Unlock (); } Rückgabeergebnis; } public Object removeObject (Objektschlüssel) {rwl.writeLock (). lock (); Jedisconnection Connection = null; Objektergebnis = null; try {Connection = jedisconnectionFactory.getConnection (); Redisserializer <Object> serializer = new JdkSerializationReDisSerializer (); result = Connection.expire (Serializer.Serialize (Schlüssel), 0); } catch (jedisconnectionException e) {e.printstacktrace (); } endlich {if (connection! = null) {connection.close (); } rwl.writeLock (). Unlock (); } Rückgabeergebnis; } public static void setjedisconnectionFactory (JedisconnectionFactory JedisconnectionFactory) {rediscache.jedisconnectionFactory = jedisconnectionFactory; } public readWriteLock getReadWriteLock () {// Todo automatisch generierte Methode Stub return rwl; }}Rediscachetransfer.java
Paket com.cjl.util; import org.springframework.bean.factory.annotation setJedisconnectionFactory (JedisconnectionFactory JedisconnectionFactory) {rediscache.setjedisconnectionFactory (jedisconnectionFactory); }}SerializeUtil.java
Paket com.cjl.util; import Java.io.BytearrayInputStream; Import Java.io.BytearrayoutputStream; Import Java.io.objectinputStream; {ObjectOutputStream OOS = NULL; BytearrayoutputStream baos = null; try {// serialization baos = new bytearrayoutputStream (); OOS = new ObjectOutputStream (Baos); OOS.WriteObject (Objekt); byte [] bytes = baos.tobytearray (); Rückkehr Bytes; } catch (Ausnahme e) {e.printstacktrace (); } return null; } / ***Deserialisierung* / öffentliches statisches Objekt unserialisieren (byte [] bytes) {if (bytes! = Null) {bytearrayinputStream bais = null; Versuchen Sie {// Deserialize bais = new bytearrayInputStream (Bytes); ObjectInputStream OIS = New ObjectInputStream (BAIS); return ois.readObject (); } catch (Ausnahme e) {}} return null; }}Nachdem alles fertig ist, müssen Sie die Zuordnungsdatei ändern
Um den MyBaits -Cache effektiv zu machen, müssen Sie auch den sekundären Cache aktivieren, wie in der obigen Abbildung gezeigt. Die Konfigurationsdatei muss auch in web.xml geladen werden, um wirksam zu werden
Wenn alles fertig ist, starten Sie den Service
Nach dem Erfolg des Startups kann das Klicken auf das Mitarbeiterformular die Methode zur Abfrage aller Mitarbeiter auslösen. Wenn die Abfrageanweisung zum ersten Mal durchgeführt wird, können Sie feststellen, dass MyBatis die Abfrageanweisung gedruckt und einen Cache auf dem Redis -Server aktualisiert hat.
Wir löschen die Konsole und klicken auf die Schaltfläche Mitarbeiter der Abfrage, um die Abfragemethode auszuführen. Wir können sehen, dass keine Abfrageanweisung ausgeführt wird, um zu beweisen, dass die zweite Abfrage den Wert direkt aus dem Cache nimmt und keine Verbindung zu MySQL für die Abfrage besteht.
Zusammenfassen
Das obige ist die Integrationsmethode von Redis und SSM (MyBatis Level 2 Cache), die Ihnen vom Editor vorgestellt wurden. Ich hoffe, es wird für alle hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird allen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!