サーチ…


なぜキャッシング?

今日のパフォーマンスは、Webサービス/アプリケーションの開発時に評価する必要がある最も重要な指標の1つです。顧客の関与を維持することは、どの製品にとっても非常に重要です。そのため、パフォーマンスを向上させ、ページの読み込み時間を短縮することが非常に重要です。

データベースと対話するWebサーバーを実行すると、その操作がボトルネックになる可能性があります。 MongoDBはここでも例外ではなく、MongoDBデータベースの規模が拡大するにつれて、事実は減速する可能性があります。この問題は、データベースサーバーがWebサーバーから切り離された場合でも悪化する可能性があります。そのようなシステムでは、データベースとの通信が大きなオーバーヘッドを引き起こす可能性があります。

幸運にも、私たちは物事をスピードアップするためにキャッシュと呼ばれる方法を使用することができます。この例では、このメソッドを紹介し、Spring Cache、Spring Data、およびRedisを使用してアプリケーションのパフォーマンスを向上させるためにこのメソッドを使用する方法を示します。

基本システム

最初のステップとして、MongoDBにデータを格納する基本的なWebサーバーを構築します。このデモンストレーションでは、「高速ライブラリ」と命名します。サーバーには2つの基本操作があります。

POST /book :このエンドポイントは、 POST /bookのタイトル、著者、およびコンテンツを受け取り、データベースにブックエントリを作成します。

GET /book/ {title} :このエンドポイントはタイトルを取得し、そのコンテンツを返します。タイトルは本が一意に特定されていると仮定します(したがって、同じタイトルを持つ2つの書籍はありません)。もちろん、より良い選択肢は、IDを使用することです。しかし、物事を単純にするために、単にタイトルを使用します。

これはシンプルなライブラリシステムですが、後でさらに高度な機能を追加します。

今度は、Spring Tool Suite(Eclipseを使用してビルド)とSpring Starter Projectを使用してプロジェクトを作成してみましょう

ここに画像の説明を入力

私たちはJavaを使ってプロジェクトを構築しています。構築するには、mavenを使用して値を選択し、次をクリックします

ここに画像の説明を入力

WebモジュールからNOSQLとWebからMongoDB、Redisを選択し、終了をクリックします。私たちはSettersとモデル値のゲッタを自動生成するためにLombokを使用していますので、POMにLombok依存関係を追加する必要があります

ここに画像の説明を入力 ここに画像の説明を入力

MongoDbRedisCacheApplication.javaには、Spring Boot Applicationの実行に使用されるmainメソッドが含まれています。

idクラス、ブックタイトル、著者、説明、注釈を含むモデルクラスを@Dataで作成して、jarプロジェクトから自動セッターとゲッターを生成するlombok

package com.example;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;
import lombok.Data;
@Data
public class Book {
    @Id
    private String id;
    @Indexed
    private String title;
    private String author;
    private String description;
}

Spring Dataは私たちのためにすべての基本的なCRUD操作を自動的に作成するので、BookRepository.Javaを作成して、タイトルごとに本を見つけて本を削除します

package com.example;
import org.springframework.data.mongodb.repository.MongoRepository;
public interface BookRepository  extends MongoRepository<Book, String>
{
    Book findByTitle(String title);
    void delete(String title);
}

データをMongoDBに保存し、idTitle(@PathVariable String title)でデータを取得するwebservicesControllerを作成しましょう。

package com.example;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class WebServicesController {
    @Autowired
    BookRepository repository;
    @Autowired
    MongoTemplate mongoTemplate;
    @RequestMapping(value = "/book", method = RequestMethod.POST)
    public Book saveBook(Book book) 
    {
        return repository.save(book);
    }
    @RequestMapping(value = "/book/{title}", method = RequestMethod.GET)
    public Book findBookByTitle(@PathVariable String title) 
    {
        Book insertedBook = repository.findByTitle(title);
        return insertedBook;
    }
}

キャッシュの追加これまで、基本的なライブラリWebサービスを作成しましたが、それはまったく高速ではありません。このセクションでは、結果をキャッシュすることによってfindBookByTitle()メソッドを最適化しようとします。

この目標をどのように達成するかについて、より良い考えを得るために、伝統的な図書館に座っている人々の例に戻ってみましょう。あるタイトルの本を探したいとしましょう。まず第一に、テーブルの周りを見て、彼らがすでにそこに持ってきているかどうかを調べます。彼らが持っているなら、それは素晴らしいです!彼らはちょうどキャッシュヒットを持っていた、それはキャッシュ内のアイテムを見つけることです。彼らがそれを見つけなかった場合、彼らはキャッシュミスを持っていた、彼らはキャッシュ内の項目を見つけなかったことを意味した。不足しているアイテムの場合は、図書館の本を探す必要があります。彼らが見つけたら、テーブルの上に置いたり、キャッシュに挿入したりします。

この例では、findBookByTitle()メソッドと全く同じアルゴリズムに従います。特定のタイトルの書籍を尋ねられたら、キャッシュ内でそれを探します。見つからなければ、主記憶域、つまりMongoDBデータベースで検索します。

Redisの使用

spring-boot-data-redisをクラスパスに追加すると、スプリングブートがその魔法を実行できるようになります。自動設定で必要な操作をすべて作成します

下の行でキャッシュにメソッドをアノテートして、春の起動がその魔法をさせるようにしましょう

@Cacheable (value = "book", key = "#title")

レコードが削除されたときにキャッシュから削除するには、BookRepositoryの下の行に注釈を付け、Springのブートがキャッシュ削除を処理させるようにします。

@CacheEvict (value = "book", key = "#title")

データを更新するには、以下の行をメソッドに追加し、スプリングブートハンドル

@CachePut(value = "book", key = "#title")

あなたはGitHubで完全なプロジェクトコードを見つけることができます



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow