Kapitel 1 Anforderungenanalyse
Es ist geplant, Redis hinzuzufügen, um die Cache -Verarbeitung im Open -Source -Projekt des Teams zu implementieren. Da die Geschäftsfunktionen teilweise implementiert wurden, indem Redis-Tool-Klassen geschrieben und sich dann auf sie bezieht, ist die Menge der Änderungen groß, und die Entkopplung kann nicht erreicht werden.
Open Source -Projekt: https://github.com/u014427391/jeepatform
Kapitel 2 Einführung in Springboot
Als wichtiges Open -Source -Framework im Bereich Javaee Framework spielt Spring Framework eine wichtige Rolle bei der Entwicklung von Unternehmensanwendungen. Gleichzeitig sind Spring -Framework und seine Unterrahmen viel, sodass die Menge an Wissen sehr breit ist.
SpringBoot: Ein Unterrahmen des Spring -Frameworks, auch MicroFramework genannt, ist ein Rahmen, das 2014 eingeführt wurde, das die Entwicklung des Spring -Frameworks erleichtert. Nach dem Erlernen des Wissens über Spring -Frameworks erfordern Spring Frameworks unweigerlich viel XML. Wenn Sie Springboot -Frameworks verwenden, können Sie die Annotationsentwicklung verwenden, um die Entwicklung basierend auf Spring -Frameworks erheblich zu vereinfachen. Springboot nutzt den Konfigurationsmodus von Javaconfig und das Konzept der "Konvention ist besser als Konfiguration", wodurch die Entwicklung von Webanwendungen und REST -Diensten basierend auf SpringMVC erheblich vereinfacht werden kann.
Kapitel 3 Einführung in Redis
3.1 Redis -Installation und -Bereitstellung (Linux)
Für die Redis -Installation und -Anpropion finden Sie in meinem Blog (Redis wird basierend auf C geschrieben. Installieren Sie den GCC -Compiler vor der Installation): //www.vevb.com/article/79096.htm
3.2 Einführung in Redis
Redis ist jetzt zu einer der beliebtesten In-Memory-Datenbanken in der Webentwicklungsgemeinschaft geworden. Mit der raschen Entwicklung von Web2.0 und dem Anstieg des Anteils der halbstrukturierten Daten haben Websites immer mehr Anforderungen an eine effiziente Leistung.
Darüber hinaus haben große Websites im Allgemeinen Hunderte oder mehr Redis -Server. Als leistungsstarkes System hat Redis seine eigene Verwendung, sei es Speicher-, Warteschlangen- oder Cache -System.
Für den Einstieg mit Springboot Framework finden Sie im vorherigen Artikel: http://www.vevb.com/article/111197.htm
Kapitel 4 Redis -Cache -Implementierung
4.1 Das folgende Strukturdiagramm
Projektstrukturdiagramm:
4.2 Springboot -YML -Dateikonfiguration
Fügen Sie die Konfiguration von Application.yml unter der Ressource hinzu, wobei MySQL, Druid und Redis hauptsächlich konfiguriert sind
Frühling: DataSource: # Hauptdatenquelle Shop: URL: JDBC: MySQL: //127.0.0.1: 3306/Jeepatform? AutoreConnect = True & UseUnicode = True & Charactercoding = Utf8 & ZeichensEsults = Utf8 & Usessl = False Username: Root-Treiber-Klassen-NAME: com.alibaba.druid.pool.druiddataSource # Verbindungspool-Einstellungen Druid: Initialgröße: 5 min-idle: 5 max-active: 20 # Konfigurieren Sie die Zeit, um die Wartezeit-Timeout Max-Wait-60000-Konfiguration zu erhalten, wie lange es dauert, um ein Erkennungsintervall zu erfassen. Konfigurieren Sie die minimale Zeit, um im Pool zu überleben, in Millisekunden min-evikable-idle-Zeitmillis: 300000 # oracle Bitte verwenden Max-pool-vorbereitete Voraussetzung-per-Connection-Größe: 20 # Filter für die Überwachung der Statistiken zum Abnehmen konfigurieren. Nach dem Entfernen der Überwachungsschnittstelle kann SQL nicht gezählt werden, "Wand" wird für Firewall -Filter verwendet: STAT, Wand, SLF4J # Open MergesQL -Funktion über die Eigenschaft ConnectProperties; slow SQL records connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 # Merge monitoring data of multiple DruidDataSource use-global-data-source-stat: true jpa: database: mysql hibernate: show_sql: true format_sql: true ddl-auto: none naming: physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl mvc: view: prefix: /WEB-INF/jsp/ suffix: .jsp #Jedis configuration jedis: pool: host: 127.0.0.1 port: 6379 password: password timeout: 0 config: maxTotal: 100 maxIdle: 10 Maxwaitmillis: 100000
Schreiben Sie eine Konfigurationsklasse, um die Konfiguration zu starten jedisconfig.java:
Paket org.muses.jeepatform.config; import org.springframework.bean.factory.annotation org.springFramework.boot.autoconfigure.condition.conditionalonmissingbean; import org.springFramework.boot.context.properties.ConfigurationProperties; importieren org.springFramework.Annotation.Bean; redis.clients.jedis.jedispool; import redis.clients.jedis.jedispoolconfig; @configuration //@configurationProperties (Präfix = jedisconfig.jedis_prefix) public class jedisconfig {// public static final string jedis_prefix = "jedis"; @Bean (name = "Jedispool") @autowired Public Jedispool Jedispool (@Qualifier ("Jedispoolconfig") Jedispoolconfig Config, @Value ("$ {Spring.jedis.pool.host}") String Host, @value ("$ {{Spring.Jedis.Pool.Pool.Pool.Pool.Pool.Pool.Pool.Pool.Pool.Pool.Pool.Pool.Pool.Pool.Pool.Pool.Pool.Pool.Pool.Pool.PORE}". @Value ("$ {spring.jedis.pool.timeout}") int timeout, @Value ("$ {spring.jedis.pool.password}") String -Passwort) {neu Jedispool zurückgeben (config, host, port, timeout, kennwort); } @Bean(name= "jedisPoolConfig") public JedisPoolConfig jedisPoolConfig (@Value("${spring.jedis.pool.config.maxTotal}")int maxTotal, @Value("${spring.jedis.pool.config.maxIdle}")int maxIdle, @Value ("$ {spring.jedis.pool.config.maxwaitmillis}") int maxwaitmillis) {jedispoolconfig config = new JedispoolConfig (); config.setMaxtotal (maxotal); config.setMaxIdle (maxidle); config.setMaxwaitmillis (maxwaitmillis); Rückgabekonfiguration; }}4.3 Meta-Annotationsklassen Schreiben
Schreiben Sie eine Meta -Annotationsklasse rediscache.java. Alle durch die modifizierten Annotation definierten Klassen werden automatisch in der AOP -Cache -Verarbeitung implementiert.
Paket org.Muses.jeepatform.Annotation; import org.muses.jeepatform.common.rediscazenamespace; import Java.lang.Annotation. {// rediscaTenamespace namespace ();} Zusätzlich zur Aufbewahrung gibt es drei weitere Anmerkungen von JDK 5, nämlich das Ziel, erbelt und dokumentiert. Basierend darauf können wir benutzerdefinierte Meta -Anmerkungen implementieren
Wir setzen rediscache auf die auf Methodenmethodenebene auf die Referenz.
1.RetentionPolicy.Source Diese Art von Anmerkungen ist nur auf der Ebene der Quellcode reserviert und während der Zusammenstellung ignoriert.
2. Die RetentionPolicy.klasse Diese Art von Anmerkungen wird während der Zusammenstellung beibehalten und existiert in der Klassendatei, aber die JVM wird sie ignorieren.
3.. RetentionPolicy.Runtime Diese Art von Anmerkungen werden vom JVM reserviert, sodass sie von dem JVM oder einem anderen Code gelesen und verwendet werden können, der zur Laufzeit Reflexionsmechanismen verwendet.
4.4 Rufen Sie Jedispool an, um die Redis -Cache -Verarbeitung zu implementieren
Paket org.muses.jeepatform.cache; import org.springframework.bean.factory.annotation javax.annotation.resource; @component ("rediscache") öffentliche Klasse Rediscache {@autowired Private Jedispool Jedispool; Privat Jedispool getJedispool () {return jedispool; } public void setjedispool (Jedispool Jedispool) {this.jedispool = jedispool; } / ** * Daten von Redis cache * @param rediskey * @return * / public Object getDatafromRedis (String rediskey) {jedis jedis = jedispool.getResource () abrufen; byte [] bytearray = jedis.get (rediskey.getBytes ()); if (bytearray! } return null; } / ** * Daten speichern in redis * @param rediskey * / public String savedatatoredis (String Rediskey, Object OBJ) {byte [] bytes = serializeUtil.serialize (obj); Jedis jedis = jedispool.getResource (); String code = jedis.set (rediskey.getBytes (), bytes); Rückgabecode; }}Objekt -Serialisierungswerkzeugklasse:
Paket org.muses.jeepatform.cache; import java.io. BytearrayoutputStream baos = null; try {baos = new bytearrayoutputStream (); OOS = new ObjectOutputStream (Baos); OOS.WriteObject (OBJ); byte [] bytearray = baos.tobytearray (); Bytearray zurückkehren; } catch (ioException e) {e.printstacktrace (); } return null; } / ** * Deserialize Object * @param bytearray * @return * / public statisches Objekt unserialisieren (byte [] bytearray) {bytearrayInputStream bais = null; Versuchen Sie {// Deserialize to Object bais = new bytearrayInputStream (Bytearray); ObjectInputStream OIS = New ObjectInputStream (BAIS); return ois.readObject (); } catch (Ausnahme e) {e.printstacktrace (); } return null; }} Hier erinnere ich mich, dass VO -Klassen serialisierbar implementieren müssen
Beispielsweise ist dies eine JPA-Mapping-Entitätsklasse, die Menüinformationen VO-Klasse ist
Paket org.Muses.jeepatform.core.entity.admin; import Javax.Persistence. / ** Menü -ID ** / private int mseuId; / ** überlegene ID **/ private int parentId; / ** Menüname **/ privat String Menuname; / ** Menüsymbol **/ privat String -Menüicon; / ** Menü -URL **/ privat String -Menüurl; / ** Menüentyp **/ privat String mennutype; / ** Menü Sortier **/ privater String -MenüOrder; / ** Menüstatus **/ privat String menustatus; Private List <Meens> Untermenü; privates Zeichenfolgenziel; privat boolean hassubmenu = false; öffentliches Menü () {Super (); } @Id @generatedValue (Strategy = GenerationType.Identity) public int getMenuid () {return this.Menuid; } public void setMenuId (intmenü) {this.Menuid = mseuId; } @Column (Länge = 100) public int getParentID () {return pentId; } public void setParentID (int parentId) {this.parentID = parentId; } @Column (Länge = 100) public String getMeName () {return this.Menuname; } public void setMenuname (String Menuname) {this.Menuname = Menuname; } @Column (Länge = 30) public String getMenuicon () {return this.menuicon; } public void setMenuicon (String -Menüicon) {this.Menuicon = Menüicon; } @Column (Länge = 100) public String getMenuurl () {return this.Menuurl; } public void setMenuurl (String mseuRl) {this.Menuurl = Menüurl; } @Column (Länge = 100) public String getMenutype () {return this.menutype; } public void setMenutype (String mENUType) {this.Menutype = Menutype; } @Column (Länge = 10) public String getMenuorder () {return mseuorder; } public void setMenuorder (String -MenüOrder) {this.Menuorder = MenüOrder; } @Column (Länge = 10) public String getMenustatus () {return menustatus; } public void setMenustatus (String menustatus) {this.Menustatus = Menustatus; } @Transient public List <Meens> getUbMenu () {return submenu; } public void setSubMenu (list <emuse> submenu) {this.subMenu = submenu; } public void settarget (String target) {this.target = target; } @Transient public String getTarget () {return target; } public void sethassubmenu (boolean hassubmenu) {this.hassubmenu = hassubmenu; } @Transient public boolean gethassubmenu () {return hassubmenu; }}4.5 Frühlings -AOP implementiert den Methode -Cache, der alle von @Rediscache kommuniziert überwacht
Holen Sie sich zuerst den Cache von Redis. Wenn Sie es nicht abfragen können, fragen Sie die MySQL -Datenbank und speichern Sie sie dann im Redis -Cache. Wenn Sie das nächste Mal nachfragen, rufen Sie den Redis -Cache direkt an.
Paket org.muses.jeepatform.cache; import org.aspespepy.lang.proceedingjoinpoint; import org.aspespedj.lang.Annotation.around; import org.aspespectj.lang.Annotation.Asspect; org.slf4j.loggerfactory; import org.springframework.beans.factory.annotation.autowired; {private static Final Logger logger = loggerfactory.getLogger (wiedervergeben.Class); @Autowired @Qualifier ("rediscache") private rediscache rediscache; /*** Methoden zur Abnahme aller Meta -Anmerkungen rediscache Annotationen* /@pointcut (" @Annotation (org.Muses.jeepatform.annotation.Rediscache)") public void pointcutMethod () {} /*** Für Surround -Verarbeitung erhalten Sie zuerst den Cache von Redis. Wenn Sie nicht abfragen können, fragen Sie die MySQL -Datenbank, * dann auf den Redis -Cache * @param Joinpoint * @Return */@around ("pointcutMethod ()"). String applid = null; Object [] args = joinpoint.getargs (); if (args! } // Die Klasse erhalten, in der sich die Zielmethode befindet, String target target = joinpoint.gettarget (). ToString className = target.split ("@") [0]; // den Methodennamen der Zielmethode String methodname = joinpoint.getSignature () erhalten. GetName (); // Redis -Schlüsselformat: Applid: Methode Name String rediskey = Applid + ":" + className + ". + methodName; Objekt obj = rediscache.getDatafromredis (Rediskey); if (obj! Logger.info ("Redis -Schlüsselwert:"+rediskey); Logger.info ("Rediswert Wert:"+obj.toString ()); Rückkehr obj; } Long EndTime = System.currentTimemillis (); Logger.info ("Redis-Cache-AOP-Verarbeitungszeit:"+(Endzeitstart)); Logger.info ("****************************************************************************"); try {obj = joinpoint.Procece (); } catch (throwable e) {e.printstacktrace (); } Logger.info ("********************************************************************************************************************************************************************************************); // Post-Set: Speichern Sie die in der Datenbank gefundenen Daten in Redis String code = rediscache.savedatatoredis (Rediskey, OBJ); if (code.equals ("ok")) {logger.info ("************ wurden erfolgreich auf Redis Cache gespeichert !!! **********"); Logger.info ("Redis -Schlüsselwert:"+rediskey); Logger.info ("Rediswert Wert:"+obj.toString ()); } return obj; }}Rufen Sie dann @Rediscache an, um Cache zu implementieren
/ ** * Menüinformationen über Menü -ID abrufen * @param id * @return */ @transactional @Rediscache Public Menü FindMenubyID (@Rediscachekey int id) {return MenurePository.findMenubymenuid (ID); }Die Methoden, die sich beim System anmelden und dann die @Rediscache -Annotation hinzufügen
Sie können sehen, dass Redis auf Cache gespeichert wird
Projektcode: https://github.com/u014427391/jeepatform
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.