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

Кэширование в SpringBoot

Фреймворк Spring предоставляет кэширование в приложениях Spring прозрачно. В Spring,Абстракция кэшированияЭто механизм, который позволяет однородно использовать различные методы кэширования без влияния на код.

Абстракция кэширования

Механизм абстракции кэширования подходит для Методы Java. Основная цель использования абстракции кэширования - это использование информации, существующей в кэшеСнижениеКоличество выполнения. Это подходит для дорогих методов, таких как Процессор. или Привязка к вводу/выводу.

При каждом вызове метода абстракция кэширования applies кэширование к этому методу. Она проверяет, был ли метод уже выполнен для данных параметров.

Если да, то не выполняется реальный метод, а возвращается результат из кэша.Если нет, то сначала выполняется этот метод, результат кэшируется и возвращается пользователю.

Внимание: Этот метод подходит только для методов, которые гарантируют, что для данного входа будет возвращен один и тот же результат. Количество вызовов метода не имеет значения.

Разработчикам при работе с абстракцией кэширования следует учитывать два момента.

Декларация кэшированияЭто обозначает метод, который нужно кэшировать. Конфигурация кэширования: резервное копирование и чтение данных.

kesh

Кэширование является частью временной памяти (RAM). Оно находится между приложением и постоянной базой данных. Оно хранит недавно использованные данные, чтобы минимизировать количество обращений к базе данных. Иначе говоря, кэширование предназначено для хранения данных для будущих ссылок.

Почему использовать кэширование?

Основная причина использования кэширования - это более быстрый и дешевый доступ к данным. При многократных запросах высоко востребованных ресурсов кэширование ресурсов обычно полезно для разработчиков, так как оно может быстро дать ответ. Использование кэширования в приложениях может улучшить производительность приложений. Доступ к данным из памяти всегда быстрее, чем из базы данных. Это снижает монетарные и возможность расходы.

Какие данные следует кэшировать?

не часто изменяемые данные.часто используемые чтения запросов, результаты которых не изменяются по крайней мере в течение определенного времени при каждом вызове.

типы кэширования

естьчетыретипы кэширования такие:

кэширование в памятибаза данных кэширования Web-серверное кэширование кэширование CDN

кэширование в памяти

кэширование в памяти может улучшить производительность приложений. Это часто используемая область. Memcached и Redis пример кэширования в памяти. Оно хранит ключи и значения между приложением и базой данных. Redis являетсявнутренней памяти, распределеннойпродвинутые инструменты кэширования, которые можно использовать для резервного копирования и восстановления. Мы также можем управлять кэшированием в распределенных кластерах.

база данных кэширования

база данных кэширования - это механизм, который генерирует веб-страницы по мере необходимости (динамически) из данных. Из базы данных. Оно работает с клиентами, веб-серверами приложений и базами данных, участвующими вмногослойныев среде. Распределение рабочей нагрузки на запросы улучшаетexpandabilityипроизводительность. Самыми популярными кэширующими базами данных являются一级 кэширование Hibernate.

Web-серверное кэширование

Web-серверное кэширование - это хранение данных дляповторное использованиемеханизмы. Например, копии веб-страниц, предоставляемые веб-сервером. При первом посещении страницы пользователем она кэшируется. Если пользователь снова запрашивает то же содержимое, кэширование предоставляет копию страницы. Это позволяет избежать перегрузки сервера. Кэширование веб-сервера ускоряет передачу страниц и уменьшает работу, которую необходимо выполнить на сервере.

кэширование CDN

CDN представляетсеть доставки контента. Это компонент, используемый в современных веб-приложениях. ЧерезкопийОбычные файлы (например, HTML-страницы, таблицы стилей), которые можно улучшить передачу содержимого. JavaScript, изображения, видео и т.д.), распределены в группе глобально распределенныхкэширующих серверов.

Это одна из причин, почему CDN становится все более популярным. CDN уменьшает нагрузку на源头 приложений и улучшает пользовательский опыт. Оно загружается скэширующий край(ближе к конечному пользователю кэширующий сервер) илиточка присутствия (PoP)предоставляет локальную копию содержимого.

кэширование и буфер

keshбуфер
Кэширование основанонаиболееeldom используемом.буфер основан на先进先出
это размер страницы кэша.это исходный буфер I/O в памяти.
она существуетдолгопериод.она существуеткороткийпериод.
Мычитаем из кэша.Мызаписьв буфер.
она хранитреальныеданные файла.она хранит файлыметаданные.
она улучшает read продуктивность.она улучшаетзаписьпродуктивность.

аннотации кэширования 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 в аннотации. Когда мы применяем условие в аннотации, это называетсяУсловный кэш.

Например, если длина параметра name меньше 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.

Следует отметить, что из-за различного поведения аннотаций @Cacheable и @CachePut они различаются. Мелкая разница между аннотациями @Cacheable и @CachePut заключается в том, что 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: предоставитьобъект ID. Мы предоставляем 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.Использовать Constructor для генерацииКонструктор .
нажмите правой кнопкой мыши на файл -> исходный код -> использовать поле для генерации конструктора -> выделите все -> сгенерировать
Сгенерировать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: v papke src/main/java v direktorii paketa com.w3codebox.controller.

Шаг 12: v pakete Controller, sozdaiem klass s nazvaniem CustomerController operaciyu, izvestnoe

pol'zovanie annotatsiey @RestController oznachaet klass kotoriy yavlyaetsya Controller . pol'zovanie annotatsiey @RequestMapping definirovaet mapping dlya kontrolleramapping.my definirovali mapping/customerinfo .sozdaniekeshpol'zovatsya annotatsiey @Cacheable. my poluchili dannye, ispol'zuem annotation value svoystvo definirovalo nazvanie kesh.my vv kachestve polozheniya dvukh podrobnostey klienta

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")
    //definirovaet kesh dlya vozvrashchayushchey znacheniya metoda
    @Cacheable(value="customerInfo")
    public List customerInformation()
    {
        System.out.println("информация о клиенте из кэша");
        //добавление информации о клиенте в список
          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 Запрос. Он возвращает детальную информацию о клиенте, как показано ниже.