English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

مكتبة التخزين المؤقت لـ SpringBoot

يقدم التخزين المؤقت بشكل شفاف من قبل إطار Spring في تطبيقات Spring. في Spring،التخزين المؤقت الم抽象هو ميكانيزم يسمح باستخدام مختلف طرق التخزين المؤقت بشكل متساوٍ دون تأثير على الكود.

التخزين المؤقت الم抽象

يستخدم نظام التخزين المؤقت الم抽象 ل طريقة Java. الهدف الرئيسي من استخدام التخزين المؤقت الم抽象 هو استنادًا إلى المعلومات الموجودة في التخزين المؤقتتقليلعدد التنفيذات. يتم تطبيق هذا على الطرق المكلفة مثل معالج (CPU) أو التحكم في الوحدات الداخلية (IO)

عند كل استدعاء للطريقة، يتم تطبيق سلوك التخزين المؤقت على هذه الطريقة. يتم التحقق من ما إذا كانت هذه الطريقة قد تم تنفيذها بالفعل للمعاملات المحددة.

إذا كان كذلك، يتم إرجاع النتيجة المخزنة دون تنفيذ الطريقة الفعلية.إذا لم يكن كذلك، يتم تنفيذ هذه الطريقة أولاً وتخزين النتيجة وإرجاعها إلى المستخدم.

ملاحظة: يستخدم هذا الطريقة فقط لضمان أن يرجع نفس النتيجة عند إدخال نفس الدخل. لا يهم كم مرة يتم تنفيذ هذه الطريقة.

يجب على المطورين الانتباه إلى أمرين عند التعامل مع التخزين المؤقت الم抽象.

إعلان التخزين المؤقت: يحدد هذا الطريقة التي يجب على التخزين المؤقت حفظها. تكوين التخزين: للحفظ والقراءة من التخزين الاحتياطي.

مخزن

التخزين هو جزء من الذاكرة المؤقتة (RAM). إنه يقع بين التطبيق وقاعدة البيانات الدائمة. إنه يخزن البيانات التي تم استخدامها مؤخرًا لقلل من عدد مرات التحقق من قاعدة البيانات. بمعنى آخر، التخزين هو لتحديد البيانات للاستخدام في المستقبل.

لماذا استخدام التخزين؟

أهمية استخدام التخزين هي تحسين سرعة الوصول إلى البيانات وتقليل التكلفة. عند طلب الموارد التي يتم طلبها بشكل كبير عدة مرات، فإن التخزين يكون مفيدًا للبرمجيات، حيث يمكنه تقديم استجابات سريعة. يمكن أن يعزز التخزين أداء التطبيق. مقارنة بالوصول إلى البيانات من قاعدة البيانات، الوصول إلى البيانات من الذاكرة دائمًا أسرع. إنه يقلل من التكلفة النقدية والفرصة.

ما يجب تخزينه؟

البيانات التي لا تتغير بشكل متكرر.الاستعلامات التي تُستخدم بشكل متكرر، والنتائج التي تكون ثابتة لفترة من الوقت في كل استدعاء.

أنواع التخزين

هناكأربعةأنواع التخزين كالتالي:

تخزين في الذاكرةخادم التخزين خادم الويب التخزين تخزين CDN

ذاكرة التخزين

يمكن لذاكرة التخزين تحسين أداء التطبيق. هذا هو المكان الذي يتم استخدامه بشكل متكرر. Memcached و Redis مثال على التخزين في الذاكرة. إنه يخزن القيم المفتاحية بين التطبيق والقاعدة البيانات. Redis هوالذاكرة، الموزعةأدوات التخزين المتقدمة التي يمكن استخدامها لـ وظائف النسخ الاحتياطي والاستعادة. يمكننا أيضًا إدارة خوادم集群 الموزعة.

خادم التخزين

خادم التخزين هو آلية لإنشاء صفحات يتم توليدها بشكل ديناميكي عند الحاجة إلى البيانات من قاعدة البيانات. من قاعدة البيانات. إنه يعمل في بيئة تتضمن العملاء، خادم تطبيق الويب وقاعدة البياناتطبقاتفي البيئات. من خلال توزيع سحب العمل، يزيد منالقابلية للتوسعوالأداء. من بين أكثر قواعد البيانات التخزين الشائعة، التخزين الأولي لـ Hibernate.

خادم الويب التخزين

خادم الويب التخزين هو نوع من التخزين يخزن البيانات لإعادة الاستخدامالآلية. على سبيل المثال، نسخة الصفحة التي يقدمها خادم الويب. عند زيارة المستخدم لأول مرة لهذه الصفحة، يتم تخزينها. إذا كان المستخدم يطلب نفس المحتوى مرة أخرى، فإن التخزين يقدم نسخة الصفحة. هذا يمكن من تجنب تحميل خادم الاستبيان بشكل مفرط. يمكن لخادم الويب التخزين تحسين سرعة تسليم الصفحة وتقليل العمل الذي يجب القيام به على خادم الخلفية.

