1. ما هو ذاكرة التخزين المؤقت
جاءت كلمة ذاكرة التخزين المؤقت لأول مرة من تصميم وحدة المعالجة المركزية
عندما ترغب وحدة المعالجة المركزية في قراءة بيانات ، تنظر أولاً من ذاكرة التخزين المؤقت لوحدة المعالجة المركزية ، وتقرأها على الفور وترسلها إلى وحدة المعالجة المركزية للمعالجة إذا تم العثور عليها ؛ إذا لم يتم العثور عليها ، فسيتم قراءتها من الذاكرة البطيئة نسبيًا وإرسالها إلى وحدة المعالجة المركزية للمعالجة. في الوقت نفسه ، يتم استدعاء كتلة البيانات التي توجد فيها هذه البيانات في ذاكرة التخزين المؤقت ، بحيث يمكن قراءة كتلة البيانات بأكملها من ذاكرة التخزين المؤقت في المستقبل دون استدعاء الذاكرة. إن آلية القراءة هذه هي التي تجعل معدل ذاكرة التخزين المؤقت لقراءة وحدة المعالجة المركزية مرتفعة للغاية (يمكن أن تصل معظم وحدات المعالجة المركزية إلى حوالي 90 ٪) ، مما يعني أن 90 ٪ من البيانات التي ستقرأها وحدة المعالجة المركزية في المرة القادمة في ذاكرة التخزين المؤقت لوحدة المعالجة المركزية ، وحوالي 10 ٪ فقط تحتاج إلى قراءة من الذاكرة. هذا يحفظ بشكل كبير وقت وحدة المعالجة المركزية لقراءة الذاكرة مباشرة ، ويجعل من المستحيل على وحدة المعالجة المركزية قراءة البيانات دون انتظار. بشكل عام ، يتم تخزين البيانات التي تقرأ بها وحدة المعالجة المركزية مؤقتًا أولاً ثم الذاكرة.
في وقت لاحق ، ذهبنا أولاً إلى ذاكرة التخزين المؤقت للقرص الثابت ، ثم إلى تطبيق ذاكرة التخزين المؤقت ، ذاكرة التخزين المؤقت للمتصفح ، ذاكرة التخزين المؤقت على الويب ، إلخ!
ذاكرة التخزين المؤقت هو الملك! !
ذاكرة التخزين المؤقت الربيع
SPRING CACHE هي مجموعة كاملة من حلول التخزين المؤقت للتطبيق المقدمة من تطبيقات الربيع.
لا توفر ذاكرة التخزين المؤقت لـ Spring نفسها تنفيذ ذاكرة التخزين المؤقت ، ولكنها تستخدم واجهات موحدة ومواصفات التعليمات البرمجية ، والتكوينات ، والتعليقات التوضيحية ، وما إلى ذلك لتمكينك من استخدام عمليات التخزين المؤقت المختلفة في تطبيقات الربيع دون الحاجة إلى إيلاء الكثير من الاهتمام لتفاصيل ذاكرة التخزين المؤقت. مع ذاكرة التخزين المؤقت الربيع ، يمكنك استخدامه بسهولة
تطبيقات ذاكرة التخزين المؤقت المختلفة ، بما في ذلك ConcurrentMap ، Ehcache 2.x ، JCache ، redis ، إلخ.
تعريف ذاكرة التخزين المؤقت في الربيع
تعريف ذاكرة التخزين المؤقت في الربيع ، بما في ذلك في الواجهة org.springframework.cache.cache.
يوفر الأساليب التالية بشكل أساسي
// احصل على القيمة وفقًا للمفتاح المحدد <t> t get (مفتاح الكائن ، الفئة <T> النوع) // احفظ القيمة المحددة إلى ذاكرة التخزين المؤقت وفقًا ل PUT VOID المفتاح المقابل (مفتاح الكائن ، قيمة الكائن) ؛
ليس من الصعب رؤية من التعريف أن ذاكرة التخزين المؤقت هي في الواقع بنية قيمة رئيسية. نقوم بتشغيل القيمة المقابلة من خلال مفتاح محدد.
مدير التخزين المؤقت
Cache عبارة عن مجموعة من القيم الرئيسية ، ولكن في مشروعنا ، قد يكون هناك ذاكرة التخزين المؤقت المختلفة لمختلف مواضيع الأعمال ، مثل ذاكرة التخزين المؤقت للمستخدمين ، ذاكرة التخزين المؤقت القسم ، إلخ. من أجل التمييز بين هذه التخزين المؤقت ، يتم توفير org.springframework.cache.cachemanager لإدارة المخابئ المختلفة. تحتوي هذه الواجهة على طريقتين فقط
// احصل على ذاكرة التخزين المؤقت للموضوع المقابل وفقًا لاسم Cache getCache (اسم السلسلة) ؛ // احصل على ذاكرة التخزين المؤقت لجميع المواضيع <string> getCachenames () ؛
في هذه الواجهة ، لا يُسمح بإضافة عمليات الإضافة وحذفها على ذاكرة التخزين المؤقت. يجب إكمال هذه العمليات داخليًا من خلال تطبيقات CacheManager المختلفة ويجب عدم الكشف عنها.
ذاكرة التخزين المؤقت القائمة على التعليقات التوضيحية
من الناحية النظرية ، فإن تشغيل ذاكرة التخزين المؤقت للبيانات ليس وثيق الصلة بالعمل نفسه. يجب علينا فصل عمليات القراءة والكتابة من ذاكرة التخزين المؤقت عن منطق الكود الرئيسي. تعتمد طريقة فصل الربيع على التعليق التوضيحي (بالطبع ، مثل JSR-107 ، وما إلى ذلك ، يعتمد أيضًا على التعليقات التوضيحية).
يوفر Spring سلسلة من التعليقات التوضيحية ، بما في ذلك cachable و Cacheput و CacheeVict وغيرها من التعليقات التوضيحية لتبسيط تشغيلنا في ذاكرة التخزين المؤقت. تقع هذه التعليقات التوضيحية في حزمة org.springframework.cache.annotation.
2. أمثلة
مثال بسيط على استخدام صندوق الربيع باستخدام ذاكرة التخزين المؤقت الربيع
دعنا نبني مثالًا بناءً
قم بإنشاء مشروع تمهيد ربيع جديد وقدم التبعيات التالية
<ependencies> <Rependency> <rougiD> org.springframework.boot </rougiD> <StifactId> ذاكرة التخزين المؤقت spring-boot-starter </inchifactid> </dependency> <reperence> <roupiD> org.springframework.boot </groupid> <roupl> org.springframework.boot </groupId> <StifactId> Spring-Boot-Starter-Test </artifactid> <scope> test </scope> </reperence> </sependencies>
من بينها ، يعتبر Cach-Starter-Boot-boot هو التبعية الرئيسية لذاكرة التخزين المؤقت.
قم بتعديل فئة التطبيق وإضافة التعليق التوضيحي الذي يمكّن ذاكرة التخزين المؤقت enableCaching
@springbootapplication@EnableCachingpublic Class CacheSimpleApplication {public static void main (string [] args) {springapplication.run (cacheMpleApplication.class ، args) ؛ }}يبدأ enablecache annotation آلية التخزين المؤقت لـ Spring ، والتي ستمكن التطبيق من اكتشاف جميع التعليقات التوضيحية المتعلقة بتذاكر ذاكرة التخزين المؤقت والبدء في العمل. سيقوم أيضًا بإنشاء حبة Cachemanager التي يمكن حقنها واستخدامها من قبل تطبيقنا.
قم بإنشاء فئة جديدة RestController
@restController @requestMapping ("/") الفئة العامة cachecontroller {autowired private cachetestservice cachetestService ؛ / ** * احصل على معلومات استنادًا إلى المعرف * * param id * return */ getMapping ("{id}") اختبار السلسلة العامة (pathvariable ("id") معرف السلسلة) {return cachetStService.get (id) ؛ } / ** * حذف المعلومات حول معرف * * param معرف * @RETURN * / deletemapping ("{id}") السلسلة العامة delete (pathVariable ("id") {report cachetStervice.Delete (id) ؛ } / ** * حفظ معلومات حول معرف * * param معرف * regurn * / postmapping save ( @ @requestparam ("id") string id ، @requestparam ("value") قيمة السلسلة) } / ** * معلومات حول معرف جديد * * param معرف * regurn * / putmapping ("{id}") تحديث السلسلة العامة (pathvariable ("id") معرف السلسلة ، requestparam ("value") قيمة السلسلة) }}يستدعي هذا الفصل خدمة لتنفيذ العملية الفعلية لإضافة وحذف وتعديل وفحص.
تنفيذ الخدمة
بعد ذلك ، نريد تنفيذ خدمتنا
servicepublic class SimpleCachetStServiceImpl تنفذ cachetestservice {private static final logger = loggerfactory.getLogger (SimpleCachetSterviceImpl.Class) ؛ الخريطة النهائية الخاصة <string ، string> ictities = new HashMap <> () ؛ public SimpleCachetestServiceImpl () {intities.put ("1" ، "this no 1") ؛ } Autowired Cachemanager Cachemanager ؛ OverRideCachable (cachenames = "test") السلسلة العامة GET (معرف السلسلة) {// سجل وقت توليد البيانات ، يستخدم لاختبار ومقارنة الوقت الطويل = Date (). getTime () ؛ // اطبع لوجبر cachemanager المستخدمة ("The CacheManager" + Cachemanager) ؛ // طباعة logger.info ("Get value by id =" + id + "، الوقت هو" + time) ؛ إرجاع "الحصول على قيمة بواسطة id =" + id + "، القيمة هي" + كيانات. get (id) ؛ } Override public string delete (string id) {return ictities.remove (id) ؛ } Override Public String Save (string ID ، قيمة السلسلة) {logger.info ("حفظ القيمة" + value + "باستخدام المفتاح" + معرف) ؛ الكيانات. قيمة الإرجاع } Override Public String Update (string ID ، قيمة السلسلة) {إرجاع كيانات. }}مخبأ
أولاً ، أضف التعليق التوضيحي القابل للتأثير إلى طريقة GET وقم بتشغيل اختبار التعليمات البرمجية.
نحن نستخدم ساعي البريد للاختبار ، وعنوان الاختبار هو http: // localhost: 8080/1 ، يستجيب المتصفح للحصول على قيمة بالمعرف = 1 ، القيمة isthis رقم 1 ، تحكم وحدة الخادم سطرين من السجلات
احصل على قيمة حسب المعرف = 1 ، القيمة لا تحصل على قيمة 1 حسب المعرف = 1 ، والوقت هو 1516004770216
ولكن عندما نقوم بتحديث عنوان المتصفح مرة أخرى ، يعود المتصفح بشكل طبيعي ، لكن وحدة التحكم لم تعد تطبع. والسبب هو أنه عندما نسميها في المرة الثانية ، لم يعد الربيع ينفذ الطريقة ، ولكن يحصل مباشرة على القيمة المخزنة مؤقتًا. يخبّر ذاكرة التخزين المؤقت لـ Spring قيمة إرجاع الوظيفة كمفتاح في ذاكرة التخزين المؤقت المسماة.
نستخدم هنا التعليق التوضيحي القابل للآثار ، ويحدد الأسماء الخشبية في التعليق التوضيحي أي ذاكرة التخزين المؤقت التي يتم قراءتها هنا. هنا ، سوف نبحث عن كائن ذاكرة التخزين المؤقت التي يكون مفتاحها معرف في cachename = "اختبار".
حذف البيانات المخبأة
في البرنامج أعلاه ، إذا قمنا بحذف القيمة المحددة من خلال طلب الحذف وأرسلوا طلب الحذف إلى http: // localhost: 8080/1 ، في هذا الوقت ، تم حذف القيمة من الخريطة ، ولكن عندما نحصل على طلب إلى http: // localhost: 8080/1 ، لا يزال بإمكاننا الحصول على القيمة. هذا لأنه عندما نحذف البيانات ، لم نحذف البيانات الموجودة في ذاكرة التخزين المؤقت. في طريقة GET السابقة ، لا تزال نتيجة تشغيل الطريقة محفوظة. لن يعيد قراءته الربيع ، ولكنه سيقرأ ذاكرة التخزين المؤقت مباشرة. في هذا الوقت ، نضيف التعليقات التوضيحية قبل الطريقة
@override@cacheevict (cachenames = "test") السلسلة العامة حذف (معرف السلسلة) {return ictities.remove (id) ؛}بعد الاختبار ، اتصل أولاً بطلب الحصول على GET ، سيتم عرض قيمة الإرجاع بشكل صحيح كقيمة الحصول على المعرف = 1 ، القيمة 1
ثم استدعاء طلب حذف. احذف البيانات من ذاكرة التخزين المؤقت والخريطة ، واستدعاء طلب الحصول مرة أخرى. في هذا الوقت ، فإن قيمة الحصول على المعرف = 1 ، القيمة فارغة ، مما يعني أنه تم بالفعل حذف القيمة من ذاكرة التخزين المؤقت.
هنا نستخدم شرح CacheeVict. يحدد Cachenames أي بيانات ذاكرة التخزين المؤقت لحذفها. بشكل افتراضي ، سيتم استخدام معلمات الطريقة كمفتاح محذوف.
تحديث ذاكرة التخزين المؤقت
عندما يصل البرنامج إلى هذه النقطة ، إذا قمنا بتشغيل طلب النشر ، فإن هيئة الطلب هي المعرف = 1 & value = new1. في هذا الوقت ، تقوم وحدة التحكم بتركيب القيمة الجديدة 1 مع المفتاح 1 ، وسيقوم الرمز بحفظ القيمة على الخريطة ، ولكن عندما نقوم بتشغيل طلب GET ، سنجد أن قيمة الإرجاع لا تزال في الحالة السابقة. هذا ما يمكننا استخدامه
@override@cacheput (cachenames = "test" ، key = "#id") السلسلة العامة حفظ (معرف السلسلة ، قيمة السلسلة) {logger.info ("حفظ القيمة" + value + "مع المفتاح" + معرف) ؛ إرجاع الكيانات.إعادة تنفيذ الرمز ، نرسل أولاً طلب حذف لحذف البيانات من الخريطة وذاكرة التخزين المؤقت. ثم أرسل طلبًا منشورًا واكتب البيانات إلى الخريطة. أخيرًا ، إذا قمت بإرسال طلب GET ، فستجد أنه يمكن استرداد القيمة بشكل صحيح الآن ، ولا تقوم وحدة التحكم بطباعة سجل البيانات التي تم الحصول عليها من الخريطة.
يتم استخدام التعليق التوضيحي Cacheput هنا. تتمثل وظيفة هذا التعليق في كتابة قيمة إرجاع الطريقة في ذاكرة التخزين المؤقت المحددة بواسطة Cachenames وفقًا للمفتاح المحدد.
وبالمثل ، نحتاج إلى إضافة شرح Cacheput إلى طريقة PUT بحيث يمكن للتعديل أيضًا تحديث البيانات المخزنة مؤقتًا.
في هذه المرحلة ، يتم الانتهاء من تطبيق ذاكرة التخزين المؤقت البسيط بما في ذلك الإضافة والحذف والتعديل والاستعلام.
3. النقاط الرئيسية
بعض الملاحظات
يلاحظ
سيضع Cachable و Cacheput نتيجة التنفيذ للطريقة في ذاكرة التخزين المؤقت وفقًا للمفتاح المحدد. عند تنفيذ cachable ، سيكتشف أولاً ما إذا كانت هناك بيانات في ذاكرة التخزين المؤقت. إذا كان الأمر كذلك ، فسيتم قراءته مباشرة من ذاكرة التخزين المؤقت. إذا لم يكن الأمر كذلك ، قم بتنفيذ الطريقة ووضع قيمة الإرجاع في ذاكرة التخزين المؤقت ، وسيقوم Cacheput بتنفيذ الطريقة أولاً ، ثم اكتب نتيجة التنفيذ إلى ذاكرة التخزين المؤقت. سيتم تنفيذ الطريقة باستخدام Cacheput بالتأكيد
رمز العينة الكامل موجود في https://github.com/ldwqh0/cache-test
لخص
ما سبق هو طريقة استخدام ذاكرة التخزين المؤقت لذاكرة التخزين المؤقت في Boot Spring الذي قدمه لك المحرر. آمل أن يكون ذلك مفيدًا لك. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر إليك في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!