คำนำ
ดังที่เราทุกคนรู้ว่า Encache เป็นกรอบการแคชโอเพนซอร์ส Java ที่ได้รับความนิยมมากที่สุดในขณะนี้ด้วยการกำหนดค่าที่เรียบง่ายโครงสร้างที่ชัดเจนและฟังก์ชั่นที่ทรงพลัง โดยการใส่คำอธิบายประกอบ @Cacheable คุณสามารถเพิ่มผลลัพธ์วิธีการลงในแคชได้อย่างรวดเร็ว แคชที่ระบุสามารถล้างได้อย่างรวดเร็วผ่าน @cacheevict
อย่างไรก็ตามเนื่องจากคำอธิบายประกอบ @cacheevict ใช้ค่าคีย์และไม่รองรับการลบฟัซซี่คุณจะพบปัญหา เมื่อฉันใช้ @cacheable เพื่อร่วมมือกับ Spring El Expressions ฉันเพิ่มแคชหลายวิธีของวิธีเดียวกันเช่น:
@getMapping ("/listoftask/{page}/")@cacheable (value = "BusinessCache", key = "'listoftask _'+ #page") การตอบสนองสาธารณะ <pagetaskvo> getTaskList (@PathVariable ("หน้า")รหัสข้างต้นคือการรับข้อมูลงานด้วยการเพจ ใช้นิพจน์ EL เพื่อรับหน้าในพารามิเตอร์และใช้คีย์แคชเพื่อเพิ่มลงในแคชของ ehcache โดยใช้ @cacheable ในเวลานี้คีย์ของประเภท listoftask_1, listoftask_2, listoftask_3 จะปรากฏในแคช
เมื่อเพิ่มหรือลบงานรายการจะเปลี่ยน ในเวลานี้คุณต้องลบแคชทั้งหมดที่เกี่ยวข้องกับ Listoftask_* ในเวลานี้ฉันไม่ทราบว่าเนื้อหาที่เกี่ยวข้องกับ listoftask_* ถูกแคชในแคชมากแค่ไหนดังนั้นจึงเป็นไปไม่ได้ที่จะโทร @cacheevict เพื่อลบมันทีละคน
เนื่องจาก Ehcache เองไม่สามารถรองรับได้เราจึงสามารถใช้งานได้เองเท่านั้น
ทำให้สำเร็จ
เมื่อพิจารณาจากแคชที่เพิ่มโดยใช้คำอธิบายประกอบการลบแคชยังใช้การประมวลผลคำอธิบายประกอบเพื่อรักษาความสอดคล้องของการพัฒนา คำอธิบายประกอบเป็นมิตรกับนักพัฒนา จากนั้นเราพิจารณาใช้คำอธิบายประกอบที่กำหนดเองเพื่อเบลอการกำจัดแคช
ก่อนอื่นกำหนดคำอธิบายประกอบ cacheremove:
@target ({java.lang.annotation.elementtype.method}) @retention (retentionpolicy.runtime) สาธารณะ @interface cacheremove {ค่าสตริง (); String [] key ();}โดยที่ค่าเป็นเหมือน ehcache ใช้เพื่อกำหนดชื่อแคชให้ทำงาน คีย์คืออาร์เรย์ที่เก็บการแสดงออกปกติสำหรับคีย์แคชหลายตัว การตั้งชื่อของ cacheremove นั้นชัดเจนและเข้าใจง่ายและไม่ขัดแย้งกับคำอธิบายประกอบของ Ehcache เอง คำจำกัดความของคำอธิบายประกอบจบลงที่นี่ ถัดไปคุณต้องจัดการกับคำอธิบายประกอบ เนื่องจากใช้กรอบฤดูใบไม้ผลิจึงเป็นเรื่องธรรมดาที่คุณจะนึกถึงการใช้ AOP เพื่อสร้างคำอธิบายประกอบ
จุดประสงค์ของคำอธิบายประกอบคือการกำจัดแคชเบลอ ต้องพิจารณาสองประเด็นต่อไปนี้:
วิธีที่ฉันให้และวิธีที่ง่ายที่สุดที่ฉันคิดคือ:
ก่อนกำหนดชื่อคลาส cacheremoveaspect:
@ASPACT @ComponentPublic คลาส cacheremoveaspect {@pointcut (value = "(Execution (**.*(.. )) && @NanTation (com.example.cacheremove))") โมฆะส่วนตัว Pointcut () {} ทำอะไร ... }}กำหนดแทนเจนต์ในพื้นที่หั่นใช้การดำเนินการ (**.*(.. ) && @Annotation (com.example.cacheremove)) เพื่อระบุว่า cacheremove คลาสที่มีคำอธิบายประกอบทั้งหมดถูกดำเนินการและค่าใน @Annotation เป็นชื่อที่มีคุณสมบัติครบถ้วนของคำอธิบายประกอบ
หลังจากกำหนดจุดแผลแล้วไฮไลท์ต่อไปนี้คือการใช้งานเฉพาะของส่วน โดยทั่วไปแล้วแคชจะไม่ถูกลบออกหลังจากวิธีการเพิ่มการลบและการแก้ไขจะถูกดำเนินการ ดังนั้นใช้ @afterreturning () เพื่อใช้งาน สิ่งต่อไปนี้ต้องทำในการใช้งานเฉพาะ:
การใช้งานเฉพาะมีดังนี้:
@afterReturning (value = "pointCut ()") กระบวนการโมฆะส่วนตัว (joinpoint joinpoint) {methodSignature signature = (methodSignature) JoinPoint.getSignature (); วิธีการ = signature.getMethod (); cacheremove cacheremove = method.getannotation (cacheremove.class); if (cacheremove! = null) {ค่าสตริง = cacheremove.value (); String [] keys = cacheremove.key (); // คีย์ปกติที่ต้องลบรายการ cachekeys = cacheutils.cachekeys (ค่า); สำหรับ (คีย์สตริง: คีย์) {รูปแบบรูปแบบ = pattern.compile (คีย์); สำหรับ (Cachekey Object: Cachekeys) {String cachekeystr = string.valueof (cachekey); if (pattern.matcher (cachekeystr) .find ()) {cacheutils.remove (value, cachekeystr); -ข้างต้นคือการใช้งานเฉพาะของแคชการกำจัดแบทช์ Ehcache Fuzzy ในหมู่พวกเขา BusinessCacheutils ห่อหุ้มคลาสเครื่องมือ EHCACHE สำหรับตัวเอง ส่วนใหญ่ใช้ฟังก์ชั่นปกติเช่นการได้รับแคชพูลได้รับแคชถอดแคชเพิ่มแคชและดูแคชทั้งหมด รหัสมีดังนี้:
คลาสสาธารณะ cacheutils {ส่วนตัว cachemanager cachemanager = springcontextholder.getBean ("ehcachemanagerfactory"); วัตถุคงที่สาธารณะรับ (สตริง cachename, คีย์สตริง) {องค์ประกอบองค์ประกอบ = getCache (cachename) .get (คีย์); return element == null? null: element.getObjectValue (); } โมฆะคงที่สาธารณะ put (สตริง cachename, คีย์สตริง, ค่าวัตถุ) {องค์ประกอบองค์ประกอบ = องค์ประกอบใหม่ (คีย์, ค่า); getCache (cachename) .put (องค์ประกอบ); } โมฆะคงที่สาธารณะลบ (สตริง cachename, คีย์สตริง) {getCache (cachename) .remove (คีย์); } รายการคงที่สาธารณะ cachekeys (สตริง cachename) {return getCache (cachename) .getKeys (); } /*** รับแคชหากไม่มีใครสร้าง * @param cachename * @return */ แคชแบบคงที่ส่วนตัว getCache (สตริง cachename) {แคชแคช = cachemanager.getCache (cachename); if (cache == null) {cacheManager.addcache (cachename); cache = cachemanager.getCache (cachename); cache.getCacheConfiguration (). seteternal (จริง); } ส่งคืนแคช; } สาธารณะ cacheManager getCacheManager () {return cachemanager; -ณ จุดนี้ฟังก์ชั่นการกำจัดชุดฟัซซี่ Ehcache ทั้งหมดจะถูกนำมาใช้
สรุป
กระบวนการทั้งหมดมีความคิดง่ายๆและหลังจากใช้ความรู้ AOP บางอย่างฟังก์ชั่นที่ต้องการจะเสร็จสมบูรณ์ อย่างไรก็ตามการลบรหัสบางอย่างสามารถพิจารณาเพื่อเพิ่มประสิทธิภาพ ผ่านลูปแคชทั้งหมดแคชทั้งหมดที่ต้องลบออกจะถูกลบออกแทนที่จะคิดว่ามีหลายปุ่มเช่นนี้แคชเต็มรูปแบบจะถูกสำรวจหลายครั้ง การใช้งานที่เฉพาะเจาะจงจะถูกทิ้งให้ผู้อ่านให้เสร็จสมบูรณ์ หวังว่ามันจะเป็นประโยชน์กับคุณ ฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น