Penelitian utama dalam makalah ini adalah menggunakan Interceptor Spring untuk implementasi cache khusus, dan kode implementasi spesifik adalah sebagai berikut.
Memcached adalah sistem caching objek memori terdistribusi berkinerja tinggi untuk aplikasi web dinamis untuk mengurangi beban basis data. Ini mengurangi berapa kali database dibaca oleh data yang di-cache dan objek dalam memori, sehingga meningkatkan kecepatan situs web dinamis, yang digerakkan oleh database. Artikel ini menggunakan instance memcached dan Spring Interceptor untuk mengimplementasikan kustomisasi cache. Gunakan Interceptor untuk membaca tag cache khusus dan strategi pembuatan nilai kunci.
package com.jeex.sci;@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface Cacheable {String namespace();String key() default "";int[] keyArgs() default {};String[] keyProperties() default {};String keyGenerator() default ""; int berakhir () default 1800;} Paket com.jeex.sci; @target (elementType.method) @retention (retentionPolicy.runtime) @inherited @documented public @interface cacheevict {string namespace (); string (] default ""; int [] keyArgs () default {}; string (]) Default (] default "; int [] keyArgs () default {}; string (] (] KEYPROURE (] KEYPROURE (] DEFAULT () DEFAULT {{}; "";} Objek Publik Invoke (MethodInvocation Invoction) melempar Throwable {Method Method = Invoction.getMethod (); cacheable c = Method.getanNotation (Cacheable.class); if (c! = null) {return handlecacheable (cacheable (cachevice, cace; ce! CaceEvict ce! handlecacheevict (invoction, ce);} return injection.proed ();} Private Object Handlecacheable (MethodInvocation Invoction, Metode Metode, Cachable C) melempar lempar {string key = getKey (Invoction, keyInfo.fromCeable (c)); if (key.equals ("")) {if (log.isdebugeNabled ()) {log.warn ("cache cache cache (" log.isdebugEnable ()) {log.warn ("cache cache cake," cache cache, "methody) {log.warn (" if method.isdebugEnabled () {log.warn ("if methody) {log.warn (" if method.isdebugEnabled () {LOG.WARN ("DRAKEDEBUGENED () injection.proceed();}long nsTag = (long) memcachedGet(c.namespace());if (nsTag == null) {nsTag = long.valueOf(System.currentTimeMillis());memcachedSet(c.namespace(), 24*3600, long.valueOf(nsTag));}key = MakeMemCachedKey (c.namespace (), nStag, key); objek o = null; o = memcachedget (key); if (o! = null) {if (log.isdebugeNabled ()) {log.debug ("cache hit: cache key =" + key);} {if lOG. {LOG.DEBUG ("Cache Miss: Cache Key =" + Key);} o = Invoction.Proed (); memcachedset (key, c.expires (), o);} return o;} Private Object Handlecacheevict (MethodInvocation Invoction, Cacheevict CE) melempar Throwable {String Key = GetKey (Invoction, KeyInfo.FromCacheEvict (CE)); if (key.equals ("")) {if (log.isdebugeNabled ()) {log.debug ("Excting" + ce.namespace ()); } memcacheddelete (ce.namespace ()); } else {long nStag = (long) memcachedget (ce.namespace ()); if (nStag! = null) {key = makeMemCachedKey (ce.namespace (), nStag, key); if (log.isdebugeNabled ()) {log.debug ("Excting" + key); } memcachedDelete (key); }} return Injection.proed (); } // Gunakan parameter yang dicegat ke metode ini untuk menghasilkan parameter pribadi string getKeywithArgs (objek [] args, int [] argIndex) {stringBuilder key = new stringBuilder (); boolean pertama = true; untuk (indeks int: argIndex) {if (index <0 || index> = args.length) {lempar new IllegalArgumentException ("Index out of Bound"); } if (! first) {key.append (':'); } else {first = false; } key = key.append (args [index]); } return key.toString (); } Private String getKeyWithProperties (Object O, String Props []) melempar Exception {StringBuilder key = New StringBuilder (); boolean pertama = true; untuk (string prop: props) {// konversi properti bean ke nama metode string methodName = "get" + prop.substring (0, 1) .touppercase () + prop.substring (1); Metode m = o.getClass (). GetMethod (methodName); Objek r = m.invoke (o, (objek []) null); if (! first) {key.append (':'); } else {first = false; } key = key.append (r); } return key.toString (); } // Gunakan generator untuk menghasilkan string pribadi kunci getKeyWithGenerator (MethodInvocation Injection, String KeyGenerator) melempar Exception {class <?> Ckg = class.forname (keygenerator); CacheKeyGenerator IKG = (CacheKeyGenerator) ckg.newinstance (); return ikg.generate (Invoction.getArguments ()); } Private Static Class keyInfo {string key; int [] keyArgs; string keyproperties []; string keygenerator; static keyInfo fromcacheable (cacheable c) {keyinfo ki = KeyInfo baru (); ki.key = c.key (); ki.keyargs = c.keyargs (); ki.key = c.key (); ki.keyargs = c.keyargs (); ki.key = c.key (); ki.keyargs = c.keyargs (); ki. c.keygenerator (); ki.keyproperties = c.keyproperties (); return ki;} static keyinfo dariCacheevict (Cacheevict CE) {KeyInfo Ki = KeyInfo baru (); ki.key = ce.keny (); ki.keyargs = ce.keyargs (); KEKGY (); KI.Keyargs = ce.keyargs (); ce.keygenerator (); ki.keyproperties = ce.keyproperties (); return ki;} string key () {return key;} int [] keyArgs () {return keyArgs;} string [] keyProPerties () {return keyProPerties;} string keygenerator () {) {return keygen; // Setel key dengan parameter @cacheable (namespace = "blacklist", keyArgs = {0, 1}) public int lainMethond (int a, int b) {return 100; } Paket com.jeex.sci.test; impor net.spy.memcached.memcachedclient; impor org.junit.test; impor org.springframework.context.appplicationContext; Impor org.springframework.context.support.filesysysemxmxmxmxmxmxmxmxmxmxmxmxmxmxmxmxmxmxmxmxmxmxmxmxmxmxmxmxmxmxmxmxmxmxmxmxMxmxmxmxmxmxmxmxmxmxmxmxmxmxmxmxmxmxmxmxmxmxmxmxmxmxmxmxmxmxmxMlapplapping args []) melempar InterruptedException {ApplicationContext ctx = FileSySyStemXMLapPlicationContext baru ("/src/test/sumber daya/beans.xml"); memcachedclient mc = (memcachedclient) ctx.getbean ("memcachedclient"); memcachedclient) ctx.getbean ("memcachedclient"); memcachedclient) ctx.getbean ("memcachedclient"); memcachedclient) ctx.getbean ("memcachedclient"); memcachedclient) ctx (BlackListdaoImpl) ctx.getbean ("BlackListdaoImpl"); while (true) {System.out.println ("############################################ ####################################################### ####################################################### ####################################################### Mulai ################################ "); mc.flush (); BlacklistQuery Query = New BlackListQuery (1," 222.231.23.13 "); Dao.SearchBlacklistcount (QUERY); DAO.23); New BlackListQuery (1, "123.231.23.14"); Dao.anothermethond (333, 444); dao.searchblacklistCount2 (query2); dao.searchblacklistcount3 (query2); dao.evict (kueri); dao.searchblacklistCount2 (query); dao.evictall (); dao.searchblacklistcount3 (query2);Di atas adalah seluruh konten artikel ini tentang kode contoh implementasi untuk cache khusus menggunakan Interceptor Spring, dan saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!