1 مقدمة إلى Ehcache
Ehcache هو إطار تخزين مؤقت في Java في عملية التخزين المؤقت ، مع ميزات سريعة وليمن ، وهو Cacheprovider الافتراضي في السبات.
Ehcache هو ذاكرة التخزين المؤقت الموزعة على نطاق واسع المصدر مفتوح المصدر. تهدف بشكل أساسي إلى ذاكرة التخزين المؤقت العالمية ، Java EE وحاويات خفيفة الوزن. إنه يحتوي على ميزات تخزين الذاكرة وتخزين القرص ، وعملية تخزين ذاكرة التخزين المؤقت ، وذاكرة التخزين المؤقت ، ومعالج استثناء ذاكرة التخزين المؤقت ، ومرشح Servlet ذاكرة التخزين المؤقت GZIP ، ويدعم APIs REST و SOAP.
تم تطوير Ehcache في الأصل بواسطة Greg Luck في عام 2003. في عام 2009 ، تم شراء المشروع بواسطة Terracotta. لا يزال البرنامج مفتوحًا المصدر ، ولكن لا يمكن استخدام بعض الميزات الرئيسية الجديدة (على سبيل المثال ، الاتساق بين قابلية إعادة التشغيل السريعة) إلا في المنتجات التجارية ، مثل Enterprise Ehcache و BigMemory. يستخدم Foundation Foundation Wikimedia حاليًا تقنية Ehcache.
باختصار ، لا تزال Ehcache تقنية التخزين المؤقت الجيدة. دعنا نلقي نظرة على كيفية تنفيذ الربيع مع Ehcache.
2 ربيع مع ehcache
نتائج النظام هي كما يلي:
3 مقدمة تكوين محددة
هناك مجموعات من هذه الأجزاء:
SRC: رمز Java ، بما في ذلك Interceptor ، واجهة الاتصال ، فئة الاختبار
src/cache bean.xml: قم بتكوين الفاصوليا المقابلة لـ ehcache ، اعتراض ، واختبار فئات ، إلخ.
src/ehcache.xml: معلومات تكوين ذاكرة التخزين المؤقت ehcache
webroot/lib: مكتبة
4 مقدمة مفصلة للمحتوى
4.1 SRC
4.1.1 اعتراض
تم تكوين اثنين من التقاطعات لأول مرة في الكود:
أول اعتراض هو:
com.test.ehcache.cachemethodinterceptor
المحتوى كما يلي:
package com.test.ehcache ؛ استيراد java.io.serializable ؛ استيراد net.sf.ehcache.cache ؛ استيراد net.sf.ehcache.element ؛ استيراد org.aopalliance.Intercept.methodInterceptor ؛ org.springframework.util.assert ؛ الطبقة العامة cachemethodinterceptor تنفذ methodInterceptor ، initializingBean {private cache cache ؛ public void setCache (cache cache) {this.cache = cache ؛ } public cachemethodInterceptor () {super () ؛ } /*** اعتراض طريقة serviceManager ومعرفة ما إذا كانت النتيجة موجودة. إذا كان موجودًا ، فأرجع القيمة في ذاكرة التخزين المؤقت. * خلاف ذلك ، أعد نتيجة استعلام قاعدة البيانات ووضع نتيجة الاستعلام في ذاكرة التخزين المؤقت */كائن عام استدعاء (استدعاء MethodInvocation) رمي {// احصل على اسم سلسلة الفئة المراد اعتراضها = invocation.getThis (). getClass (). getName () ؛ // احصل على طريقة الفئة المراد اعتراضها methodName = invocation.getMethod (). getName () ؛ // احصل على معلمات طريقة الفئة المراد اعتراضها [] وسيطات = invocation.getArguments () ؛ نتيجة الكائن // قم بإنشاء سلسلة لجعل المفتاح في Cache String cachekey = getCacheKey (اسم TargetName ، MethodName ، وسيطات) ؛ // الحصول على بيانات من عنصر Cache element = cache.get (cachekey) ؛ إذا كان (element == null) {// إذا لم يكن هناك بيانات في ذاكرة التخزين المؤقت ، فابحث عن عدم ذاكرة التخزين المؤقت ، مثل قاعدة البيانات ، ووضع تلك الموجودة في نتيجة ذاكرة التخزين المؤقت = invocation.proceed () ؛ // إنشاء المفتاح والقيمة التي سيتم تخزينها في عنصر ذاكرة التخزين المؤقت = العنصر الجديد (Cachekey ، (Serializable) نتيجة) ؛ System.out.println ("---- أدخل البحث غير ذي خدم ، مثل البحث عن قاعدة البيانات مباشرة ، ووضعها في ذاكرة التخزين المؤقت بعد البحث") ؛ // قم بتخزين المفتاح والقيمة في ذاكرة التخزين المؤقت cache.put (العنصر) ؛ } آخر {// إذا كانت هناك بيانات في ذاكرة التخزين المؤقت ، فابحث عن نظام التخزين المؤقت. } return element.getValue () ؛ } /*** طريقة للحصول على مفتاح ذاكرة التخزين المؤقت. مفتاح ذاكرة التخزين المؤقت هو المعرف الفريد لعنصر في ذاكرة التخزين المؤقت. * بما في ذلك اسم الحزمة + اسم الفئة + اسم الطريقة ، مثل: com.test.service.testServiceImpl.getObject */ private string getCacheKey (سلسلة الأسلوب ، اسم methodname ، كائن [] وسيطات) {StringBuffer sb = new StringBuffer () ؛ SB.Append (TargetName) .Append ("."). إلحاق (methodName) ؛ if ((الوسيطات! = null) && (endress. }} return sb.toString () ؛ } / ** * تنفيذ initializingBean ، تحقق مما إذا كانت ذاكرة التخزين المؤقت فارغة 70 * / public void بعد propertiesset () يرمي الاستثناء {assert.notnull (ذاكرة التخزين المؤقت ، "تحتاج إلى ذاكرة التخزين المؤقت. يرجى استخدام setCache (ذاكرة التخزين المؤقت) إنشاءه.") ؛ }}يتم استخدام CacheMethodInterceptor لاعتراض الأساليب التي تبدأ بـ "GET". لاحظ أن هذا التقاطع يعترض أولاً ثم ينفذ واجهة الاتصال الأصلية.
هناك أيضًا اعتراض:
com.test.ehcache.cachefterReturningAdvice
محتوى محدد:
package com.test.ehcache ؛ استيراد java.lang.reflect.method ؛ استيراد java.util.list ؛ استيراد net.sf.ehcache org.springframework.util.assert ؛ الطبقة العامة cachefterReturningAdvice تنفذ بعد returningadvice ، تهيئة {ذاكرة التخزين المؤقت الخاصة ؛ public void setCache (cache cache) {this.cache = cache ؛ } cachefterReturningAdvice () {super () ؛ } public void refreturning (Object Arg0 ، method arg1 ، object [] arg2 ، object arg3) remable {string className = arg3.getClass (). getName () ؛ قائمة قائمة = cache.getkeys () ؛ لـ (int i = 0 ؛ i <list.size () ؛ i ++) {String cachekey = string.valueof (list.get (i)) ؛ if (cachekey.startswith (className)) {cache.remove (cachekey) ؛ System.out.println ("----- Clear Cache") ؛ }}} public void بعد propertiesset () يلقي استثناء {assert.notnull (ذاكرة التخزين المؤقت ، "بحاجة إلى ذاكرة التخزين المؤقت. يرجى استخدام setCache (ذاكرة التخزين المؤقت) إنشاءه.") ؛ }}يتم استخدام CachefterReturningAdvice لاعتراض الأساليب بدءًا من "التحديث". لاحظ أن هذا الاعتراض ينفذ أولاً واجهة الاتصال الأصلية ثم يتم اعتراضها.
4.1.2 استدعاء الواجهة
اسم الواجهة هو:
com.test.service.Servicemanager
المحتوى المحدد هو كما يلي:
package com.test.service ؛ import java.util.list ؛ public interface servicemanager {public list getObject () ؛ public void updateObject (كائن كائن) ؛ }اسم فئة التنفيذ هو:
com.test.service.servicemanagerimpl
المحتوى المحدد هو كما يلي:
package com.test.service;import java.util.ArrayList;import java.util.List;public class ServiceManagerImpl implements ServiceManager { @Override public List getObject() { System.out.println("----ServiceManager: This element does not exist in the cache cache, look up the database, and put it in the cache!"); العودة لاغية. } Override public void updateObject (كائن كائن) {system.out.println ("---- serviceManager: يتم تحديث الكائن ، وسيتم إزالة جميع ذاكرة التخزين المؤقت التي تم إنشاؤها بواسطة هذه الفئة!") ؛ }}4.1.3 فئة الاختبار
اسم فئة الاختبار هو:
com.test.service.testmain
المحتوى المحدد هو:
package com.test.service ؛ استيراد org.springframework.context.applicationContext ؛ استيراد org.springframework.context.support.classpathxmlapplicationContext ؛ public class testmain {public static void main (string) {string cachestring = "/cache-bean.xml" ؛ ApplicationContext Context = جديد classpathxmlapplicationContext (cachestring) ؛ // الحصول على الفاصوليا التي تم إنشاؤها بواسطة Proxy Factory Proxyfactory لإنشاء اعتراض Effect ServiceManager Service = (ServiceManager) Context.getBean ("proxyfactory") ؛ // أول مرة البحث system.out.println ("====== البحث الأول") ؛ TestService.getObject () ؛ // في المرة الثانية للبحث عن system.out.println ("====== Second Search") ؛ TestService.getObject () ؛ // في المرة الثانية للبحث عن system.out.println ("====== في المرة الثالثة للبحث") ؛ TestService.upDateObject (NULL) ؛ // في المرة الثالثة للبحث عن system.out.println ("======= في المرة الثالثة للبحث") ؛ TestService.getObject () ؛ }}لاحظ هنا أن الحصول على الفاصوليا يتم إنتاجه بواسطة ProxyFactory Proxy Factory ، بحيث يكون هناك تأثير اعتراض.
يمكن ملاحظة أن أربع مكالمات يتم تعيينها في فئة الاختبار ، وترتيب التنفيذ هو:
Lookup Second Lookup First Update Third Lookup
4.2 SRC/Cache bean.xml
يتم استخدام Cache-Bean.xml لتكوين الفاصوليا المقابلة لـ Ehcache ، و Interceptor ، و Fryses. المحتوى كما يلي:
<؟ <property name = "configlocation"> <value> ehcache.xml </value> </property> </bole> <!-حدد مصنع ehcache وتعيين اسم ذاكرة التخزين المؤقت المستخدمة ، أي ، "com.tt"-> <bean id = "ehcache"> <property name = "cachemanager" Cache-> <property name = "cachename"> <value> com.tt </value> </property> </boan> <!-اعتراض إنشاء ذاكرة التخزين المؤقت والاستعلام-> <bean id = "cachemethodInterceptor"> <property name = "cache"> id = "cacheafterReturningAdvice"> <property name = "cache"> <ref local = "ehcache" /> </property> </bean> <!-استدعاء الواجهة ، الكائن المعترض-> <bean id = "serviceManager" /> <!-أدخل التقاطع لتأكيد Interceptor الذي يطلق عليه اسم الطريقة والخصوصية ، com.test.ehcache.cachemethodinterceptor-> <bean id = "cachepointcut"> <!-إضافة قسم ، فإن القسم هو القسم الذي يتم إضافته بعد تنفيذ طريقة الطباعة-> <property name = "explive"> <ref local = "cachemethodinterceptor" /> < /propert يتوافق مع الحرف السابق مرة واحدة أو عدة مرات ###* يعني المطابقة للشخصية السابقة صفر أو عدة مرات ###/الهروب من أي رمز يستخدم في التعبير العادي-> <!-. اعتراض اعتراض الاسم ، اسم طريقة ، وما إلى ذلك ، استدعاء interceptor com.test.ehcache.cachefterReturningAdvice-> <bean id = "cachepointcutadvice"> <property name = "explive"> <ref local = "cacheafterReturningAdvice" /> < /propert <value>.*تحديث.*</value> </list> </property> </bean> <!-Agent Factory-> <bean id = "proxyfactory"> <!-الوصف اسم الواجهة الواجهة Bean-> <اسم property "> <ref local =" servicemanager "/> </propert <value> cachepointcut </value> <value> cachepointCutAdvice </value> </list> </sprention> </balls>
تم التعليق على محتويات كل حبة ولاحظت أنه لا تنسى حبوب المصنع.
4.3 SRC/ehcache.xml
Ehcache.xml يخزن معلومات مفصلة حول تكوين ذاكرة التخزين المؤقت Ehcache ، على النحو التالي:
<؟ <diskstore path = "d: // temp // cache"/> <defaultCache maxElementSinMemory = "1000" eternal = "false" timetoideseconds = "120" name = "com.tt" maxElementSinMemory = "10000" eternal = "false" timetoidleSeconds = "300000"
يمكنك أن ترى أن موقع التخزين للتخزين المخزونات يتم تعيينه على "D:/temp/cache" ، وتم تعيين اسم ذاكرة التخزين المؤقت على "com.tt" ، كما هو موضح في الشكل:
4.4 Webroot/lib
لمكتبة Java المطلوبة ، يرجى الاطلاع على صورة بنية النظام في البداية ، تم حذفها هنا.
5 اختبار
تنفيذ فئة الاختبار ، ونتائج الاختبار هي كما يلي:
من خلال نتائج التنفيذ يمكننا أن نرى:
بعد اعتراض البحث الأول ، وجد أنه أول اعتراض ولم يتم تخزين ذاكرة التخزين المؤقت. لذا قم أولاً بتنفيذ فئة الواجهة الأصلية للحصول على البيانات التي يتم الاستعلام عنها. يمكن الحصول عليها من خلال استعلام قاعدة البيانات ، ثم إنشاء ذاكرة التخزين المؤقت ووضع بيانات الاستعلام في ذاكرة التخزين المؤقت.
بعد اعتراض البحث الثاني ، تبين أن ذاكرة التخزين المؤقت موجودة بالفعل ، وبالتالي لم تعد فئة الواجهة الأصلية تنفذ ، أي أن قاعدة البيانات لم تعد تستفسر ، ويتم الحصول على بيانات الاستعلام مباشرة من خلال ذاكرة التخزين المؤقت. بالطبع ، إنها مجرد طباعة بسيطة هنا.
ثم هناك التحديث الأول . العملية التي تم إجراؤها بعد اعتراضها هي تخزين جميع البيانات الموجودة في ذاكرة التخزين المؤقت في قاعدة البيانات وحذف ذاكرة التخزين المؤقت.
وأخيرا ، هناك الاستعلام الثالث . بعد اعتراضه ، وجد أن النظام لا يحتوي على ذاكرة التخزين المؤقت ، وبالتالي فإن قاعدة بيانات استعلام فئة الواجهة الأصلية ، وإنشاء ذاكرة التخزين المؤقت ، ووضع البيانات التي تم الحصول عليها من الاستعلام الجديد في ذاكرة التخزين المؤقت. نفس طريقة الاستعلام الأول.
لقد قمنا حتى الآن بتنفيذ ما يجب القيام به بحلول الربيع مع Ehcache.
6 رمز مصدر المرفق
يمكن الحصول على رمز مصدر المرفق من موقع GitHub الخاص بي.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.