การรวม SSM+Redis
เฟรมเวิร์ก SSM ได้ถูกสร้างขึ้นมาก่อนดังนั้นจึงไม่มีการคัดลอกรหัสที่นี่
ที่นี่เราใช้ Redis เป็นหลักในการสร้างแคชรองของ MyBatis การเลือกทั้งหมดในไฟล์การแมป MyBaits จะรีเฟรชแคชที่มีอยู่ หากไม่มีอยู่จะมีการสร้างแคชใหม่ การดำเนินการแทรกและอัปเดตทั้งหมดจะอัปเดตแคช
ประโยชน์ของ Redis นั้นชัดเจนเช่นกันซึ่งสามารถทำให้ประสิทธิภาพการเข้าถึงข้อมูลของระบบสูงขึ้น ส่วนนี้แสดงเฉพาะวิธีการรวมและเอฟเฟกต์และจะได้รับการเสริมในภายหลังโดยบทความที่แบ่งปันกลุ่ม Redis, การปรับสมดุลโหลดและเซสชัน
มาเริ่มงานบูรณาการ:
แบ็กเอนด์เริ่มต้นก่อน (วิธีการเริ่มต้นและการเชื่อมต่อกับบริการ Linux จากระยะไกลต้องเปลี่ยนไฟล์ redis.conf) และเริ่มต้นคำสั่ง "./src/redis-server ./redis.conf"
ฉันพัฒนามันภายใต้ระบบ Windows ฉันแนะนำเครื่องมือภาพ "Redis Desktop Manager" มันต้องการการเชื่อมต่อระยะไกลกับ Redis ใน Linux และต้องเปิดพอร์ตไปยังสาธารณะภายใต้ Linux (วิธีการเฉพาะคือการแก้ไขไฟล์/etc/sysconfig/iptables และเพิ่มคำสั่งการพัฒนาพอร์ตภายนอก)
หลังจากการดำเนินการทั้งหมดเสร็จสิ้นการเชื่อมต่อระยะไกลจะสำเร็จดังแสดงในรูป:
ยังไม่มีบันทึกแคช มาป้อนขั้นตอนรหัสกันเถอะ ก่อนอื่นให้เพิ่มแพ็คเกจ Redis Jar ที่ต้องการใน pom.xml
<การพึ่งพา> <roupId> redis.Clients </groupId> <ratifactid> Jedis </artifactid> <sersion> 2.9.0 </เวอร์ชัน> </การพึ่งพา> <การพึ่งพา> <roupid> org.springframework.data </groupid> <การพึ่งพา> <roupId> org.mybatis </groupId> <ratifactid> mybatis-ehcache </artifactid> <persion> 1.0.0 </version> </dependency> <!-เพิ่มแพ็คเกจการเชื่อมต่อ druid-> <predency> </dermentency>
หลังจากเขียน pom.xml แล้วต้องเพิ่มไฟล์การกำหนดค่าใหม่สองไฟล์: redis.properties
redis.host = 192.168.0.109redis.port = 6379Redis.Pass = 123456Redis.maxidle = 200redis.maxactive = 1024redis.maxwait = 10,000Redis.testonborrow = true
ฟิลด์นั้นง่ายต่อการเข้าใจแล้วเพิ่มไฟล์การกำหนดค่า: Spring-redis.xml
<ถั่ว xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance xmlns: mvc = "http://www.springframework.org/schema/mvc" xmlns: util = "http://www.springframework.org/schema/util" xmlns: aop = "http://www.springframework.org/schema/aop" xmlns: บริบท = "http://www.springframework.org/schema/contex XSI: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/util http://ww.springframework.org/schema/til-util http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd http://ww.springframework.org/schema/schema http://www.springframework.org/schema/aop/spring-aop-4.3.xsd http://www.springframework.org/schema/context การกำหนดค่าพารามิเตอร์ของพูลการเชื่อมต่อคล้ายกับพูลการเชื่อมต่อฐานข้อมูล-> <บริบท: สถานที่ตั้งคุณสมบัติ-สถานที่ตำแหน่ง = "classpath*: redis.properties" /> <bean id = "poolconfig"> <property name = "maxtotal" value = "$ {redis.maxactive}" /> name = "testOnBorrow" value = "$ {redis.testonBorrow}"/> </ebean> <!-การกำหนดค่าพูลการเชื่อมต่อคล้ายกับพูลการเชื่อมต่อฐานข้อมูล-> <bean id = "jedisconnectionFactory"> <property name = "hostname" value = "$ {redis.host}" <property name = "password" value = "$ {redis.pass}"> </คุณสมบัติ> <property name = "poolconfig" ref = "poolconfig"> </property> </ebean> <! กำหนดค่าจากนั้นใช้สตริงอย่างชาญฉลาดเมื่อจัดเก็บ หากคุณใช้ประเภทผู้ใช้ในการจัดเก็บมันจะแจ้งให้ผู้ใช้ผิดพลาดไม่สามารถส่งไปยังสตริงได้! - - <property name = "KeySerializer"> <bean/> </property> <property name = "valueserializer"> <bean/> </property> </epean> -> <bean id = "rediscachetransfer"> <property name = "jedisconnectionformatory" ref = "jedisconnectionหลังจากเขียนไฟล์กำหนดค่าแล้วเริ่มเขียนรหัส Java:
jedisclusterfactory.java
แพ็คเกจ com.cjl.util; นำเข้า java.util.hashset; นำเข้า java.util.properties; นำเข้า java.util.set; นำเข้า java.util.regex.pattern; นำเข้า org.apache.Commons.pool2.impl.enericobjectpoolconfigic; org.springframework.beans.factory.initializingbean; นำเข้า org.springframework.core.io.resource; นำเข้า redis.clients.jedis.hostandport; นำเข้า redis.clients.jedis String Private String KeyPrefix; Private Jediscluster Jediscluster; การหมดเวลาจำนวนเต็มส่วนตัว Maxredirections จำนวนเต็มส่วนตัว Private GenericobjectPoolConfig GenericobjectPoolConfig; รูปแบบส่วนตัว p = pattern.compile ("^.+[:] // d {1,5} // s*$"); สาธารณะ jediscluster getObject () โยนข้อยกเว้น {return jediscluster; } คลาสสาธารณะ <? ขยาย jediscluster> getObjectType () {return (this.jediscluster! = null? this.jediscluster.getClass (): jediscluster.class); } บูลีนสาธารณะ issingleton () {return true; } SET ส่วนตัว <HostandPort> ParseHostandport () โยนข้อยกเว้น {ลอง {คุณสมบัติ prop = คุณสมบัติใหม่ (); prop.load (this.addressconfig.getInputStream ()); SET <StHerAndPort> hasps = new hashset <sderstandport> (); สำหรับ (คีย์วัตถุ: prop.keyset ()) {if (! ((สตริง) คีย์) .startswith (addressKeyPrefix)) {ดำเนินการต่อ; } string val = (string) prop.get (คีย์); บูลีน isipport = p.matcher (val). -matches (); if (! isipport) {โยน unlegalargumentException ใหม่ ("IP หรือพอร์ตผิดกฎหมาย"); } string [] ipandport = val.split (":"); Hostandport HAP = ใหม่ HostandPort (IPANDPORT [0], Integer.ParseInt (IPANDPORT [1])); Haps.add (HAP); } return hasps; } catch (unlegalargumentException ex) {โยน ex; } catch (Exception Ex) {โยนข้อยกเว้นใหม่ ("ไฟล์การกำหนดค่า Jedis Parse Jedis ล้มเหลว", Ex); }} โมฆะสาธารณะ AfterPropertIesset () พ่นข้อยกเว้น {set <sdermandport> hasps = this.parsehostandport (); jediscluster = new Jediscluster (haps, หมดเวลา, maxredirections, genericobjectpoolconfig); } โมฆะสาธารณะ setAddressConfig (Resource addressConfig) {this.addressConfig = addressConfig; } โมฆะสาธารณะ settimeout (หมดเวลา int) {this.timeout = หมดเวลา; } โมฆะสาธารณะ setMaxredirections (int maxredirections) {this.maxredirections = maxredirections; } โมฆะสาธารณะ setAddressKeyPrefix (String addressKeyPrefix) {this.addressKeyPrefix = addressKeyPrefix; } โมฆะสาธารณะ setGenerIsObjectPoolConfig (genericObjectPoolConfig genericobjectPoolConfig) {this.genericObjectPoolConfig = genericObjectPoolConfig; -rediscache.java
แพ็คเกจ com.cjl.util; นำเข้า java.util.concurrent.locks.readwriteLock; นำเข้า java.util.concurrent.locks.reentrantradwriteLock; นำเข้า org.apache.ibatis.cache.cache; org.springframework.data.redis.connection.jedis.jedisconnection; นำเข้า org.springframework.data.redis.connection.jedis.jedisconnectionfactory; นำเข้า org.springframework.data.redis.serializer.redisserializer; นำเข้า redis.clients.jedis.exceptions.jedisconnectionException; การแสดงระดับสาธารณะในระดับสาธารณะ เจดดิสคอนเพล็กเจ็กเจ็กเจ็กเจ็ดเจ็กนิคชั่นเพอร์สติกแบบคงที่; รหัสสตริงสุดท้ายส่วนตัว; Private Final ReadWriteLock RWL = ใหม่ reentRantReadWriteLock (); REDISCACHE สาธารณะ (รหัสสตริงสุดท้าย) {ถ้า (id == null) {โยน unlegalArgumentException ใหม่ ("อินสแตนซ์แคชต้องใช้ ID"); } logger.debug ("MyBatisrediscache: id =" + id); this.id = id; } / *** ล้างแคชทั้งหมด* / โมฆะสาธารณะล้าง () {rwl.readlock (). lock (); การเชื่อมต่อ Jedisconnection = null; ลอง {connection = jedisconnectionFactory.getConnection (); Connection.flushdb (); Connection.flushall (); } catch (jedisconnectionException e) {e.printstacktrace (); } ในที่สุด {ถ้า (การเชื่อมต่อ! = null) {connection.close (); } rwl.readlock (). ปลดล็อค (); }} สตริงสาธารณะ getId () {return this.id; } / *** รับจำนวนแคชทั้งหมด* / public int getsize () {int result = 0; การเชื่อมต่อ Jedisconnection = null; ลอง {connection = jedisconnectionFactory.getConnection (); result = integer.valueof (connection.dbsize (). toString ()); logger.info ("เพิ่ม MyBaits รองหมายเลขแคช:" + ผลลัพธ์); } catch (jedisconnectionException e) {e.printstacktrace (); } ในที่สุด {ถ้า (การเชื่อมต่อ! = null) {connection.close (); }} ผลการส่งคืน; } โมฆะสาธารณะ putobject (คีย์วัตถุค่าวัตถุ) {rwl.writeLock (). lock (); การเชื่อมต่อ Jedisconnection = null; ลอง {connection = jedisconnectionFactory.getConnection (); REDISSERIALIZER <Ojrop> serializer = ใหม่ jdkserializationReSerializer (); Connection.set (serializeutil.serialize (คีย์), serializeutil.serialize (ค่า)); logger.info ("เพิ่ม mybaits cache cache key =" + key + ", value =" + value); } catch (jedisconnectionException e) {e.printstacktrace (); } ในที่สุด {ถ้า (การเชื่อมต่อ! = null) {connection.close (); } rwl.writeLock (). ปลดล็อค (); }} วัตถุสาธารณะ getObject (คีย์วัตถุ) {// รับข้อมูลจากแคชก่อนเพิ่มการล็อคอ่าน rwl.readlock (). lock (); ผลลัพธ์ของวัตถุ = null; การเชื่อมต่อ Jedisconnection = null; ลอง {connection = jedisconnectionFactory.getConnection (); REDISSERIALIZER <Ojrop> serializer = ใหม่ jdkserializationReSerializer (); ผลลัพธ์ = serializer.deserialize (Connection.get (serializer.serialize (key))); logger.info ("กด MyBaits ระดับ 2 แคช, value =" + ผลลัพธ์); } catch (jedisconnectionException e) {e.printstacktrace (); } ในที่สุด {ถ้า (การเชื่อมต่อ! = null) {connection.close (); } rwl.readlock (). ปลดล็อค (); } ผลตอบแทนผลลัพธ์; } วัตถุสาธารณะ removeObject (คีย์วัตถุ) {rwl.writeLock (). lock (); การเชื่อมต่อ Jedisconnection = null; ผลลัพธ์ของวัตถุ = null; ลอง {connection = jedisconnectionFactory.getConnection (); REDISSERIALIZER <Ojrop> serializer = ใหม่ jdkserializationReSerializer (); result = connection.expire (serializer.serialize (คีย์), 0); } catch (jedisconnectionException e) {e.printstacktrace (); } ในที่สุด {ถ้า (การเชื่อมต่อ! = null) {connection.close (); } rwl.writeLock (). ปลดล็อค (); } ผลตอบแทนผลลัพธ์; } โมฆะคงที่สาธารณะ setjedisconnectionFactory (JedisconnectionFactory JedisconnectionFactory) {rediscache.jedisconnectionFactory = JedisconnectionFactory; } Public ReadWriteLock getReadWriteLock () {// วิธีการที่สร้างขึ้นอัตโนมัติ todo stub return rwl; -rediscachetransfer.java
แพ็คเกจ com.cjl.util; นำเข้า org.springframework.beans.factory.annotation.autowired; นำเข้า org.springframework.data.redis.connection.jedis.jedisconnectionfactory; SetjedisconnectionFactory (JedisconnectionFactory JedisconnectionFactory) {rediscache.setjedisconnectionFactory (JedisconnectionFactory); -serializeutil.java
แพ็คเกจ com.cjl.util; นำเข้า java.io.byTearrayInputStream; นำเข้า java.io.ByTearrayOutputStream; นำเข้า Java.io.ObjectInputStream; นำเข้า Java.io.ObjectOutputStream;/** * @author Seratial {ObjectOutputStream oos = null; ByTeArrayOutputStream BAOS = NULL; ลอง {// serialization baos = new ByteArrayOutputStream (); oos = new ObjectOutputStream (BAOS); oos.writeObject (วัตถุ); ไบต์ [] bytes = baos.tobytearray (); ไบต์กลับ; } catch (exception e) {e.printstacktrace (); } return null; } / ***deserialization* / วัตถุสาธารณะคงที่ unserialize (byte [] bytes) {ถ้า (ไบต์! = null) {byteArrayInputStream bais = null; ลอง {// deserialize bais = new byteArrayInputStream (ไบต์); ObjectInputStream OIS = ใหม่ ObjectInputStream (BAIS); return ois.readObject (); } catch (exception e) {}} return null; -หลังจากทุกอย่างพร้อมคุณต้องแก้ไขไฟล์การแมป
ในการทำให้แคช MyBaits มีประสิทธิภาพคุณต้องเปิดใช้งานแคชทุติยภูมิตามที่แสดงในรูปด้านบน ไฟล์การกำหนดค่ายังต้องโหลดใน web.xml เพื่อให้ได้ผล
เมื่อทุกอย่างพร้อมให้เริ่มบริการ
หลังจากการเริ่มต้นสำเร็จการคลิกแบบฟอร์มพนักงานสามารถเรียกใช้วิธีการสอบถามพนักงานทุกคน เมื่อคำสั่ง Query ดำเนินการเป็นครั้งแรกคุณจะเห็นว่า MyBatis ได้พิมพ์คำสั่ง Query และอัปเดตแคชในเซิร์ฟเวอร์ Redis
เราล้างคอนโซลและคลิกปุ่มพนักงานแบบสอบถามเพื่อเรียกใช้วิธีการสืบค้น เราจะเห็นได้ว่าไม่มีการดำเนินการแบบสอบถามโดยพิสูจน์ว่าแบบสอบถามที่สองใช้ค่าโดยตรงจากแคชและไม่มีการเชื่อมต่อกับ MySQL สำหรับการสืบค้น
สรุป
ข้างต้นเป็นวิธีการรวมของ Redis และ SSM (แคช Mybatis ระดับ 2) แนะนำให้คุณรู้จักโดยบรรณาธิการ ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับทุกคนในเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!