Redis
 Computer >> コンピューター >  >> プログラミング >> Redis

Sevalla での Redis キャッシュによる Next.js API パフォーマンスの向上

Sevalla での Redis キャッシュによる Next.js API パフォーマンスの向上

Next.js について聞くと、最初に静的な Web サイトや React 駆動のフロントエンドを思い浮かべるかもしれません。しかし、それは話の一部にすぎません。 Next.js は、他のバックエンド サービスと同じようにホストおよびスケールできるフル機能のバックエンド API を強化することもできます。

以前の記事では、Next.js API の構築と Sevalla を使用したデプロイについて説明しました。この例では、データを PostgreSQL データベースに保存し、リクエストを直接処理しました。これは問題なく機能しましたが、トラフィックが増加すると、リクエストごとにデータベースにアクセスする API の速度が低下する可能性があります。

ここでキャッシュが登場します。Redis をキャッシュ レイヤーとして追加することで、Next.js API をより高速かつ効率的にすることができます。この記事では、Redis キャッシュを API に追加し、Sevalla でデプロイし、目に見える改善を示す方法について説明します。

前回の記事ではAPIについて詳しく解説しました。したがって、このリポジトリをこのプロジェクトのベースとして使用できます。

目次

  • キャッシュが重要な理由

  • Redis とは何ですか?

  • プロジェクトのセットアップ

  • Redis のプロビジョニング

  • 読み取り時のキャッシュの更新

  • 書き込み時のキャッシュの更新

  • セバラへの展開

  • Redis が Next.js API とうまく連携する理由

  • 結論

キャッシュが重要な理由

API がデータベースにアクセスするたびに、時間とリソースが消費されます。データベースは構造化データの保存とクエリには優れていますが、1 秒あたり数千の読み取りリクエストを処理する必要がある場合、大規模な速度に関しては最適化されていません。

キャッシュは、頻繁にアクセスされるデータをメモリ内に保持することでこの問題を解決します。毎回データベースに問い合わせる代わりに、API はキャッシュが利用可能な場合はキャッシュから直接データを返すことができます。 Redis はパフォーマンスを重視して設計されたメモリ内の Key-Value ストアであるため、これには最適です。

たとえば、リクエストごとにデータベースからユーザーのリストを取得する場合、クエリを実行して結果を返すまでに 200 ミリ秒かかることがあります。 Redis キャッシュを使用すると、最初のリクエストで結果がメモリに保存され、後続のリクエストでは 10 ミリ秒未満で同じデータを返すことができます。これは桁違いの改善です。

Redis とは何ですか?

Redis は、超高速データベースのように動作するインメモリ データ ストアです。ディスクへの書き込みや読み取りの代わりに、データをメモリ内に保持するため、驚くほど高速になります。そのため、長期保存よりも速度が重要なキャッシュとしてよく使用されます。

高スループットのワークロードを非常に低い遅延で処理できるように設計されており、マイクロ秒で応答できます。これにより、API レスポンスのキャッシュ、セッション データの保存、さらにはチャット システムやリーダーボードなどのリアルタイム アプリケーションの強化などのユースケースに最適になります。

従来のデータベースとは異なり、Redis はシンプルさと速度に重点を置いています。データをキーと値のペアとして保存するため、複雑なクエリを作成せずに値をすばやく取得または更新できます。また、リスト、セット、ハッシュなどの高度なデータ型をサポートしているため、単純な Key-Value ストアよりもはるかに柔軟です。

Redis を Next.js で構築したような API と組み合わせると、メイン データベースの負荷を軽減し、クライアントに超高速の応答を提供できます。

プロジェクトのセットアップ

リポジトリのクローンを作成しましょう:

git clone git@github.com:manishmshiva/nextjs-api-pgsql.git next-api

次に、ディレクトリに移動し、npm install を実行してパッケージをインストールしましょう。

cd next-api
npm i

.env ファイルを作成し、Sevalla からのデータベース URL を環境変数に追加します。

cat .env

.env ファイルは次のようになります。

PGSQL_URL=postgres://<username>:<password>-@asia-east1-001.proxy.kinsta.app:30503/<db_name>

次に、アプリケーションを起動し、いくつかの API リクエストを行って、アプリケーションが期待どおりに動作することを確認しましょう。

アプリの起動:

npm run dev

データベースが接続されていることを確認しましょう。 localhost:3000 に移動します ブラウザ上で。次の JSON が返されるはずです。

Sevalla での Redis キャッシュによる Next.js API パフォーマンスの向上

新しいユーザーを作成しましょう。 Postman を使用して DB に新しいエントリを作成するには、次の JSON を使用して POST リクエストを送信します。

{"id":"d9553bb7-2c72-4d92-876b-9c3b40a8c62c","name":"Larry","email":"larry@example.com","age":"25"}

Sevalla での Redis キャッシュによる Next.js API パフォーマンスの向上

localhost:3000/users に移動して、レコードが作成されていることを確認しましょう。 ブラウザで。

Sevalla での Redis キャッシュによる Next.js API パフォーマンスの向上

素晴らしい。次に、Redis を使用してこれらの API をキャッシュしましょう。

Redis のプロビジョニング

Sevalla のダッシュボードに移動し、「データベース」をクリックしましょう。リストから「Redis」を選択し、残りのオプションはデフォルトのままにします。

Sevalla での Redis キャッシュによる Next.js API パフォーマンスの向上

データベースが作成されたら、「外部接続」オプションをオンにして、公開されている URL をコピーします。

Sevalla での Redis キャッシュによる Next.js API パフォーマンスの向上

.env ファイルでは次のようになります。

REDIS_URL=redis://default:<password>@<host>:<port>

ここで、Node.js の Redis クライアントをインストールします。

npm install ioredis

これで、Redis に接続し、ユーザー API のキャッシュ レイヤーとして使用できるようになりました。キャッシュを実装する方法を見てみましょう。

読み取り時のキャッシュの更新

更新された users/route.ts は次のとおりです。 Redis を使用するもの:

import { NextResponse } from "next/server";
import { Client } from "pg";
import Redis from "ioredis";
const redis = new Redis(process.env.REDIS_URL!);
async function readUsers() {
 const client = new Client({
 connectionString: process.env.PGSQL_URL,
 });
 await client.connect();
 try {
 const result = await client.query("SELECT id, name, email, age FROM users");
 return result.rows;
 } finally {
 await client.end();
 }
}
export async function GET() {
 try {
 // Check cache first
 const cached = await redis.get("users");
 if (cached) {
 return NextResponse.json(JSON.parse(cached));
 }
 // Fallback to database if not cached
 const users = await readUsers();
 // Store result in cache with 60s TTL
 await redis.set("users", JSON.stringify(users), "EX", 60);
 return NextResponse.json(users);
 } catch (err) {
 return NextResponse.json({ error: "Failed to fetch users" }, { status: 500 });
 }
}

/users を押すと :