تخزين CDN

CDN ممثلشبكة التسليم المحتوى. إنه مكون يستخدم في تطبيقات الويب الحديثة. من خلالنسخالملفات المستخدمة بشكل متكرر (مثل صفحات HTML، قوائم النصوص، JavaScript، الصور، الفيديوهات، إلخ) توزع في مجموعة من الخوادم الموزعة عالمياًخادم التخزين.

هذا هو السبب في شعبية CDN. CDN يخفف من حمل مصدر التطبيق ويحسن تجربة المستخدم. إنه منالحدود المخزنيةأونقطة وجود (PoP)يقدم نسخة محلية من المحتوى.

المخزن والب缓冲ية

مخزنالب缓冲ية
المخزن القائماستخدام الأقل استخدامًا مؤخرًاالمخزن المؤقت يعتمد علىأولوية الدخول أولاً واستخدامه أولاً
هو حجم التخزين المؤقت للصفحة.هو منطقية التخزين المؤقت في وحدة المعالجة المركزية الأصلية I/O.
يعيشطويلالوقت.يعيشقصيرالوقت.
نحنقراءة من المخزن المؤقتنحنكتابةإلى منطقة التخزين المؤقت.
تخزنمباشربيانات الملف.تخزن ملفاتهاالمعلومات الرئيسية
إنها تزيد قراءة القدرة على الأداء.إنها تزيدكتابةالقدرة على الأداء.

ملصقات التخزين المؤقت لـ Spring Boot

@EnableCaching

هذا ملصق مستوى الصف. يمكننا من خلال استخدامه @EnableCaching ملصق يفعّل التخزين المؤقت في تطبيق Spring Boot.في org.springframework.cache.annotation محدد في الملف. يتوافق مع @Configuration استخدامها مع الصفوف.

إذا لم يُحدد أي نموذج CacheManager، سيتم تمكين التخزين المؤقت تلقائيًا وإعداد CacheManager . سيقوم بفحص المزود المحدد، وإذا لم يجد، سيستخدم المتاحة بشكل متوازي HashMap إنشاء مخزن مؤقت في الذاكرة.

مثال

في المثال التالي، @EnableCaching الملصقات تفعيل نظام التخزين المؤقت.

@SpringBootApplication
@EnableCaching 
public class SpringBootCachingApplication 
{
public static void main(String[] args) 
{
SpringApplication.run(SpringBootCachingApplication.class, args);
}
}

@CacheConfig

هذه ملصق مستوى الصف، يقدم إعدادات عامة للتخزين المؤقت. إنه يخبر Spring حيث سيتم تخزين تخزين التخزين المؤقت للصف. عند استخدام الملصق لتحديد ملصق للصف، يقدم مجموعة إعدادات افتراضية لأي عملية تخزين مؤقت معينة في الصف. باستخدام الملصق، لا نحتاج إلى إعادة الت声明 مرارًا وتكرارًا.

مثال

في المثال التالي،الموظفينهو اسم التخزين المؤقت.

@CacheConfig(cacheNames={"employee"}) 
public class UserService
{
//كود بعض
}

@Caching

عندما نحتاج إلى ملصقين في نفس الوقت @CachePut أو @CacheEvict باستخدام نفس الطريقة. بمعنى آخر، عندما نريد استخدام أكثر من ملصق من نفس النوع، نستخدم

لكن Java لا يسمح بتعريف أكثر من ملصق واحد لنفس النوع المعلنالطريقة. لتجنب هذا المشكلة، نستخدم @Caching الملصقات.

مثال

في المثال التالي، استخدمنا الملصقات @Caching وكلها @CacheEvict التعريف بالفئات.

@Caching(evict = {@CacheEvict("phone_number"), @CacheEvict(value="directory", key="#student.id")})public String getAddress(Student student) 
{
//كود بعض
}

@Cacheable

إنه تعليق مستوى الطريقة. يحدد مخزنًا لقيمة استجابة الطريقة. تقوم Spring ب管理 طلبات وردود الطريقة المحددة في خاصية التعليقة. تحتوي تعليقة @Cacheable على خيارات إضافية. على سبيل المثال، يمكننا استخدام value أو cacheNames الخاصة تقدماسم المخزن

يمكننا أيضًا تحديد خاصية key الميزة، التي تستخدم لتحديد كل عنصر في المخزن. إذا لم يتم تحديد المفتاح، فإن Spring يستخدم آلية افتراضية لإنشاء المفتاح.

مثال

