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

Upstash Redis キャッシュで Prisma ORM パフォーマンスを向上

前回のブログ投稿では、キャッシュの利点、一般的なキャッシュ手法、さまざまなコード サンプルで Upstash Redis を使用して SQL データをキャッシュする方法について説明しました。

Upstash Redis を使用して SQL クエリをキャッシュすることの詳細と利点を調べましたが、ここでさらに進んでいくつかのアクションを見てみましょう。この目的のために、一般的に使用される ORM である Prisma から始めて、Upstash Redis によるキャッシュがデータベース クエリに対してどのように機能するかを確認することができます。

このブログ投稿では、Upstash Redis を Prisma と統合して、キャッシュ アサイド技術を使用してクエリをキャッシュし、データベースの負荷を軽減し、アプリケーションのパフォーマンスを向上させる方法を検討します。

プリズマとは何ですか?

Prisma を設定する前に、いくつかの用語と Prisma の機能を確認してみましょう。

まず、Prisma は、アプリケーションとデータベース間のインターフェイスを提供するオブジェクト リレーショナル マッパー (ORM) ツールです。

ORM は、開発者が生の SQL クエリを記述する代わりに、高レベルのオブジェクト指向コードを使用してデータベースと対話できるようにするプログラミング手法です。簡単に言えば、リレーショナル データベースとオブジェクト指向プログラミング言語を接続するブリッジを提供します。

ORM は、データベース テーブルをプログラム言語のクラスまたはモデルにマップします。テーブル内の各行は、クラスのインスタンスに対応します。これは基本的に、オブジェクト指向言語で書かれたアプリケーションで行うデータ モデリングです。 ORM はこれを作成し、SQL クエリを作成する代わりにメソッドを提供します。プログラマは、オブジェクトまたはクラスのメソッドを呼び出して CRUD 操作を実行できます。

たとえば、users をクエリすると、 生の SQL のテーブルは次のようになります:

SELECT * FROM users WHERE id = 1;

ORM を使用すると、同じクエリは次のようになります。

const user = await user.findUnique({ where: { id: 1 } });

したがって、ORM はデータベースと対話し、実行されたプログラムに取り込まれたデータをコード内で使用できるようにするために必要な作業を実行し、開発者に大きな利便性を提供します。

Prisma は、ソフトウェア アプリケーションで最も一般的で使いやすい ORM の 1 つです。

Prisma が ORM の選択肢として適切である理由を示すいくつかの指標を次に示します。

  • タイプセーフなクエリ :Prisma はデータベース スキーマに基づいて TypeScript クライアントを自動生成し、実行時ではなく開発中にエラーを確実に捕捉します。

  • 簡素化されたデータ モデリング :schema.prisma を使用 ファイルでは、宣言構文を使用してデータベース構造を定義できます。Prisma は、この構文を必要な SQL または API 呼び出しに変換します。このファイルにモデルを記述して Prisma 経由でテーブルを生成する方法の例を見ていきます。

  • マルチデータベースのサポート :Prisma は、PostgreSQL、MySQL、SQLite、MongoDB などの一般的なデータベースで動作します。データベースについては、Prisma ドキュメントで確認できます。

  • 移行管理 :Prisma は、データベース スキーマとコードベースの同期を保つための使いやすい移行システムを提供します。

Prisma は、データベース管理をさらに容易にする CLI および Studio (ウェブベースのデータベース GUI) も提供します。

プリズマのセットアップ

次に、それがどのようにインストールされ、アプリケーションでどのように機能するかを見てみましょう。

このブログ投稿の主な焦点は Prisma クエリのキャッシュであるため、ローカルで非常に単純な SQLite データベースを使用していくつかの Prisma 操作を実行し、Prisma の動作を実証することができます。

sqlite3 をインストールする必要があります。 まず、アプリが SQLite データベースに接続して対話できることを確認します。前述したように、SQLite セットアップは、Prisma がデータベースでどのように動作するかをデモンストレーションするためだけにあります。他に希望がある場合は、Prisma ドキュメントでデータベース タイプと Prisma の統合を見つけることができます。

ターミナルのプロジェクト ディレクトリに移動し、ここに SQLite をインストールします。

npm install sqlite3

ここで、Prisma ORM を利用できるように Prisma CLI をインストールする必要があります。

npm install prisma --save-dev

次にPrismaを初期化します。この初期化により、prisma が作成されます。 schema.prisma を持つディレクトリ ファイル。 schema.prisma ファイルはデータベース構造 (モデル、フィールドなど) を定義する場所です。

npx prisma init

次に、Prisma スキーマを定義します。 prisma/schema.prisma を開いてみましょう エディタでファイルを作成します。

このファイルは 3 つのブロックで構成されます。最初のブロックは、Node.js アプリケーションで使用されるクライアントを生成するように Prisma を構成するジェネレーターです。 2 番目はデータソース ブロックです。このブロックでは、Prisma を接続するためにデータベースに関する必要な情報を提供します。最後のブロックには、データベース内のテーブルとそのフィールドを定義できるデータベース モデル (データ型や制約など) が含まれています。

以下に例を見てみましょう。

generator client {
 provider = "prisma-client-js"
}
datasource db {
 provider = "sqlite"
 url = env("DATABASE_URL")
}
model user {
 id Int @id @default(autoincrement())
 name String
 email String @unique
 age Int?
}

ご覧のとおり、データベースのタイプを示すことでデータベースの URL を指定します。ちなみに、プロジェクトに DATABASE_URL 環境変数を設定することを忘れないでください。他のタイプのデータベースを接続する場合は、Prisma のドキュメントを確認してください。このサンプルケースでは、file:./dev.db に設定するだけです。 .