<オル>
  • API は最初に Redis をチェックします。

  • データが存在する場合は、即座にそれを返します。

  • そうでない場合は、PostgreSQL にクエリを実行し、結果を Redis に保存してから返します。

  • これにより、繰り返しのリクエストが非常に高速になります。キャッシュの有効期限を調整できます (EX 60) ) データの鮮度がどの程度必要かによって異なります。

    Redis キャッシュを使用しない場合、/users を取得します 10 回は、10 回のデータベース クエリを意味します。データベースのサイズとネットワークの遅延に応じて、それぞれに約 150 ~ 200 ミリ秒かかる場合があります。

    Redis の場合、最初のリクエストはキャッシュにデータを追加するため、依然として最大 200 ミリ秒かかります。ただし、それ以降のすべてのリクエストはほぼ瞬時に行われ、多くの場合 10 ミリ秒未満です。これは20 倍の改善です。 .

    API が 1 秒あたり数百または数千のリクエストに直面する場合、この高速化が重要になります。キャッシュはレイテンシを短縮するだけでなく、データベースの負荷も軽減します。

    書き込み時のキャッシュの更新

    現時点では、GET リクエストのみがキャッシュを使用します。しかし、新しいユーザーを追加したらどうなるでしょうか?キャッシュは依然として古いデータを返します。

    解決策は、書き込みが発生するたびにキャッシュを更新またはクリアすることです。 POST を更新しましょう ハンドラ:

    export async function POST(req: Request) {
     try {
     const body = await req.json();
     const client = new Client({
     connectionString: process.env.PGSQL_URL,
     });
     await client.connect();
     const query = `
     INSERT INTO users (id, name, email, age)
     VALUES ($1, $2, $3, $4)
     RETURNING *;
     `;
     const result = await client.query(query, [
     body.id,
     body.name,
     body.email,
     body.age,
     ]);
     await client.end();
     // Invalidate cache so next GET fetches fresh data
     await redis.del("users");
     return NextResponse.json(result.rows[0]);
     } catch (err) {
     return NextResponse.json({ error: "Failed to add user" }, { status: 500 });
     }
    }
    

    新しいユーザーが作成されるたびに、users のキャッシュが作成されるようになりました。 クリアされます。次の GET リクエストはデータベースからフェッチし、キャッシュを更新して、キャッシュされたデータの提供を継続します。

    セバラへの展開

    コードを GitHub にプッシュするか、私のリポジトリをフォークします。次に、Sevalla に移動して、新しいアプリを作成しましょう。

    Sevalla での Redis キャッシュによる Next.js API パフォーマンスの向上

    ドロップダウンからリポジトリを選択し、「コミット時に自動デプロイ」にチェックを入れます。これにより、コードをプッシュするたびにデプロイが自動的に行われるようになります。リソースセクションの下にある「趣味」を選択します。

    Sevalla での Redis キャッシュによる Next.js API パフォーマンスの向上

    「作成してデプロイ」ではなく「作成」をクリックします。 PostgreSQL URL と Redis URL を環境変数として追加していないため、アプリをデプロイしようとするとクラッシュします。

    「環境変数」セクションに移動し、キー「PGSQL_URL」と値フィールドに URL を追加します。 「REDIS_URL」キーに対しても同じことを行い、Redis URL を追加します。

    Sevalla での Redis キャッシュによる Next.js API パフォーマンスの向上

    次に、「概要」セクションに戻り、「今すぐデプロイ」をクリックします。

    Sevalla での Redis キャッシュによる Next.js API パフォーマンスの向上

    デプロイが完了したら、「Visit app」をクリックして API のライブ URL を取得します。 Postman で localhost:3000 を新しい URL に置き換えて、API をテストできます。

    Redis が Next.js API とうまく連携する理由

    Redis は軽量で非常に高速で、API 応答のキャッシュに最適です。 Next.js のコンテキストでは、次の理由から自然に適合します。

    • API ルートはサーバー側で実行され、Redis を直接クエリできます。

    • キャッシュ ロジックはデータベース呼び出しの周りに簡単に追加できます。

    • Redis はキャッシュ以外にも使用できます。レート制限、セッション ストレージ、パブリッシュ/サブスクライブなども一般的なパターンです。

    Sevalla 上で Next.js、PostgreSQL、Redis を組み合わせることで、高速でスケーラブルで、デプロイが簡単なスタックが得られます。

    結論

    キャッシュは単なる最適化ではなく、現実世界の API にとって必要不可欠なものです。 Next.js は、簡単にデプロイできる堅牢なバックエンド API を構築するのに役立ちます。 Redis をミックスに追加することで、これらの API は苦労せずにスケールを処理できるようになります。

    Sevalla は、マネージド PostgreSQL、Redis、アプリ ホスティングを 1 か所で提供することで、すべてを結び付けます。いくつかの環境変数と GitHub リポジトリを使用すると、数分でローカル開発環境から本番環境に対応したキャッシュされた API に移行できます。

    この記事をお楽しみいただければ幸いです。無料の AI ニュースレターに登録してください チューリングトーク.ai AI に関する実践的なチュートリアルについてはこちらをご覧ください。 でも私を見つけることができます リンクトイン .

    無料でコーディングを学びましょう。 freeCodeCamp のオープンソース カリキュラムは、40,000 人以上の人々が開発者としての職に就くのに役立ちました。始めましょう


    1. Redis STRLEN –Redisデータストアで文字列値の長さを取得する方法

      このチュートリアルでは、キーに格納されている文字列値の長さを取得する方法について学習します。このために、Redis STRLENを使用します コマンド。 STRLENコマンド このコマンドは、キーに格納されている文字列値の長さ(文字数)を返します。キーがredisデータストアに存在しない場合、空の文字列として解釈され、0が返されます。 RedisSTRLENコマンドの構文は次のとおりです:- 構文:- redis host:post> STRLEN <key name> 出力:- (integer) value, representing the number

    2. ハッシュに含まれるフィールドの値を取得する方法– Redis HGET | HMGET

      このチュートリアルでは、キーに格納されているハッシュ値に含まれるフィールドに関連付けられた値を取得する方法について学習します。このために、RedisHGETおよびHMGETコマンドを使用します。 HGETコマンド このコマンドは、指定されたキーに格納されているハッシュ値内に含まれる指定されたフィールドに関連付けられた値を取得するために使用されます。キーが存在しない場合、またはキーが存在するがハッシュ値に指定されたフィールドが含まれていない場合はnilが返され、キーは存在するがキーに格納されている値がハッシュデータ型でない場合はエラーが返されます。 RedisHGETコマンドの構文は次のとお