مقدمة
كما نعلم جميعًا ، فإن Encache هو إطار التخزين المؤقت Open Source الأكثر شعبية في Java الآن ، مع تكوين بسيط ، بنية واضح ووظائف قوية. من خلال التعليق القابل للتأثير ، يمكنك إضافة نتائج الطريقة بسرعة إلى ذاكرة التخزين المؤقت. يمكن مسح ذاكرة التخزين المؤقت المحددة بسرعة من خلال cacheeVict.
ومع ذلك ، نظرًا لأن التعليق التوضيحي CacheeVict يستخدم القيمة الرئيسية ولا يدعم الحذف الغامض ، ستواجه مشاكل. عندما أستخدم @cachable للتعاون مع تعبيرات الربيع EL ، أقوم بإضافة مخابئ متعددة من نفس الطريقة ، مثل:
getMapping ("/listoftask/{page}/")@cachable (value = "businessCache" ، key = "'' listoftask _ '+ #page") public rosseMessage <PageTaskVo> getTaskList (pathvariable ("page")الرمز أعلاه هو الحصول على معلومات المهمة عن طريق الترحيل. استخدم تعبير EL للحصول على الصفحة في المعلمة واستخدم مفتاح ذاكرة التخزين المؤقت لإضافته إلى ذاكرة التخزين المؤقت لـ Ehcache باستخدام cachable. في هذا الوقت ، ستظهر مفاتيح type listoftask_1 ، listoftask_2 ، listoftask_3 في ذاكرة التخزين المؤقت.
عند إضافة المهام أو حذفها ، ستتغير القائمة. في هذا الوقت ، تحتاج إلى إزالة جميع ذاكرة التخزين المؤقت المتعلقة بـ Listoftask_*. في هذا الوقت ، لا أعرف مقدار المحتوى المتعلق بـ Listoftask_* الذي تم تخزينه مؤقتًا في ذاكرة التخزين المؤقت ، لذلك من المستحيل استدعاء CacheeVict لحذفه واحدًا تلو الآخر.
نظرًا لأن Ehcache نفسها لا يمكن أن تدعمها ، لا يمكننا تنفيذها إلا.
ينجز
بالنظر إلى ذاكرة التخزين المؤقت المضافة باستخدام التعليقات التوضيحية ، فإن إزالة التخزين المؤقت يستخدم أيضًا معالجة التعليقات التوضيحية للحفاظ على تناسق التطوير. التعليقات التوضيحية هي أيضا ودية للغاية للمطورين. ثم نفكر في استخدام التعليقات التوضيحية المخصصة لطمس إزالة الدُفعات من ذاكرة التخزين المؤقت.
أولاً ، حدد شرح Cacheremove:
target ({java.lang.annotation.elementType.method}) @entry (enthinationpolicy.runtime) public interface cacheremove {string value () ؛ سلسلة [] key () ؛}حيث ، تكون القيمة مثل ehcache ، تستخدم لتحديد اسم ذاكرة التخزين المؤقت للعمل. المفتاح هو صفيف يخزن التعبيرات العادية لمفاتيح مخبأة متعددة. تسمية Cacheremove واضحة وسهلة الفهم ولا تتعارض مع شرح Ehcache نفسه. ينتهي تعريف التعليق التوضيحي هنا. بعد ذلك ، تحتاج إلى التعامل مع التعليقات التوضيحية. نظرًا لاستخدام إطار الربيع ، فمن الطبيعي أن تفكر في استخدام AOP لإجراء تعليقات توضيحية.
الغرض من التعليقات التوضيحية هو إزالة ذاكرة التخزين المؤقت غير واضحة. يجب مراعاة القضيتين التاليتين:
الطريقة التي أعطيتها وأبسط طريقة أعتقد أنها:
أولاً ، حدد اسم الفصل CacheremoVeaspect:
@side @componentpublic class cacheremoveaspect { @pointcut (value = "(execution (**.*(..)) && annotation (com.example.cacheremove)))حدد الظل في منطقة التقطيع ، واستخدم التنفيذ (**.*(..) && annotation (com.example.cacheremove)) للإشارة إلى أن جميع الفئات المشروحة يتم تنفيذ cacheremove ، والقيم في التحميل هي الأسماء المؤهلة بالكامل للشروط.
بعد تحديد نقطة شق ، فإن التمييز التالي هو التنفيذ المحدد للقسم. بشكل عام ، لن تتم إزالة ذاكرة التخزين المؤقت بعد تنفيذ طريقة إضافة وحذف وتعديل. لذا استخدم apterReturning () لتنفيذها. يجب القيام بالأشياء التالية في التنفيذ المحدد:
التنفيذ المحدد هو كما يلي:
AfterReturning (value = "pointcut ()") عملية void الخاصة (JoinPoint joinpoint) {methodsIgnature signature = (MaysIgnature) JoinPoint.getSignature () ؛ طريقة طريقة = signature.getMethod () ؛ cacheremove cacheremove = method.getAnnotation (cacheremove.class) ؛ if (cacheremove! = null) {string value = cacheremove.value () ؛ سلسلة [] مفاتيح = cacheremove.key () ؛ // المفاتيح العادية التي تحتاج إلى إزالة قائمة cachekeys = cacheutils.cachekeys (القيمة) ؛ لـ (مفتاح السلسلة: مفاتيح) {pattern pattern = pattern.compile (key) ؛ لـ (Object cachekey: cachekeys) {String cacheKeyStr = string.valueof (cachekey) ؛ if (pattern.matcher (cacheKeyStr) .Find ()) {cacheutils.remove (value ، cachekeyststr) ؛ }}}}}}}ما سبق هو التنفيذ المحدد لذاكرة التخزين المؤقت لإزالة الدُفعات الغامضة ehcache. من بينها ، تقوم BusinessCanceUtils بتغليف فئة أدوات Ehcache لنفسها. إنه ينفذ بشكل أساسي وظائف طبيعية مثل الحصول على تجمعات ذاكرة التخزين المؤقت ، والحصول على ذاكرة التخزين المؤقت ، وإزالة ذاكرة التخزين المؤقت ، وإضافة ذاكرة التخزين المؤقت ، وعرض جميع ذاكرة التخزين المؤقت. الرمز كما يلي:
cacheutils الفئة العامة {private static cachemanager cachemanager = springContextholder.getBean ("ehcachemanagerfactory") ؛ الكائن الثابت العام الحصول على (سلسلة cachename ، مفتاح السلسلة) {element = getCache (cachename) .get (مفتاح) ؛ عنصر العودة == فارغ؟ null: element.getObjectValue () ؛ } وضع الفراغ الثابت العام (سلسلة cachename ، مفتاح السلسلة ، قيمة الكائن) {element element = element new (key ، value) ؛ getCache (cachename) .put (العنصر) ؛ } إزالة الفراغ الثابت العام (سلسلة cachename ، مفتاح السلسلة) {getCache (cachename) .remove (مفتاح) ؛ } القائمة الثابتة العامة cachekeys (سلسلة cachename) {return getCache (cachename) .getkeys () ؛ } /*** احصل على ذاكرة التخزين المؤقت ، إذا لم يتم إنشاء أحد. * param cachename * return */ private static cache getCache (سلسلة cachename) {cache cache = cachemanager.getCache (cachename) ؛ if (cache == null) {cachemanager.addcache (cachename) ؛ Cache = cachemanager.getCache (cachename) ؛ cache.getCacheConfiguration (). seteternal (true) ؛ } إرجاع ذاكرة التخزين المؤقت ؛ } cachemanager static static getCachemanager () {return cachemanager ؛ }}في هذه المرحلة ، يتم تنفيذ وظيفة إزالة الدُفعات الغامضة Ehcache بأكملها.
لخص
العملية برمتها لديها فكرة بسيطة ، وبعد استخدام بعض المعرفة AOP ، يتم الانتهاء من الوظائف المطلوبة. ومع ذلك ، يمكن النظر في الإزالة المحددة لبعض الرموز للتحسين. من خلال جميع حلقات ذاكرة التخزين المؤقت ، تتم إزالة جميع ذاكرة التخزين المؤقت التي تحتاج إلى إزالتها ، بدلاً من التفكير في أن هناك العديد من المفاتيح مثل هذا ، يتم اجتياز ذاكرة التخزين المؤقت الكاملة عدة مرات. يتم ترك التنفيذ المحدد للقراء لإكماله. آمل أن يكون ذلك مفيدًا لك. آمل أيضًا أن يدعم الجميع wulin.com أكثر.