البحث الرئيسي في هذه الورقة هو استخدام اعتراض Spring لتنفيذ ذاكرة التخزين المؤقت المخصصة ، ورمز التنفيذ المحدد كما يلي.
Memcached هو نظام تخزين للتخزين المؤقت لكائن الذاكرة الموزعة عالي الأداء لتطبيقات الويب الديناميكية لتقليل تحميل قاعدة البيانات. إنه يقلل من عدد المرات التي تتم فيها قراءة قاعدة البيانات بواسطة البيانات والكائنات المخزنة مؤقتًا في الذاكرة ، وبالتالي زيادة سرعة مواقع الويب الديناميكية التي تعتمد على قاعدة البيانات. تستخدم هذه المقالة مثيل memcached و spring اعتراض لتنفيذ تخصيص ذاكرة التخزين المؤقت. استخدم Interceptor لقراءة علامات ذاكرة التخزين المؤقت المخصصة واستراتيجية توليد القيمة الرئيسية.
package com.jeex.sci ؛ @target (elementType.method) retention (entrentionpolicy.runtime) inheriteddocumented public interface cachable {string namepace () ؛ string key () تنتهي () الافتراضي 1800 ؛} package com.jeex.sci ؛ @target (elementType.method) retention (attreencepolicy.runtime) inheriteddocumented public interface cacheevict {string namepace () ؛ string key () "" ؛} استدعاء الكائن العام (invoction methodInvocation) رمي {method method = invoction.getMethod () ؛ cachable c = method.getAnnotation (cachable.class) ؛ if (c! = null) {return handlecachable (invoction ، m) ؛ HandleCacheeVict (Invoction ، CE) ؛} حقن الإرجاع. procede () ؛} كائن خاص handlecachable (invoction methodInvocation ، طريقة الطريقة ، قابلة للتخطيط c) رمي {string key = getKey (invoction ، keyinfo.fromcachable (c)) ؛ if (key.equals ("" meth) ؛ nstag = (long) memcacheDget ( المفتاح) ؛ الكائن o = null ؛ o = memcacheDget (مفتاح) ؛ if (o! = null) {if (log.isdebugenabled ()) {log.debug ("cache hit: cache key =" + key) ؛ invoction.proceed () ؛ memcachedset (المفتاح ، c.expires () ، o) ؛} إرجاع o ؛} كائن خاص HandleCacheeVict (MethodInvocation Invoction ، Cacheevict CE) يلقي رمي {string key = getKey (invoction ، keyinfo.fromcacheevict (CE)) ؛ if (key.equals ("")) {if (log.isdebugenabled ()) {log.debug ("evicting" + ce.namespace ()) ؛ } memcacheddelete (ce.namespace ()) ؛ } آخر {long nstag = (long) memcacheDget (ce.namespace ()) ؛ if (nstag! = null) {key = makeMemCacheDkey (ce.namespace () ، nstag ، key) ؛ if (log.isdebugenabled ()) {log.debug ("evicting" + key) ؛ } memcacheddelete (مفتاح) ؛ }} return injection.proceed () ؛ } // استخدم المعلمات التي تم اعتراضها على الطريقة لإنشاء معلمات السلسلة الخاصة getKeyWithArgs (Object [] args ، int [] argindex) {StringBuilder Key = new StringBuilder () ؛ منطقية أولاً = صواب ؛ لـ (int index: argindex) {if (index <0 || index> = args.length) {رمي new alfictalargumentException ("index out of bound") ؛ } if (! أولاً) {key.append (':') ؛ } آخر {first = false ؛ } key = key.append (args [index]) ؛ } return key.toString () ؛ } سلسلة private getKeyWithProperties (كائن O ، وسلسلة الدعائم []) يلقي استثناء {stringBuilder Key = new StringBuilder () ؛ منطقية أولاً = صواب ؛ لـ (String Prop: Props) {// قم بتحويل خاصية Bean إلى اسم Method String MethodName = "Get" + Prop.SubString (0 ، 1) .ToupperCase () + prop.SubString (1) ؛ الطريقة m = o.getClass (). getMethod (methodName) ؛ الكائن r = m.invoke (o ، (object []) null) ؛ if (! أولاً) {key.append (':') ؛ } آخر {first = false ؛ } key = key.append (r) ؛ } return key.toString () ؛ } // استخدم المولد لإنشاء سلسلة مفاتيح خاصة getKeyWithGenerator (حقن MethodInvocation ، سلسلة keygenerator) يلقي الاستثناء {class <؟> ckg = class.forname (keygenerator) ؛ CacheKeyGenerator IKG = (CacheKeyGenerator) ckg.newinstance () ؛ إرجاع ikg.generate (invoction.getArguments ()) ؛ } keyinfo {string string {string {string ؛ int [] keyargs ؛ keyproperties string [] ؛ سلسلة keygenerator ؛ keyinfo ثابت من القابلة للتشغيل (c) c.KeyGenerator () ؛ ki.keyproperties = c.KeyProperties () ؛ return ki ؛} keyinfo static fromcacheevict (cacheevict ce) {keyinfo ki = new keyinfo () ؛ ki.key = ce.key () ؛ ki.keyargs = ce.keyargs () ce.keygenerator () ؛ ki.keyproperties = ce.keyproperties () ؛ return ki ؛} مفتاح السلسلة () {return Key ؛} int [] keyargs () {return keyargs ؛} string [] keyproperties () {return keyproperties ؛ // SET KEY باستخدام parameters cachable (namepace = "Blacklist" ، keyargs = {0 ، 1}) public intshond (int a ، int b) {return 100 ؛ } حزمة com.jeex.sci.test ؛ استيراد net.spy.memcached.memcachedclient ؛ استيراد org.junit.test ؛ استيراد org.springframework.context.applicationContext ؛ args []) رميات interruptedException {ApplicationContext ctx = filedystemxmlapplicationContext ("/src/test/resourt (Blacklistdaoimpl) ctx.getbean ("Blacklistdaoimpl") ؛ بينما (صحيح) {system.out.println ( ################################################################################################### ################################################################################################### #################################################################################################### ابدأ ################################## ") ؛ MC.Flush () ؛ BlackListQuery Query = New BlackListQuery (1 ،" 222.231.23.13) ؛ Dao.SearchBlackListCount (query) ؛ Blacklistquery (1 ، "123.231.23.14") ؛ Dao.anothermethond (333 ، 444.ما سبق هو المحتوى الكامل لهذه المقالة حول رمز مثال التنفيذ لذاكرة التخزين المؤقت المخصصة باستخدام اعتراض الربيع ، وآمل أن يكون مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى الموضوعات الأخرى ذات الصلة على هذا الموقع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!