في المثال التالي، تم تخزين cacheStudentInfo،و id في الطريقة studentInfo()القيمة المعدلة هي المفتاح الفريد الذي يستخدم لتحديد المخزن.

@Cacheable(value="cacheStudentInfo", key="#id")public List studentInfo()
{
//كود بعض 
return studentDetails;
}

يمكننا أيضًا تطبيق شرط في خاصية condition في التعليقة. عندما يتم تطبيق شرط في التعليقة، يُدعىالتحكم في المخزن

على سبيل المثال، إذا كان طول اسم المعامل أقل من 20 حرفًا، فإنه يتم تخزين النتيجة التالية للمتغير.

@Cacheable(value="student", condition="#name.length<20")public Student findStudent(String name)
{
//كود بعض
}

@CacheEvict

إنه تعليق مستوى الطريقة. عند الرغبة في حذف البيانات القديمة أو غير المستخدمة من المخزن، يتم استخدامه. يحتاج إلى واحد أو أكثر من المخازن المتأثرة بالعمليات. يمكننا أيضًا تحديد المفتاح أو الشروط. إذا أردنا حذف المخزن بشكل واسع، يقدم تعليق @CacheEvict خاصية تُدعى allEntries بالإضافة إلى ذلك، يزيل جميع العناصر بدلاً من حذف عنصر واحد بناءً على المفتاح.

نقطة هامة حول تعليقة @CacheEvict هي أنها يمكن استخدامها مع طرق void، لأنها تشغل دور المحفز. إنها تجنب إرجاع القيمة. من ناحية أخرى، تحتاج تعليقة @Cacheable إلى قيمة لتتمكن من إضافة/تحديث البيانات في المخزن. يمكننا استخدام تعليقة @CacheEvict بطرق التالي:

حذف جميع العناصر من المخزن:

@CacheEvict(allEntries=true)

ت驱逐 المشاركات من خلال المفتاح:

@CacheEvict(key="#student.stud_name")

مثال

الطريقة التالية من التخزين المؤقت المزود بالأعمدة student_data من清除 جميع البيانات.

@CacheEvict(value="student_data", allEntries=true) //إزالة جميع المدخلات من التخزين المؤقت
public String getNames(Student student) 
{
//كود بعض
}

@CachePut

إنه تعليق على مستوى الطريقة. عندما نريدتحديثاستخدامها لتخزين而不 التدخل في تنفيذ الطريقة. هذا يعني أن هذه الطريقة ستقوم دائمًا بالتنفيذ، ووضع النتيجة في التخزين المؤقت. يدعم @Cacheable properties.

من المهم ملاحظة أن @Cacheable و @CachePut annotations لها سلوكيات مختلفة، لذا فهما مختلفان. هناك فرق صغير بين @Cacheable و @CachePut annotations، وهو @ Cacheable التعليقتخطي تنفيذ الطريقة، بينما @CachePut التعليقتشغيل هذه الطريقة، ثم وضع النتيجة في التخزين المؤقت.

مثال

الطريقة التالية ستحديث التخزين المؤقت نفسه.

@CachePut(cacheNames="employee", key="#id") //تحديث التخزين المؤقت public Employee updateEmp(ID id, EmployeeData data)
{
//كود بعض
}

اعتماد التخزين المؤقت Spring Boot

إذا كنت ترغب في تمكين ميكانيكية التخزين المؤقت في تطبيق Spring Boot، فعليك إضافة اعتماد التخزين المؤقت في ملف pom.xml. يفعل ذلك التخزين المؤقت ويقوم بضبط CacheManager.

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>

مثال على التخزين المؤقت Spring Boot

نقوم بإنشاء تطبيق Spring Boot ونقوم بتنفيذ ميكانيكية التخزين المؤقت فيه.

الخطوة 1: فتح Spring Initializr http://start.spring.io .

الخطوة 2: اختيار إصدار Spring Boot 2.3.0.M1.

الخطوة 2: توفيرالمجموعةالاسم. قمنا بتوفير com.w3codebox.

الخطوة 3: توفيرالمكونات المعرف. قمنا بتوفير spring-boot-cache-example.

الخطوة 5: إضافة الاعتماد Spring Web و استخراج Spring Cache.

الخطوة 6: النقر Generate النقر على زر (إنشاء) . عند النقر على زر "إنشاء"، سيقوم بتعيين التعبئة والتغليف Jar ملف، و قم بتحميله إلى النظام المحلي.

الخطوة 7: استخراج ملف Jar و ألصقه في منطقة العمل STS.

الخطوة 8: إدخال مجلدات المشروع في STS.

ملف->إدخال->مشروع Maven موجود->استعراض->اختيار مجلد spring-boot-cache-example->إكمال

يستغرق بعض الوقت.

