Die Hauptforschung in diesem Artikel besteht darin, Spring's Interceptor zur benutzerdefinierten Cache -Implementierung zu verwenden, und der spezifische Implementierungscode lautet wie folgt.
Memcached ist ein Hochleistungs-Verteilungs-Speicherobjekt-Caching-System für dynamische Webanwendungen, um die Datenbanklast zu reduzieren. Es reduziert die Häufigkeit, mit der die Datenbank von zwischengespeicherten Daten und Objekten im Speicher gelesen wird, wodurch die Geschwindigkeit dynamischer, datenbankgesteuerter Websites erhöht wird. In diesem Artikel wird die Memcached Instance und Spring Interceptor verwendet, um die Cache -Anpassung zu implementieren. Verwenden Sie den Interceptor, um benutzerdefinierte Cache -Tags und die Strategie zur Erzeugung der wichtigsten Wertschöpfung zu lesen.
paket com.jeex.sci; @target (elementtype.method) @Retention (retentionPolicy.runtime) @Inherited @Documented public @Interface CANGABLE {String -Namespace (); String key () default ""; int [] keyArgs () Default {}; abläuft () Standard 1800;} paket com.jeex.sci; @target (elementtype.method) @retention (retentionPolicy.runtime) @Inherited @Documented public @Interface CacheeVict {String -Namespace (); "";} öffentliches Objekt Invoke (MethodInvocation Invoction) löscht Throwable {Method -Methode = InvoceTion.getMethod (); cacheable c = methode HandleCacheeVict (Invoction, CE);} Return Injection.Procece ();} Private Object HandleCacheable (MethodInvocation Invoction, Method -Methode, Cacheable c) löst Throwable {String Key = getKey (Invoction, KeystyInfo.FromCacheable (c)); if (key.equals ("")) {if (log.isdebugenable ()) {{long.warn ("leerer Cache -Taste, die Methode ISDEBugenable ("; NSTAG = (lang) memcachedget (C.NameSpace ()); if (nSTAG == null) {nSTAG = long.valueof (System.CurrentTimemillis ()); memcachedset (C.NameSpace (), 24*3600, long.ValueOf (nSTAGEDSET);},} =} = makemememcachke (C. NSTAG); Schlüssel); Objekt o = null; o = memcachedget (Schlüssel); if (o! Invoction.Procece (); memcachedset (Schlüssel, C.Expires (), O);} return o;} Private Object HandleCacheeVict (MethodInvocation Invoction, Cacheevict CE) löscht Throwable {String Key = getKey (Invoction, KeyInfo.FromCacheeVict (CE)); if (key.equals ("") {if (log.isdebugenabled ()) {log.debug ("evicting" + ce.namePace ()); } memcachedDelete (ce.NamePace ()); } else {long nstag = (lang) memcachedget (ce.Namespace ()); if (nSTAG! if (log.isdebugenabled ()) {log.debug ("evicing" + key); } memcachedDelete (Schlüssel); }} return Injection.Procece (); } // Parameter verwenden, die in die Methode abgefangen wurden, um Parameter private String getKeyWithargs (Object [] args, int [] argindex) {StringBuilder key = new StringBuilder (); boolean zuerst = wahr; für (int index: argIndex) {if (index <0 || index> = args.length) {werfen Sie neue IllegalArgumentException ("Index aus gebunden"); } if (! First) {Key.Append (':'); } else {first = false; } key = key.append (args [index]); } return key.toString (); } private String getKeywithProperties (Objekt O, String props []) löst eine Ausnahme aus {StringBuilder key = new StringBuilder (); boolean zuerst = wahr; für (String -Prop: Props) {// Die Bean -Eigenschaft in den Namen der Methode String methodname = "get" + prop.substring (0, 1) .toUppercase () + prop.substring (1); Methode M = O.GetClass (). GetMethod (methodName); Objekt r = m.invoke (o, (Objekt []) null); if (! First) {Key.Append (':'); } else {first = false; } key = key.append (r); } return key.toString (); }// Verwenden Sie den Generator, um die wichtige private Zeichenfolge GetKeyWithGenerator (MethodInvocation Injection, String KeyGenerator) zu generieren. CacheKeyGenerator IKG = (CacheKeyGenerator) ckg.Newinstance (); return ikg.generate (invoceTion.getArguments ()); }
private statische Klasse keyInfo {String key; int [] keyArgs; String keyProperties []; String keygenerator; static keyInfo from caintable (cacheable c) {keyInfo ki = new keyInfo (); ki.key = c.Key (); C.kegenerator (); ce.KeGenerator (); // Taste mit den Parametern @cacheable (Namespace = "BlackList", KeyArgs = {0, 1}) public intothermethond (int a, int b) {return 100; } paket com.jeex.sci.test; import net.spy.memcached.memcachedClient; import org.junit.test; import org.springFramework.context.ApplicationContext; args []) löscht die InterruptedException aus {applicationContext ctx = new FileSystemXMLApplicationContext ("/src/test/ressourcen/beans.xml"); (BlackListdaoImpl) ctx.getbean ("BlackListdaoImpl"); while (true) {System.out.println("############################################################################## ################################################################################################### ################################################################################################### #################################################################################################### Starten Sie ################################################################################################# ## zu erhalten. BlackListQuery (1, "123.231.23.14"); Dao.anothermethond (333, 444); dao.searchblacklistCount2 (query2); dao.searchblacklistCount3 (query2); dao.evict (query); dao.searchblacklistCount2 (Abfrage); Dao.evictall (); Dao.SearchblacklistCount (Query2); Thread. 300);Das obige ist der gesamte Inhalt dieses Artikels über den Implementierungsbeispielcode für benutzerdefinierte Cache mit Spring's Interceptor, und ich hoffe, dass dies für alle hilfreich sein wird. Interessierte Freunde können weiterhin auf andere verwandte Themen auf dieser Website verweisen. Wenn es Mängel gibt, hinterlassen Sie bitte eine Nachricht, um darauf hinzuweisen. Vielen Dank an Freunde für Ihre Unterstützung für diese Seite!