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

SpringBoot キャッシュ

Spring フレームワークは、Spring アプリケーション内でキャッシュを透明に提供します。Springでは、キャッシュ抽象は、コードに影響を与えずにさまざまなキャッシュメソッドを一貫して使用できるメカニズムです。

キャッシュ抽象

キャッシュ抽象メカニズムは、 Java メソッドに適用されます。キャッシュ抽象を使用する主な目的は、キャッシュに存在する情報に基づいて削減実行回数。これは高価なメソッド、例えば CPU または IOバインド

メソッドが既に特定のパラメータに対して実行されているかどうかを確認するために、抽象は常にキャッシュ行動をメソッドに適用します。

もしはいの場合、実際のメソッドを実行せずにキャッシュの結果を返します。もし否の場合、まずそのメソッドを実行し、結果をキャッシュしてユーザーに返します。

注意: このメソッドは、特定の入力に対して常に同じ結果を返すメソッドにのみ適用されます。メソッドの実行回数は重要ではありません。

開発者がキャッシュ抽象を扱う際には、二つのことに注意します。

キャッシュ宣言: キャッシュする必要があるメソッドを識別します。 キャッシュ設定: データの保存と読み取りに使用されるバックアップキャッシュです。

キャッシュ

キャッシュは一時的なメモリ(RAM)の一部です。アプリケーションと永続データベースの間に位置しており、最近使用されたデータを保存することで、データベースヒット回数を最小限に抑えます。言い換えれば、キャッシュは将来の参照のためにデータを保存するためです。

なぜキャッシュを使用するべきですか?

キャッシュを使用する主な理由は、データアクセスをより速く、より安価にすることです。高度にリクエストされるリソースを複数回リクエストする場合、開発者にとってキャッシュリソースは有益であり、迅速な応答を提供できます。アプリケーション内でキャッシュを使用することで、データベースからのデータアクセスよりも速く、コストを削減します。

どのデータをキャッシュすべきですか?

頻繁に変更されないデータです。読み取りクエリがよく使用され、そのクエリ結果は各呼び出しで少なくとも一定期間変更されません。

キャッシュタイプ

あります四種類以下のキャッシュタイプがあります:

メモリ内のキャッシュデータベースキャッシュ Webサーバーキャッシュ CDNキャッシュ

メモリキャッシュ

メモリキャッシュはアプリケーションのパフォーマンスを向上させます。これはよく使用されるエリアです。 Memcached Redis メモリ内のキャッシュの例です。アプリケーションとデータベース間でキーワードと値を保存します。Redisは、メモリ内、分散型高度のキャッシュツールで、バックアップとリカバリ機能を使用できます。また、分散クラスタ内のキャッシュを管理することもできます。

データベースキャッシュ

データベースキャッシュは、データを必要に応じて(動的に)取得してウェブページを生成するメカニズムです。データベースから。それはクライアント、Webアプリケーションサーバー、データベースに関連する環境で使用されます。クエリワークロードを分配することで、拡張性パフォーマンスです。最も人気のあるデータベースキャッシュはHibernateのレベル1キャッシュです。

Webサーバーキャッシュ

Webサーバーキャッシュはデータを再利用のメカニズムです。例えば、Webサーバーが提供するウェブページのコピー。ユーザーが初めてそのページにアクセスした場合、それをキャッシュします。ユーザーが次に同じコンテンツをリクエストすると、キャッシュがページのコピーを提供します。これにより、サーバー側の負荷を軽減できます。Webサーバーキャッシュはページの配信速度を向上させ、バックエンドサーバーが行う作業を減少させます。

CDNキャッシュ

CDN を代表するコンテンツデリバリーネットワーク。それはモダンなWebアプリケーションで使用されるコンポーネントです。コピー一般的なファイル(例えばHTMLページ、スタイルシート)を配布し、コンテンツの配信を改善できます。JavaScript、画像、ビデオなど)キャッシュサーバーから

これはCDNが人気を集める理由です。CDNはアプリケーションソースの負担を軽減し、ユーザーの体験を改善します。それは近くのキャッシュエッジ(最も最終ユーザーに近いキャッシュサーバー)または存在点(PoP)提供されたコンテンツのローカルコピーを提供します。

