Kata pengantar
Seperti yang kita ketahui, Encache adalah kerangka cache open source java paling populer sekarang, dengan konfigurasi sederhana, struktur yang jelas dan fungsi yang kuat. Dengan Annotating @Cacheable, Anda dapat dengan cepat menambahkan hasil metode ke cache. Cache yang ditentukan dapat dengan cepat dihapus melalui @Cacheevict.
Namun, karena anotasi @cacheevict menggunakan nilai kunci dan tidak mendukung penghapusan fuzzy, Anda akan menghadapi masalah. Ketika saya menggunakan @cacheable untuk bekerja sama dengan Spring El Expressions, saya menambahkan beberapa cache dengan metode yang sama, seperti:
@GetMapping ("/listofksk/{page}/")@cacheable (value = "BusinessCache", key = "'listofk _'+ #page") responseMessage publik <pagetaskvo> getTaskList (@pathvariable ("halaman") halaman string) {melakukan sesuatu ...}Kode di atas adalah mendapatkan informasi tugas dengan paging. Gunakan ekspresi EL untuk mendapatkan halaman di parameter dan gunakan tombol cache untuk menambahkannya ke cache ehcache menggunakan @cacheable. Pada saat ini, kunci tipe listofk_1, listofk_2, listofk_3 akan muncul di cache.
Saat menambahkan atau menghapus tugas, daftar akan berubah. Pada saat ini, Anda perlu menghapus semua cache yang terkait dengan Listofk_*. Pada saat ini, saya tidak tahu berapa banyak konten yang terkait dengan ListOfTask_* di -cache dalam cache, jadi tidak mungkin untuk memanggil @Cacheevict untuk menghapusnya satu per satu.
Karena Ehcache sendiri tidak dapat mendukungnya, kami hanya dapat mengimplementasikannya sendiri.
menyelesaikan
Mempertimbangkan cache yang ditambahkan dengan menggunakan anotasi, menghilangkan cache juga menggunakan pemrosesan anotasi untuk mempertahankan konsistensi pengembangan. Anotasi juga sangat ramah bagi pengembang. Kemudian kami mempertimbangkan untuk menggunakan anotasi khusus untuk mengaburkan penghapusan cache.
Pertama, tentukan anotasi cacheremove:
@Target ({java.lang.annotation.elementType.method}) @retensi (retentionpolicy.runtime) public @interface cacheremove {string value (); String [] key ();}Di mana, nilainya seperti ehcache, digunakan untuk menentukan nama cache untuk beroperasi. Kuncinya adalah array yang menyimpan ekspresi reguler untuk beberapa tombol di -cache. Penamaan Cacheremove jelas dan mudah dimengerti dan tidak bertentangan dengan anotasi Ehcache itu sendiri. Definisi anotasi berakhir di sini. Selanjutnya, Anda perlu berurusan dengan anotasi. Karena kerangka kerja musim semi digunakan, wajar jika Anda akan berpikir untuk menggunakan AOP untuk membuat anotasi.
Tujuan dari anotasi adalah untuk menghilangkan penghapusan cache. Dua masalah berikut perlu dipertimbangkan:
Cara saya memberi dan cara paling sederhana yang saya pikirkan adalah:
Pertama -tama tentukan nama kelas Cacheremoveaspect:
@Aspek @componentpublic kelas CachereMoVeaspect {@pointcut (value = "(eksekusi (**.*(..)) && @annotation (com.example.cacheremove))") private void pointcut () {} melakukan sesuatu ...}Tentukan garis singgung di area pengiris, gunakan eksekusi (**.*(..) && @annotation (com.example.cacheremove)) untuk menunjukkan bahwa semua kelas yang beranotasi Cacheremove dieksekusi, dan nilai -nilai dalam @Annotation adalah nama anotasi yang memenuhi syarat.
Setelah titik sayatan didefinisikan, sorotan berikut adalah implementasi spesifik dari bagian ini. Secara umum, cache tidak akan dihapus setelah metode menambahkan, menghapus dan memodifikasi dijalankan. Jadi gunakan @AfterReturning () untuk mengimplementasikannya. Hal -hal berikut perlu dilakukan dalam implementasi spesifik:
Implementasi spesifik adalah sebagai berikut:
@AfterReturning (value = "pointcut ()") Private Void Process (joinpoint goinpoint) {Methodyignature Signature = (Methodyignature) joinpoint.getSignature (); Metode metode = Signature.getMethod (); Cacheremove cacheremove = Method.getannotation (Cacheremove.class); if (cacheremove! = null) {string value = cacheremove.value (); String [] keys = cacheremove.key (); // tombol reguler yang perlu dihapus daftar CACHEKEYS = Cacheutils.cacheKeys (nilai); untuk (tombol string: tombol) {pola pola = pola.compile (key); untuk (objek CACHEKEY: CACHEKEYS) {string CACHEKEYRTR = String.VALUEOF (CACHEKEY); if (pola.matcher (CacheKeystr) .find ()) {cacheutils.remove (value, CacheKeyStr); }}}}}}}Di atas adalah implementasi spesifik cache penghapusan batch EHCACHE FUZZY. Di antara mereka, BusinessCacheutils merangkum kelas alat EHCACHE untuk dirinya sendiri. Ini terutama mengimplementasikan fungsi normal seperti mendapatkan kolam cache, mendapatkan cache, menghilangkan cache, menambahkan cache, dan melihat semua cache. Kodenya adalah sebagai berikut:
Cacheutils kelas publik {private static cachemanager cachemanager = springcontextholder.getbean ("ehcachemanagerfactory"); Objek statis public get (string cacheName, tombol string) {element element = getCache (cachename) .get (key); elemen mengembalikan == null? null: element.getObjectValue (); } public static void put (string cacheName, tombol string, nilai objek) {elemen elemen = elemen baru (tombol, nilai); getCache (Cachename) .put (elemen); } public static void REMOVE (String Cachename, String Key) {getCache (Cachename) .remove (key); } Daftar statis publik CacheKeys (String Cachename) {return getCache (Cachename) .getKeys (); } /*** Dapatkan cache, jika tidak ada yang dibuat. * @param Cachename * @return */ private static cache getCache (string cacheName) {cache cache = cacheManager.getCache (cache); if (cache == null) {cachemanager.addcache (cachename); cache = cacheManager.getCache (Cachename); cache.getCacheConfiguration (). setTeTernal (true); } mengembalikan cache; } public static cacheManager getCachemanager () {return cacheManager; }}Pada titik ini, seluruh fungsi penghapusan Batch EHCACHE Fuzzy diimplementasikan.
Meringkaskan
Seluruh proses memiliki ide sederhana, dan setelah menggunakan beberapa pengetahuan AOP, fungsi yang diperlukan selesai. Namun, penghapusan spesifik beberapa kode dapat dipertimbangkan untuk optimasi. Melalui semua loop cache, semua cache yang perlu dihapus dihapus, alih -alih berpikir bahwa ada beberapa kunci seperti ini, cache lengkap dilalui beberapa kali. Implementasi spesifik diserahkan kepada pembaca. Semoga ini akan membantu Anda. Saya juga berharap semua orang akan lebih mendukung wulin.com.