Bab 1 Analisis Persyaratan
Direncanakan untuk menambahkan Redis untuk mengimplementasikan pemrosesan cache dalam proyek open source tim. Karena fungsi bisnis telah diimplementasikan sebagian, dengan menulis kelas alat Redis dan kemudian merujuk pada mereka, jumlah perubahannya besar, dan decoupling tidak dapat dicapai, jadi saya memikirkan AOP (pemrograman berorientasi sectional) dari kerangka kerja musim semi.
Proyek Sumber Terbuka: https://github.com/u014427391/jeepatform
Bab 2 Pengantar Springboot
Sebagai kerangka kerja open source yang penting di bidang Javaee Framework, Spring Framework memainkan peran penting dalam pengembangan aplikasi perusahaan. Pada saat yang sama, kerangka kerja musim semi dan subframenya banyak, sehingga jumlah pengetahuannya sangat luas.
Springboot: Subframe Framework Spring, juga disebut Microframework, adalah kerangka kerja yang diluncurkan pada tahun 2014 yang membuat pengembangan Spring Framework menjadi mudah. Setelah mempelajari semua pengetahuan tentang kerangka kerja musim semi, kerangka kerja musim semi pasti membutuhkan banyak XML. Jika Anda menggunakan kerangka kerja Springboot, Anda dapat menggunakan pengembangan anotasi untuk sangat menyederhanakan pengembangan berdasarkan kerangka kerja musim semi. Springboot memanfaatkan sepenuhnya mode konfigurasi JavaConfig dan konsep "Konvensi lebih baik dari konfigurasi", yang dapat sangat menyederhanakan pengembangan aplikasi web dan layanan REST berdasarkan SpringMVC.
Bab 3 Pengantar Redis
3.1 Instalasi dan Penyebaran Redis (Linux)
Untuk instalasi dan penyebaran Redis, silakan merujuk ke blog saya (Redis ditulis berdasarkan C, jadi instal kompiler GCC sebelum instalasi): //www.vevb.com/article/79096.htm
3.2 Pengantar Redis
Redis kini telah menjadi salah satu database dalam memori paling populer di komunitas pengembangan web. Dengan pengembangan Web2.0 yang cepat dan peningkatan proporsi data semi-terstruktur, situs web memiliki lebih banyak permintaan untuk kinerja yang efisien.
Selain itu, situs web besar umumnya memiliki ratusan atau lebih server Redis. Sebagai sistem yang kuat, Redis menggunakannya sendiri, apakah itu penyimpanan, antrian atau sistem cache.
Untuk memulai dengan Springboot Framework, silakan merujuk ke artikel sebelumnya: http://www.vevb.com/article/111197.htm
Bab 4 Redis Cache Implementasi
4.1 Diagram struktur berikut
Diagram Struktur Proyek:
4.2 Konfigurasi File YML Springboot
Tambahkan konfigurasi application.yml di bawah sumber daya, di mana mysql, druid, dan redis terutama dikonfigurasi
spring: datasource: # main data source shop: url: jdbc:mysql://127.0.0.1:3306/jeepatform?autoReconnect=true&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false username: root password: root driver-class-name: com.mysql.jdbc.Driver type: com.alibaba.druid.pool.druiddataSource # Pengaturan kumpulan koneksi Druid: ukuran awal: 5 min-idle: 5 max-aktif: 20 # Konfigurasikan waktu untuk mendapatkan waktu tunggu koneksi-tunggu-maks: 60000 # Konfigurasikan berapa lama untuk melakukan interval deteksi untuk mendeteksi koneksi idle yang diperlukan, yang diperlukan, mungkin harus ditutup, yang perlu ditutup, mungkin harus dapat ditutup, mungkin harus dapat ditutup, mungkin harus dapat ditutup, mungkin harus dapat ditutup, mungkin harus dapat ditutup, mungkin harus dapat ditutup, mungkin harus dapat ditutup, mungkin harus dapat ditutup, mungkin akan dapat ditutup. Konfigurasikan waktu minimum untuk bertahan hidup di kolam renang, dalam milidetik Min-eVictable-idle-time-millis: 300000 # oracle Harap gunakan Pilih 1 dari Dual Validation-Query: SELECT 'X' TEST-WHILE-IDLE: True Test-On-Borrow: False Test-on-Return: False # Open Pscache dan Tentukan ukuran PSCACHE-POP pada setiap koneksi-kumpulan-kumpulan: Max-Pool-Pretarement-Statement-Per-Connection-Size: 20 # Configure Filter untuk Memantau Statistik Pencegatan. Setelah menghapus antarmuka pemantauan, SQL tidak dapat dihitung, 'dinding' digunakan untuk filter firewall: stat, dinding, slf4j # terbuka fungsi mergesql melalui properti 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 Penamaan: Strategi Fisik: org.hibernate.boot.model.naming.physicalnamingStrategystandardardImpl MVC: Lihat: awalan:/web-inf/jsp/sufiks: .jsp #jedis konfigurasi jedis: pool: host: 127.0.0.1 port: 6379 Kata sandi: 02 000: host: 127.0.1
Tulis kelas konfigurasi untuk memulai konfigurasi jedaconfig.java:
Paket org.muses.jeepatform.config; impor org.springframework.beans.factory.annotation.Autowired; impor org.springframework.beans.factory.annotation.noalifier; impor org.springframework.beans.factory.notation.valeUse; org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import redis.clients.jedis.JedisPool;import redis.clients.jedis.JedisPoolConfig;@Configuration//@ConfigurationProperties(prefix = 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.port}")int port, @Value ("$ {spring.jedis.pool.timeout}") int timeout, @value ("$ {spring.jedis.pool.password}") kata sandi string) {return new jedispool (config, host, port, timeout, password); } @Bean (name = "jedaispoolconfig") public jedispoolconfig jedipispoolconfig (@Value ("$ {spring.jedis.pool.config.maxtotal}") int maxtotal, @value ("$ {spring.jedis.pool.config.maxid @Value ("$ {spring.jedis.pool.config.maxwaitmillis}") int maxwaitmillis) {jedispoolconfig config = new jedispoolconfig (); config.setmaxtotal (maxtotal); config.setmaxidle (maxidle); config.setmaxwaitmillis (maxwaitmillis); return config; }}4.3 Penulisan kelas meta-anotasi
Tulis kelas anotasi meta rediscache.java. Semua kelas yang ditentukan oleh anotasi yang dimodifikasi secara otomatis diimplementasikan dalam pemrosesan cache AOP.
package org.muses.jeepatform.annotation;import org.muses.jeepatform.common.RedisCacheNamespace;import java.lang.annotation.*;/** * Meta annotation is used to identify the method used to query the database*/@Documented@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface RedisCache {// REDISCACHENAMESPACE namespace ();} Selain retensi, ada tiga anotasi lain yang disediakan oleh JDK 5, yaitu target, diwarisi dan didokumentasikan. Berdasarkan ini, kami dapat mengimplementasikan anotasi meta khusus
Kami mengatur Rediscache ke referensi berdasarkan level metode metode.
1.RetentionPolicy. Sumber Anotasi Jenis ini hanya dicadangkan pada tingkat kode sumber dan akan diabaikan selama kompilasi.
2. RetentionPolicy.class Jenis anotasi ini dipertahankan selama kompilasi dan ada dalam file kelas, tetapi JVM akan mengabaikannya.
3. RetentionPolicy.
4.4 Memanggil Jedispool untuk mengimplementasikan pemrosesan cache Redis
Paket org.muses.jeepatform.cache; impor org.springframework.beans.factory.annotation.Autowired; impor org.spramework.stereotype.sterponent; impor org.springframework.stereotype.service; impor redis.clients.jedis.jedis.jedis. javax.annotation.resource; @Component ("Rediscache") Rediscache kelas publik {@Autowired Private Jedispool Jedispool; pribadi jedispool getjedispool () {return jedispool; } public void setjedispool (jedaispool jedispool) {this.jedispool = jedispool; } / ** * Dapatkan data dari redis cache * @param rediskey * @return * / objek publik getDataFromredis (string rediskey) {jedis jedis = jedispool.getResource (); byte [] bytearray = jedis.get (rediskey.getbytes ()); if (byteArray! = null) {return serializeutil.unserialize (bytearray); } return null; } / ** * Simpan data ke redis * @param rediskey * / public string saveDatorEdis (string rediskey, objek obj) {byte [] bytes = serializeutil.serialize (obj); Jedis jedis = jedispool.getResource (); Kode string = jedis.set (rediskey.getbytes (), bytes); Kode pengembalian; }}Kelas Alat Serialisasi Objek:
Paket org.muses.jeepatform.cache; import java.io.*; kelas publik serializeutil { / *** objek serial* @param obj* @return* / byte statis publik [] serialize (objek obj) {ObjectOutputStream oos = null; BytearrayoutputStream baos = null; coba {baos = new bytearrayoutputStream (); OOS = ObjectOutputStream baru (BAOS); oos.writeObject (OBJ); byte [] bytearray = Baos.tobyteArray (); kembali bytearray; } catch (ioException e) {e.printstacktrace (); } return null; } / ** * Deserialize objek * @param bytearray * @return * / objek statis publik unserialize (byte [] bytearray) {bytearrayInputStream bais = null; coba {// deserialize ke objek bais = new bytearrayInputStream (bytearray); ObjectInputStream OIS = ObjectInputStream baru (BAIS); return ois.readObject (); } catch (Exception e) {E.PrintStackTrace (); } return null; }} Di sini saya ingat bahwa kelas VO harus mengimplementasikan Serializable
Misalnya, kelas menu kelas VO, ini adalah kelas entitas pemetaan JPA
Paket org.muses.jeepatform.core.entity.admin; import javax.persistence.*; impor java.io.serializable; Import java.util.list;/*** @Description menu entitas* @Author nicky* @date 17 Maret 2017*/ @name = "name =" Sy ") @MENTOC @) @Date 17 Maret 2017*/ @name =" name = "name =" Syse ")) SYS) @MENTHOC @MARET, 2017*/ @name =" name = "name =" Sy ") @MENTHOC) @MARET" 2017*/ @name = "Sy")) { / ** ID menu ** / private int menuID; / ** ID superior **/ private int parentid; / ** Nama Menu **/ Private String Menuname; / ** Ikon Menu **/ Private String Menuicon; / ** URL Menu **/ Private String MenuUrl; / ** Jenis Menu **/ Private String Menutype; / ** Menu Sort **/ Private String Menuorder; / ** Status Menu **/ Private String Menustatus; Daftar Pribadi <u menu> submenu; target string pribadi; private boolean hassubmenu = false; menu publik () {super (); } @Id @GeneratedValue (strategi = generasi. } public void setMenuid (int menuID) {this.menuid = menuID; } @Column (length = 100) public int getParentId () {return parentId; } public void setParentId (int parentId) {this.parentId = ParentId; } @Column (length = 100) Public String getMeNuname () {return this.menuname; } public void setMenuname (string menuname) {this.menuname = menuname; } @Column (length = 30) Public String getMenuicon () {return this.menuicon; } public void setMenuicon (String menuicon) {this.menuicon = menuicon; } @Column (length = 100) Public String getMenuUrl () {return this.menuUrl; } public void setMenuUrl (String menuUrl) {this.menuUrl = menuUrl; } @Column (length = 100) Public String getMenutype () {return this.Menutype; } public void setMenutype (string menutype) {this.menutype = menutype; } @Column (length = 10) Public String getMenuorder () {return menuorder; } public void setMenuOrder (String menuorder) {this.menuorder = menuorder; } @Column (length = 10) Public String getMenustatus () {return menustatus; } public void setMenustatus (String menustatus) {this.menustatus = menustatus; } @Transient Daftar Publik <u menu> getsubmenu () {return submenu; } public void setSubmenu (Daftar <Su- menu> submenu) {this.submenu = submenu; } public void setarget (string target) {this.target = target; } @Transient string publik getTarget () {return target; } public void setHassubmenu (boolean hassubmenu) {this.hassubmenu = hassubmenu; } @Transient publik boolean gethassubmenu () {return hassubmenu; }}4.5 Spring AOP mengimplementasikan cache metode yang memantau semua dijelaskan oleh @Rediscache
Pertama dapatkan cache dari Redis. Jika Anda tidak dapat menanyakannya, meminta database MySQL, dan kemudian menyimpannya ke cache Redis. Lain kali Anda bertanya, hubungi Redis Cache secara langsung.
Paket org.muses.jeepatform.cache; impor org.aspectj.lang.proedingnointpoint; impor org.aspectj.lang.annotation.around; impor org.aspectj.langcut.Annotation.aspect; import org.aspectj.lang.annotation.pointcut; impor org.spor.aspectj.lang.annotation.pointcut; import org.spor.aspectj.lang.annotation.pointcut; import org.spectj.aspectj.Lang.annotation.pointcut; Impor org.spectj.Angger; org.slf4j.loggerFactory; impor org.springframework.beans.factory.annotation.Autowired; impor org.spramework.beans.factory.annotation.qualifier; impor org.spramework.stereotipe.stereotype.notation;/** ImporeCPEPPECEPICECPECECPECECECPICE.SPRAMEWork.Stereotipe.Sponent; {private static final Logger logger = loggerFactory.getLogger (redisaspect.class); @Autowired @qualifier ("Rediscache") Rediscache Private Rediscache; /*** Metode untuk mencegat semua anotasi meta anotasi rediscache* /@pointcut (" @annotation (org.muses.jeepatform.annotation.rediscache)") public void pointcutmethod () {} /*** Untuk pemrosesan sekitarnya, pertama -tama dapatkan cache dari redis. Jika Anda tidak dapat menanyakan, Anda menanyakan database MySQL, * kemudian simpan ke cache redis * @param goinpoint * @return */@around ("pointcutmethod ()") objek publik di sekitar (ProsedingJoINPoint joinpoint) {// Sebelumnya: Dapatkan cache dari redis // pertama dapatkan metode target parameter. String applId = null; Objek [] args = joinpoint.getArgs (); if (args! = null && args.length> 0) {applid = string.valueof (args [0]); } // Dapatkan kelas di mana metode target terletak string target target = joinpoint.getTarget (). ToString classname = target.split ("@") [0]; // Dapatkan nama metode dari Metode Target Method MethodName = joinpoint.getSignature (). GetName (); // Format Kunci Redis: ApplID: Metode Nama String Rediskey = Applid + ":" + ClassName + "." + MethodName; Objek obj = rediscache.getDataFromredis (rediskey); if (obj! = null) {logger.info ("************ Data yang ditemukan dari redis ****************"); Logger.info ("Nilai Kunci Redis:"+Rediskey); Logger.info ("Nilai Nilai Redis:"+obj.tostring ()); kembalikan obj; } long endtime = system.currentTimeMillis (); Logger.info ("Redis Cache AOP Processing Time:"+(endtime-starttime)); Logger.info ("*************** Data yang ditemukan dari Redis ****************"); coba {obj = joinpoint.proed (); } catch (throwable e) {e.printstacktrace (); } Logger.info ("*************** Mulai menanyakan data dari MySQL *************"); // post-set: Simpan data yang ditemukan dalam database untuk redis code string = rediscache.savedatatoredis (rediskey, obj); if (code.equals ("ok")) {logger.info ("************ Data berhasil disimpan ke Redis Cache !!! ************"); Logger.info ("Nilai Kunci Redis:"+Rediskey); Logger.info ("Nilai Nilai Redis:"+obj.tostring ()); } kembalikan obj; }}Kemudian hubungi @rediscache untuk mengimplementasikan cache
/ ** * Dapatkan informasi menu melalui ID menu * @param ID * @return */ @transactional @reditcache menu publik findMenubyId (@reditcachekey int id) {return menurepository.findmenubyMenuid (id); }Metode yang masuk ke sistem dan kemudian menambahkan anotasi @RedaScache akan mengimplementasikan pemrosesan cache redis
Anda dapat melihat bahwa Redis disimpan untuk cache
Kode Proyek: https://github.com/u014427391/jeepatform
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.