يمكن القول أن التخزين المؤقت وسيلة فعالة للغاية وبسيطة لتسريع استجابة الخدمة. في مجال التخزين المؤقت ، هناك العديد من الأطر المعروفة ، مثل Ehcache و Goaava و Hazelcast ، وما إلى ذلك. كقاعدة بيانات ذات قيمة رئيسية ، أصبحت Redis أيضًا أداة تخزين بيانات شهيرة بسبب ميزةها.
بالطريقة التقليدية ، يتم انتفاخ رمز معالجة ذاكرة التخزين المؤقت.
على سبيل المثال: نحتاج إلى إضافة وظيفة استعلام إلى وظيفة ذاكرة التخزين المؤقت ، والتي تتطلب ثلاث خطوات تقريبًا.
1. قبل تنفيذ الوظيفة ، نحتاج إلى التحقق مما إذا كانت هناك بيانات في ذاكرة التخزين المؤقت. إذا كان موجودًا ، فأرجع البيانات المخزنة مؤقتًا.
2. إذا لم يكن موجودًا ، فيجب الاستعلام عنه في بيانات قاعدة البيانات.
3. أخيرًا ، قم بتخزين البيانات في ذاكرة التخزين المؤقت. عندما تسمى هذه الوظيفة في المرة القادمة ، يمكنك استخدام البيانات المخزنة مؤقتًا مباشرة لتقليل الضغط على قاعدة البيانات.
إذن ما مقدار الرمز المطلوب لتنفيذ الخطوات الثلاث المذكورة أعلاه؟ هنا مثال:
الجزء الأحمر في الصورة أعلاه هو رمز القالب ، لكن الرمز المرتبط حقًا بهذه الوظيفة لا يمثل سوى 1/5. لجميع الوظائف التي تحتاج إلى تنفيذ وظائف ذاكرة التخزين المؤقت ، مطلوب رمز القالب المتضخم. إنه حل غير محدود للغاية.
فكيف يمكننا إعادة الرمز المتضخم إلى وقت الطازج؟
أليس AOP هو الحل الأفضل لهذا الرمز على غرار القالب؟ لحسن الحظ ، لم نعد بحاجة إلى تنفيذ الأقسام بأنفسنا. لقد زودنا SpringCache بقسم جيد. نحتاج فقط إلى عمل تكوينات بسيطة للعودة إلى الأصل ، مثل ما يلي:
تحتاج فقط إلى إضافة التعليقات التوضيحية. لا تحتاج حتى إلى تغيير الكود الأصلي. هل أنت حريص على تجربته؟
لا يوجد سوى ثلاث خطوات لتكوين SpringCache:
الخطوة 1: إضافة التبعيات ذات الصلة:
<Rependency> <roupeD> redis.clients </rougiD> <StifactId> jedis </shintifactid> <sored> 2.9.0 </version> </sependency> <reperence> <roupiD> org.springframework.data </groupId> <Rependency> <roupeD> org.apache.commons </groupId> <StifactId> commons-lang3 </shintifactid> <الإصدار> 3.3.2 </الإصدار> </التبعية>
الخطوة 2: تكوين SpringCache و Redis Connection وغيرها من المعلومات
ApplicationContext-redis.xml
<؟ xmlns: p = "http://www.springframework.org/schema/p" XSI: Schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/sctxt http://www.springframework.org/schema/mvc http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-4 cache-manager = "cachemanager" /> <!-Redis Connection Pool-> <bean id = "poolconfig"> <property name = "maxidle" value = "$ {redis.maxidle}" /> <property name = "maxwaitmillis" value = "$ {redis.maxwait} value = "$ {redis.testonborrow}"/> </bean> <!-مصنع الاتصال-> <bean id = "jedisconnectionfactory" p: host-name = "$ {redis.host}" p: port = "$ {pool {pool {pool redis. قالب-> <bean id = "redistemplate"> <property name = "connectionfactory" ref = "jedisconnectionfactory" /> </bean> <bean id = "cachemanager"> <property name = "caches"> <set> <! value = "content"/> <!-يجب استخدام الاسم المقابل للاسم في شرح الفئة أو الطريقة-> </bean> </set> </propertملف redis.properties:
# redis settings # server ip redis.host = 192.168.100.55 # redis port redis.port = 6379 # server pass redis.pass = # استخدم dbindex redis.database = 0 #max idel مثيل jedisredis.maxidle = 300 # مثيل ، ما تحصل عليه على سبيل المثال هو مفيدة.
الخطوة الثالثة هي كتابة فئة تنفيذ واجهة ذاكرة التخزين المؤقت
يوفر Spring فقط واجهة مجردة لذاكرة التخزين المؤقت ، ووظائف المكالمات من خلال الواجهات. لا يوجد فئة تنفيذ محددة ، لذلك نحتاج إلى تنفيذ عمليات محددة بأنفسنا.
في التكوين أعلاه ، يمكننا أن نرى أن كل فئة تنفيذ ستضخ مثيل Redistemplate ، ويمكننا تشغيل Redis من خلال Redistemplate
package com.cky.rest.utils ؛ استيراد java.io.serializable ؛ استيراد org.apache.commons.lang3.serializationutils ؛ استيراد org.springframework.cache org.springframework.dao.dataAccessException ؛ استيراد org.springframework.data.redis.connection.redisconnection ؛ استيراد org.springframework.data.redis.core.rediscallback redistemplate <string ، object> redistemplate ؛ اسم السلسلة الخاصة ؛ Override public void clear () {system.out.println ("---------------") ؛ redistemplate.execute (جديد rediscallback <string> () {Override public string doinredis (redisconnection connection) يلقي dataAccessException {connection.flushdb () ؛ إرجاع "ok" ؛}}) ؛ } override public void evict (مفتاح الكائن) {system.out.println ("-----------------") ؛ السلسلة النهائية keyf = key.toString () ؛ redistemplate.execute (جديد rediscallback <tong> () {Override public doinredis (connection redisconnection) يلقي DataAccessException {return connection.del (keyf.getbytes ()) ؛}}) ؛ } Override Public ValuewRapper Get (Object Key) {system.out.println ("---------------------"+key.toString ()) ؛ السلسلة النهائية keyf = key.toString () ؛ كائن كائن = فارغ ؛ object = redistemplate.execute (جديد rediscallback <object> () {Override الكائن العام doInredis (اتصال Redisconnection) يلقي DataAccessException {byte [] key = keyf.getbytes () ؛ byte [] value = connection.get (key) ؛ SerializationUtils.deserialize (القيمة) ؛ ValuewRapper OBJ = (كائن! = null؟ جديد SimpleValuewRapper (كائن): null) ؛ System.out.println ("---------------------------------"+OBJ) ؛ إرجاع OBJ ؛ } Override public void put (مفتاح الكائن ، قيمة الكائن) {system.out.println ("---------------------") ؛ System.out.println ("KEY ----:"+KEY) ؛ System.out.println ("Key ----:"+value) ؛ مفتاح السلسلة النهائية = key.toString () ؛ قيمة الكائن النهائي = القيمة ؛ LIVETIME النهائي = 86400 ؛ redistemplate.execute (جديد rediscallback <tong> () {override public doinredis (connection redisconnection) يلقي dataAccessException {byte [] keyb = keystring.getbytes () connect.expire (keyb ، livetime) ؛ } Override Public <T> t get (Object Arg0 ، class <t> arg1) {// todo method method method stub null ؛ } Override public string getName () {return this.name ؛ } Override public object getNativeCache () {return this.redistemplate ؛ } Override publuerrapper putifabsent (Object Arg0 ، Object Arg1) {// todo method method tuto method return null ؛ } RediStemplate <string ، object> getRedIstemplate () {return redistemplate ؛ } public void setRediStemplate (redistemplate <string ، object> redistemplate) {this.redistemplate = redistemplate ؛ } public void setName (اسم السلسلة) {this.name = name ؛ }}كان هناك خطأان أثناء عملية التكوين:
1.xxxx.classnotfoundexception أخيرًا ، وجدت أن تنزيل الجرة غير مكتمل. ما عليك سوى حذف مجلد حزمة JAR المقابل لمستودع Maven المحلي وقم بتنزيله مرة أخرى.
2.xxxx.methodnotfoundException هذا الموقف هو الإصدار الخاطئ ، ما عليك سوى التغيير إلى الإصدار في الخطوة الأولى.
استخدام التعليقات التوضيحية الشائعة في SpringCache:
@cachable anotation
سوف يكون التعليقات التوضيحية الأكثر استخدامًا تخزين قيمة إرجاع الطريقة المشروحة. كيف تعمل: انظر أولاً في ذاكرة التخزين المؤقت ، إذا لم يتم تنفيذ أي طريقة وتم تخزين النتيجة مؤقتًا ، ثم يتم إرجاع البيانات. يجب تحديد اسم ذاكرة التخزين المؤقت لهذا الشرح ويتوافق مع قيمة اسم ذاكرة التخزين المؤقت في ذاكرة التخزين المؤقت في Cachemanager. يمكن تحديدها باستخدام القيمة أو cachenames.
إذا لم يتم تحديد سمة مفتاح ، فسيستخدم Spring مولد المفتاح الأساسي الافتراضي لإنشاء مفاتيح أساسية. يمكنك أيضًا تخصيص المفتاح الأساسي ، ويمكن استخدام تعبيرات SPEL في المفتاح. على النحو التالي:
cachable (cachenames = "content" ، key = "#user.userid") المستخدم العام getUser (مستخدم المستخدم) {xxxxx}يمكنك استخدام سمة الشرط لإضافة شروط إلى ذاكرة التخزين المؤقت ، على النحو التالي:
cachable (cachenames = "content" ، key = "#user.userid" ، inction = "#user.age <40") المستخدم العام getUser (مستخدم المستخدم) {xxxxx}@Cacheput التعليق التوضيحي
قم بتنفيذ الطريقة أولاً ، ثم أعد قيمة الإرجاع مرة أخرى إلى ذاكرة التخزين المؤقت. يمكن استخدامها كتحديثات مخزنة مؤقتًا.
@cacheevict التعليق التوضيحي
هذا الشرح مسؤول عن إزالة البيانات بشكل صريح من ذاكرة التخزين المؤقت. عادةً ما يكون للبيانات المخزنة مؤقتًا تاريخ انتهاء صلاحية وسيتم إزالة البيانات أيضًا عند انتهاء صلاحيتها.
يحتوي هذا التعليق التوضيحي على سمتين إضافيتين:
ما إذا كان Allentries يزيل جميع إدخالات ذاكرة التخزين المؤقت.
قبل الموقع: أكمل عملية الإزالة قبل أو بعد الطريقة. صحيح/خطأ
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.