キャッシュとバッファリングエリア

キャッシュバッファリングエリアに基づいています。
キャッシュは最も最近に使用されていないバッファリングエリアは先入先出
それはページキャッシュのサイズです。それはメモリ内のオリジナルブロックIです/Oバッファリングエリアです。
それは生存しました長い期間それは生存しました短い期間
私たちはキャッシュから私たちはそれが向上させます。読み取ります。
バッファリングエリアにそれが実際にファイルデータをそれがファイルを
読み取り メタデータ 書き込み読み取りそれが向上させます。書き込み

パフォーマンスを向上させます。

@EnableCaching

これはクラスレベルのアノテーションです。Spring Bootキャッシュアノテーションを使用して @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
{
//some code
}

@Caching

当たり前ですが、 @CachePut または @CacheEvict を同じメソッドで使用する場合、同じ方法を使用します。つまり、同じ種類の複数の注解を使用する場合に同じ方法を使用します。

しかし Javaは、同じ宣言に対して同種の複数の注解を許可しませんメソッド @Caching 注解を使用しました。

以下の例では、注解 @Caching すべての @CacheEvict 注解グループ

@Caching(evict = {@CacheEvict("phone_number"), @CacheEvict(value="directory", key="#student.id") })public String getAddress(Student student) 
{
//some code
}

@Cacheable

それはメソッドレベルの注解であり、メソッドの返却値にキャッシュを定義します。Springフレームワークは、注解属性で指定されたキャッシュに対するリクエストと応答を管理します。@Cacheable注解には、さらに多くのオプションがあります。例えば、 value または cacheNames 属性を提供キャッシュ名

また、注解の key 属性は、キャッシュ内の各エントリをユニークに識別するために使用されます。キーが指定されていない場合、Springはデフォルトのメカニズムを使用してキーを作成します。

以下の例では、< cacheStudentInfo、 id 内のメソッド studentInfo()の返却値はユニークなキーであり、キャッシュを識別するために使用されます。

@Cacheable(value="cacheStudentInfo", key="#id")public List studentInfo()
{
//some code 
return studentDetails;
}

また、注解でcondition属性を使用して条件を適用することもできます。注解に条件を適用する場合、それを条件キャッシュ

たとえば、パラメータ名の長さが短い場合には、20の場合、以下のメソッドをキャッシュします。

@Cacheable(value="student", condition="#name.length<20)public Student findStudent(String name)
{
//some code
}

@CacheEvict

これはメソッドレベルのアノテーションです。私たちがキャッシュから古いまたは使用されていないデータを削除したい場合に使用します。影響を受けるキャッシュを1つ以上指定する必要があります。さらに、キーや条件を指定することもできます。広範囲のキャッシュ排除を行いたい場合、@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) 
{
//some code
}

@CachePut

これはメソッドレベルのアノテーションです。私たちが以下のことを行いたい場合に、使用します。更新キャッシュに保存し、メソッドの実行を妨げない場合に使用します。これは、该方法が常に実行され、結果がキャッシュに格納されることを意味します。@Cacheableアノテーションの属性をサポートします。

注意すべき点是、@Cacheableと@CachePutアノテーションの動作が異なるため、異なるものです。@Cacheableと@CachePutアノテーションには微妙な違いがあり、それは@ Cacheable コメントメソッドの実行をスキップしますそして @CachePut コメントこのメソッドを実行しますその後、結果をキャッシュに格納します。

以下のメソッドはキャッシュ自体を更新します。

@CachePut(cacheNames="employee", key="#id")  //キャッシュを更新するためのpublic String updateEmp(ID id, EmployeeData data)メソッド
{
//some code
}

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
//cachingを有効に
@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, acounttypebalance使用Constructor生成构造器
右键单击文件->源->使用字段生成构造器->全选->生成
生成Getters and Setters。
右键单击文件->源->生成Getter和设置器->全选->生成

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")
    //method's return value用のキャッシュを定義します。
    @Cacheable(value="customerInfo")
    public List customerInformation()
    {
        System.out.println("customer information from cache");
        //adding customer detail in the List
          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 リクエスト。以下のように顧客の詳細情報を返します。