دعونا نفتح pom.xml الملف، لنرى ما الذي أضفناه إليه من إعتمادات.

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.0.M1</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>
  <groupId>com.w3codebox</groupId>
  <artifactId>spring-boot-cache-example</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>spring-boot-cache-example</name>
  <description>مشروع تجريبي لـ Spring Boot</description>
  <properties>
    <java.version>1.8</java.version>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
      <exclusions>
        <exclusion>
          <groupId>org.junit.vintage</groupId>
          <artifactId>junit-vintage-engine</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
  <repositories>
    <repository>
      <id>spring-milestones</id>
      <name>Spring Milestones</name>
      <url>https://repo.spring.io/milestone</url>
    </repository>
  </repositories>
  <pluginRepositories>
    <pluginRepository>
      <id>spring-milestones</id>
      <name>Spring Milestones</name>
      <url>https://repo.spring.io/milestone</url>
    </pluginRepository>
  </pluginRepositories>
</project>

الخطوة 9: فتح SpringBootCacheExampleApplication.java الملف، من خلال إضافة تعليق @EnableCaching يُشغل التخزين المؤقت.

SpringBootCacheExampleApplication.java
package com.w3codebox;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
@SpringBootApplication
//تمكين التخزين المؤقت
@EnableCaching
public class SpringBootCacheExampleApplication 
{
public static void main(String[] args) 
{
SpringApplication.run(SpringBootCacheExampleApplication.class, args);
}
}

الخطوة 10: في الاسم مجلد com.w3codebox.model src/main/java أنشئ مجموعة.

الخطوة 11: في المجموعة النموذجية، أنشئ اسمًا يُدعى Customer التعريف الكلاسي وإنشاء ما يلي:

تحديد ثلاثةaccountno, customername, acounttypeوbalanceاستخدام مكون بناءمكون بناء
النقر المزدوج على الملف->المصدر->استخدام الحقول لإنشاء مكون بناء->اختيار الكل->إنشاء
إنشاءGetters and Setters.
النقر المزدوج على الملف->المصدر->إنشاء Getter و Setter->اختيار الكل->إنشاء

Customer.java

package com.w3codebox.model;
public class Customer 
{
    private int accountno;
    private String customername;
    private String accounttype;
    private double balance;
    public Customer(int accountno, String customername, String accounttype, double balance) 
    {
        this.accountno = accountno;
        this.customername = customername;
        this.accounttype = accounttype;
        this.balance = balance;
    }
    public int getAccountno() 
    {
        return accountno;
    }
    public void setAccountno(int accountno) 
    {
        this.accountno = accountno;
    }
    public String getCustomername() 
    {
        return customername;
    }
    public void setCustomername(String customername) 
    {
        this.customername = customername;
    }
    public String getAccounttype() 
    {
        return accounttype;
    }
    public void setAccounttype(String accounttype) 
    {
        this.accounttype = accounttype;
    }
    public double getBalance() 
    {
        return balance;
    }
    public void setBalance(double balance) 
    {
        this.balance = balance;
    }
}

الخطوة 11: في مجلد src/main/java في إعداد حزمة com.w3codebox.controller.

الخطوة 12: في حزمة Controller، أنشئ كائنًا يُسمى CustomerController التحكم في الكائن، ثم اتبع الخطوات التالية:

استخدام @RestController يستخدم لتمييز Controller استخدام @RequestMapping يحدد الخريطة للتحكمالخريطةلقد قمنا بتعريف الخريطة/customerinfo إنشاءمخزنلإستخدام @Cacheable لقد حصلنا على البيانات من خلال استخدام value تم تعريف اسم المخزن كـنحن فيتم إضافة تفاصيل اثنين من العملاء

CustomerController.java

package com.w3codebox.controller;
import java.util.Arrays;
import java.util.List;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.w3codebox.model.Customer;
@RestController
public class CustomerController 
{
    @RequestMapping("/customerinfo")
    //تحديد مخزن للقيمة العائدة للمETHOD
    @Cacheable(value="customerInfo")}}
    public List customerInformation()
    {
        System.out.println("customer information from cache");
        //إضافة تفاصيل العميل إلى القائمة
          List detail=Arrays.asList(new Customer(5126890,"Charlie Puth","Current A/c", 450000.00),
                        new Customer(7620015,"Andrew Flintoff","Saving A/c", 210089.00)
                       );
        return detail;
    }
}

الآن قم بتشغيل هذا التطبيق.

الخطوة 13: فتح SpringBootCacheExampleApplication.java الملف واجعله تطبيقًا Java وقم بتشغيله.

الخطوة 14: فتحPostman، ويشمل عنوان URL http://locahost: 8080/custmerinfo GET الطلب. إنه يعود بتفاصيل العميل كما يلي.