それに加えて、user を定義します。 テーブルの列をそのタイプと制約で定義します。必要に応じて、さまざまなデータベース タイプを使用して、より洗練されたモデルを作成できます。ただし、このデモでは、この基本セットアップを使用できます。

必要なテーブルを作成してスキーマをデータベースと同期するには、移行コマンドを実行する必要があります。 –name flag はこの移行に名前を付け、スキーマの変更を追跡しやすくします。

npx prisma migrate dev --name init

Prisma ORM を備えた SQLite データベースの準備が整いました。

Redis のセットアップ

これは最も早く完了できるセクションです。私たちはこのステップを何千回も繰り返してきました。ただし、このブログ投稿を最初から完全なガイドにするために、ここでも手順を簡単に説明します。誰でもこれらの手順のいずれかを行ったことがある場合は、必要な手順に進むだけで済みます。

Upstash コンソールを使用して Redis データベースを作成します。

[データベースの作成] ボタンをクリックして Redis データベースを作成し、ポップアップされたモーダルの手順を完了しましょう。

データベースのリージョンを選択するときは、Upstash Redis データベースのリードレプリカを選択することを忘れないでください。グローバル Redis の利点については、私の前回のブログ投稿で確認できます。

Upstash Redis キャッシュで Prisma ORM パフォーマンスを向上

Redis データベースの準備ができました。 Upstash Redis セットアップで残っている唯一の作業は、アプリケーションでの Redis クライアントの初期化です。このためには、最初に Upstash Redis SDK をインストールする必要があります。

npm install @upstash/redis

次に、Upstash コンソールから Redis エンドポイントとパスワードを取得する必要があります。次に、Upstash Redis に接続するコード内で Redis クライアントを構成します。

Upstash Redis を使用した Prisma クエリのキャッシュ

このブログの前半で述べたように、キャッシュアサイド戦略を使用します。そのためには、まず、指定されたクエリによって要求されたデータが存在するかどうかをキャッシュで確認します。存在する場合は、Upstash Redis から取得して返します。それ以外の場合は、上のセクションで生成された Prisma クライアントを使用して SQL データベースにクエリを実行し、SQL データベースから取得したデータをキャッシュに格納します。

import { Redis } from '@upstash/redis';
import { PrismaClient } from "@prisma/client";
 
const prisma = new PrismaClient();
 
const redis = new Redis({
 url: '<UPSTASH-REDIS-ENDPOINT>',
 token: '<UPSTASH-REDIS-TOKEN>',
})
 
async function getUser(userId: string) {
 const cacheKey = `user:${userId}`;
 
 // Check cache
 const cachedUser = await redis.get(cacheKey);
 if (cachedUser) {
 console.log("Cache hit");
 return JSON.parse(cachedUser);
 }
 
 // Query database
 console.log("Cache miss");
 const user = await prisma.user.findUnique({
 where: { id: userId },
 });
 // Store in cache
 if (user) {
 await redis.set(cacheKey, JSON.stringify(user), { ex: 3600 }); // Cache for 1 hour
 }
 return user;
}

この例でわかるように、prisma.<tableName>.findUnique() メソッドにクエリの条件を定義するパラメータを指定すると、開発者はコード形式で SQL データベースにクエリを実行できるようになります。

ほんの一例として、findMany() を使用して user テーブル内のすべてのユーザーを取得できます。 以下のように機能します:

const user = await prisma.user.findMany();

結論

このブログ投稿では、Prisma クエリをキャッシュするために Prisma を Upstash Redis と統合する方法について説明しました。

Prisma と Upstash Redis はどちらも非常に簡単で使いやすいです。開発者に優しいアーキテクチャに加えて、非常に影響力があります。 Prisma は、コーディング形式でのデータベース管理を可能にするマッピング機能のおかげで、開発時間を大幅に節約できます。 Upstash Redis を使用して Prisma クエリをキャッシュすると、データ取得のレイテンシが大幅に短縮され、アプリケーションのメイン SQL データベースの負荷が軽減されます。

このブログが皆さんのお役に立てれば幸いです!


  1. Redis SETRANGE –Redisの文字列値の一部を更新する方法

    このチュートリアルでは、redisデータストアの指定されたキーに格納されている文字列値の一部を更新する方法について学習します。このために、Redisの SETRANGEを使用します コマンド。 SETRANGEコマンド このコマンドは、文字列値の更新部分の開始インデックスを決定する開始(両端を含む)オフセットを取ります。開始オフセットが文字列値の長さよりも大きい場合、開始オフセットを適合させるために、文字列値にゼロバイトが埋め込まれます。インデックスはゼロベースであるため、0は最初の要素を意味し、1は2番目の要素を意味します。 キーがredisデータストアに存在しない場合、操作を実行する

  2. GoogleCloudPlatformでのRedisEnterpriseのフルマネージドサービスがデリーで利用可能になりました

    Google CloudPlatformのフルマネージドRedisEnterpriseサービスが、インドのムンバイ(Asia-South1)地域に加えて、デリー地域(Asia-South2)でも利用できるようになったことをお知らせします。現在、顧客がGCPMarketplaceを介してRedisEnterpriseをデプロイし、リアルタイムのデータユースケースをサポートできる20を超えるGoogleCloudPlatformリージョンがあります。それらには、エンタープライズキャッシュ、セッション管理、ゲームリーダーボード、不正検出、高速トランザクション、非同期通信などが含まれます。お客様の多く