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

PHP 向け Redis をマスターする:インメモリ キャッシュの実践ガイド

PHP 向け Redis をマスターする:インメモリ キャッシュの実践ガイド

Redis は、主にメモリにデータを保存するデータ ストアです。従来のデータベースよりも高速であり、非常に人気が高まっています。

このチュートリアルでは、Redis の仕組み、いつ使用するか、デバイスにインストールする方法、PHP Web アプリケーションでキャッシュ システムとして Redis を使用する方法の基本を学びます。

Redis とは何ですか?

Redis はデータベースと似たデータ ストアですが、主にデータをメモリ内に保存します。これにより、データがディスクに保存される従来のデータベースよりもはるかに高速になります。この速度のため、Redis はキャッシュ ツールとしてよく使用されます。

Redis はキーと値のペア システムを使用してデータを保存するため、任意のデータ型でデータを保存できます。これは、ドキュメントや行を使用する従来のデータベースとは異なります。

Redis データベースは、データベース内のすべてがキーと値のペアである大きな JSON オブジェクトとして考えることができます。これは、構造化データを保存するのに最適な場所ではない可能性があることを意味します。

Redis にはデータをディスクに書き込んで永続化する機能があるため、データベースとして使用することもできます。定期的に、またはコマンドを発行するたびにデータを保持するように Redis を構成できます。 Redis がデータを永続化するように構成されていない場合、データは非常に不安定になるため、システム クラッシュが発生するとデータが失われる可能性があります。

Redis は実稼働レベルのアプリケーションで人気があり、Twitter、Github、SnapChat、StackOverFlow などの大企業で使用されています。

  • ワンタイム パスワード (OTP) の場合:これらは通常、1 回のみ使用するために生成され、有効期限が短いです。データの有効期限を設定できる Redis の機能により、一定期間後に削除されることを心配することなく、OTP を安全に保存できます。
  • 頻繁にアクセスされるリソースの場合:あまり頻繁に変更されないものの、頻繁にアクセスされるデータの場合、Redis を使用すると、データベースのクエリや外部サービスの呼び出しに費やされていた時間を節約できます。
  • 負荷の高いクエリの場合:時間がかかり、あまり頻繁に変更されないデータベース クエリの場合は、Redis を使用して結果を好きなだけ長く保存することで時間を短縮します。

Redis をインストールする方法

Redis はどのオペレーティング システムにもインストールできます。ここでは、macOS、Linux 用 Windows サブシステム、および Linux の手順を説明します。

macOS

macOS に Redis をインストールするには、次のコマンドを実行します。

brew install redis

次に、次のコマンドを実行して Redis を起動します。

redis-server

Linux および Linux 用 Windows サブシステム

Redis はまだ Windows オペレーティング システムを正確にはサポートしていないため、Windows に WSL (Windows Subsystem for Linux) をインストールして Linux 環境を構築できます。

Linux に Redis をインストールするには、次のコマンドを実行します。

curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
sudo apt-get update
sudo apt-get install redis

次に、次のコマンドを実行して Redis を起動します。

sudo service redis-server start

Redis がインストールされたので、redis-cli ping を実行してテストできます。 。これにより、「PONG」 が出力されます。 。このように:

PHP 向け Redis をマスターする:インメモリ キャッシュの実践ガイド Redis インストールのテスト

Redis の基本

Redis を REPL またはスタンドアロン アプリケーションとして使用するには、redis-cli を実行します。 。 REPL 環境が開きます。

データの設定方法

SET を使用します Redis でキーと値のペアを設定するためのキーワード。 username を設定するには 値 Zubs へのキー 、これを実行します:

SET username Zubs

PHP 向け Redis をマスターする:インメモリ キャッシュの実践ガイド キーと値のペアの設定

データの取得方法

最近保存した username を取得するには キーを使用するには、GET を使用します。 このようなキーワード:

GET username

PHP 向け Redis をマスターする:インメモリ キャッシュの実践ガイド キーによる値の取得

データの削除方法

DEL を使用して、以前に保存したキーを削除することもできます。 このようなキーワード:

DEL username

PHP 向け Redis をマスターする:インメモリ キャッシュの実践ガイド キーによる値の削除

値が存在するかどうかを確認する方法

EXISTS を使用してキーの存在を確認できます。 キーワード。 0 を返します キーが存在しない場合、および 1 そうなれば。最近削除された username かどうかを確認してテストできます。 キーが存在します。このように:

PHP 向け Redis をマスターする:インメモリ キャッシュの実践ガイド

キーの有効期間を設定する方法

Redis では、キーを作成するときにキーが存在する期間を指定できます。これは Redis の非常に優れた機能の 1 つです。これを行うには、SETEX を使用します。 このようなキーワード:

SETEX key seconds value

TTL を使用して、特定のキーの有効期間を確認できます。 キーワード。これは -1 を返します キーに有効期限が設定されていない場合、つまりキーは無期限に保存されます。 -2 が返されます キーが存在しない場合。キーが存在する場合は、時間を秒単位で返します。

EXPIRE を使用して、有効期限なしで以前に作成したキーの有効期限を秒単位で設定できます。 キーワード。たとえば、変数 age を保存するキーを作成します。 値が 26 の場合 。

SET age 26

次に、有効期限を 10 秒に設定します。

EXPIRE age 20

残りの生存時間を数回繰り返し確認して、実際にどのように減少し、最終的には再び存在しなくなるかを確認してください。

PHP 向け Redis をマスターする:インメモリ キャッシュの実践ガイド

Redis を使用して単純なアプリケーションを構築する方法

Redis がどのように機能するかを理解できるように、Redis を使用してデータをキャッシュし、応答をより速く読み込む基本的な Web アプリケーションを構築します。 JSONPlaceholder から画像データを取得して返す単純なアプリケーションを構築します。

Composer を使用して新しい PHP プロジェクトを作成する

プロジェクト用に新しいフォルダーを作成し、新しく作成したフォルダーにディレクトリを変更して、次のコンパウンドを実行して新しいコンポーザー プロジェクトを作成します。

composer init -q

PHP 向け Redis をマスターする:インメモリ キャッシュの実践ガイド

これにより、新しい composer.json が作成されます。 ファイルは次のようになります:

{
 "require": {}
}

次に、公開コード ファイルを格納するパブリック フォルダーを作成します。次に、新しい index.php を作成します。 フォルダ内のファイル。

PHP 向け Redis をマスターする:インメモリ キャッシュの実践ガイド

とりあえず定型コンテンツを PHP ファイルに入力し、サーバーを起動します。

<?php
echo "Hello World!";
php -S localhost:8080

単純なルーターをインストールしてリクエストを処理する

プロジェクトを完了するには、単純な PHP ルーター Altorouter をインストールします。 、および Web クライアント、Guzzlehttp .

composer require altorouter/altorouter guzzlehttp/guzzle

index.php を更新します。 このコードを含めるには:

<?php
// Import composer autoload file
require_once __DIR__ . '/../vendor/autoload.php';
// Import GuzzleHttp Client
use GuzzleHttp\Client;
// Instantiate router and web client
$router = new AltoRouter();
$client = new Client();
// Register Sample route
$router->map('GET', '/', function () {
 // Set response Content-Type
 header('Content-Type: application/json; charset=utf-8');
 // Return basic response
 echo json_encode(['data' => 'Hello World']);
});
/**
 * Route to get all photos
 */
$router->map('GET', '/photos', function () use ($client) {
 // Make request to JSONPlaceholder
 $response = $client->request('GET', 'https://jsonplaceholder.typicode.com/photos');
 header('Content-Type: application/json; charset=utf-8');
 echo json_encode([
 'data' => json_decode($response->getBody()->getContents())
 ]);
});
/**
 * Route to get single photo by id
 */
$router->map('GET', '/photos/[i:id]', function (int $id) use ($client) {
 $response = $client->request('GET', 'https://jsonplaceholder.typicode.com/photos/' . $id);
 header('Content-Type: application/json; charset=utf-8');
 echo json_encode([
 'data' => json_decode($response->getBody()->getContents())
 ]);
});
$match = $router->match();
if( is_array($match) && is_callable( $match['target'] ) ) {
 call_user_func_array( $match['target'], $match['params'] );
} else {
 // no route was matched
 header( $_SERVER["SERVER_PROTOCOL"] . ' 404 Not Found');
}

コードは一目瞭然です。ただし、わかりやすくするために、ここで内訳を示します。 1 ~ 11 行目で、必要なクラス GuzzleHttp と AltoRouter がインポートされ、インスタンス化されます。

14 行目から 20 行目では、最初のルートが登録されており、「Hello World!」を返す単純なクロージャーが付いています。 25 行目から 45 行目では、さらに 2 つのルートを登録します。1 つはすべての写真を取得するためのルートです (/photos) もう 1 つは 1 枚の写真を取得するための /photos/id

最後の行は、ルーター パッケージのドキュメントに基づいて、ルート宣言で設定されたクロージャを実際に実行するために必要です。

Postman を使用してこれらのルートをテストできます。

PHP 向け Redis をマスターする:インメモリ キャッシュの実践ガイド Hello World ルート

PHP 向け Redis をマスターする:インメモリ キャッシュの実践ガイド すべての写真を取得するルート

PHP 向け Redis をマスターする:インメモリ キャッシュの実践ガイド 1 枚の写真ルートを取得する

/photos ルートにはリクエストごとに平均 1400 ミリ秒かかります。 /photos/id リクエストごとに平均 900 ミリ秒かかります。

Redis のインストールとインスタンス化

毎回リクエストを行うのではなく、元のリクエストの結果を JSONPlaceholder にキャッシュし、キャッシュからレスポンスを返すことで、これらの時間を短縮できます。

PHP で Redis を使用するには、PhpRedis 拡張機能をインストールします。この拡張機能は、Redis と通信するための API を提供します。次のコマンドを使用して簡単にインストールできます。

pecl install redis

インストール後、このクラスを PHP プロジェクトで使用できるようになります。クラスをインポートし、index.php の先頭でインスタンス化します。 ファイル:

$redis = new Redis();
$redis->connect('127.0.0.1');

これを完了すると、プロジェクトで Redis を使用できるようになります。

Redis を使用してデータをキャッシュする方法

JSONPlaceholder から返された生の JSON レスポンスを、有効期限 1 時間 (3600 秒) で Redis に保存します。

$response = $client->request('GET', 'https://jsonplaceholder.typicode.com/photos');
$redis->setex(
 'photos',
 3600,
 $response->getBody()->getContents()
);

ここでは、photos という新しいキーを作成します。 有効期限を 1 時間に設定し、JSONPlaceholder から取得した生の応答を割り当てます。

ただし、この時点では API の応答にはまだ長い時間がかかります。これは、この応答を保存するだけであり、応答を返すために Redis を使用していないためです。

これを修正するには、新しいリクエストが届いたときに、事前にメモリ内に保存されているデータがあるかどうかを確認します。 「はい」の場合はメモリ内のデータを返し、そうでない場合は JSONPlaceholder を呼び出します。

/photos を更新します これをブロックします:

/**
 * Route to get all photos
 */
$router->map('GET', '/photos', function () use ($client, $redis) {
 // Check if Redis has the key
 if (!$redis->exists('photos')) {
 $response = $client->request('GET', 'https://jsonplaceholder.typicode.com/photos');
 // Store the data for next use
 $redis->setex(
 'photos',
 REDIS_STANDARD_EXPIRY,
 $response->getBody()->getContents()
 );
 }
 header('Content-Type: application/json; charset=utf-8');
 echo json_encode([
 'data' => json_decode($redis->get('photos'))
 ]);
});

Postman でテストして改善を確認すると、最初の呼び出し (キャッシュされる前の元の呼び出し) 後の平均応答時間が /photos の平均 20 ミリ秒に低下していることがわかります。 ルート。これは 50 倍以上の改善です。 Redis は処理時間と電力を大幅に節約します。

PHP 向け Redis をマスターする:インメモリ キャッシュの実践ガイド

/photos/id を更新します Redis も使用するルート:

$router->map('GET', '/photos/[i:id]', function (int $id) use ($client, $redis) {
 if (!$redis->exists('photos:' . $id)) {
 $response = $client->request('GET', 'https://jsonplaceholder.typicode.com/photos/' . $id);
 $redis->setex(
 'photos:' . $id,
 REDIS_STANDARD_EXPIRY,
 $response->getBody()->getContents()
 );
 }
 header('Content-Type: application/json; charset=utf-8');
 echo json_encode([
 'data' => json_decode($redis->get('photos:' . $id))
 ]);
});

/photos/id ルートも応答が得られるまでに 5 ミリ秒未満かかるため、はるかに高速になり、45 倍以上改善されました。

PHP 向け Redis をマスターする:インメモリ キャッシュの実践ガイド

概要

Redis とは何か、その基本、および Redis を使用して PHP Web アプリケーションの速度を向上させる方法を理解できたと思います。この記事で使用されているコード ファイルは GitHub で見つけることができます。

ご質問や関連するアドバイスがございましたら、私に連絡して共有してください。

私の記事をもっと読んだり、私の仕事をフォローしたりするには、LinkedIn、Twitter、Github で私とつながることができます。素早くて簡単、そして無料です!

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


  1. Node.js、Socket.IO、Redis を使用してスケーラブルなリアルタイム マルチプレイヤー Tic-Tac-Toe ゲームを作成する

    このチュートリアルでは、リアルタイム マルチプレイヤー 三目並べ ゲームを構築します。 Node.js を使用する 、Socket.IO 、 そしてRedis 。このゲームでは、2 人のプレーヤーが異なるブラウザ タブから接続し、交代でプレイし、プレイ中にリアルタイムの更新を確認できます。 Redis を使用します。 複数の WebSocket サーバー間でのゲーム ステートの同期を管理し、アプリケーションをスケーラブルにします。 最終的には、リアルタイム機能を備えた完全に機能するゲームが完成し、WebSocket と Redis を使用してスケーラブルなリアルタイム アプリケーションを構築

  2. 13年後– Redisには新しいアーキテクチャが必要ですか?

    Redisは基盤技術であるため、代替アーキテクチャを検討している人を時々目にします。数年前、これはKeyDBによって提起され、最近、新しいプロジェクトであるDragonflyが、Redisと互換性のある最速のインメモリデータストアであると主張しました。これらのプロジェクトは、議論や議論に値する多くの興味深い技術やアイデアをもたらすと信じています。ここRedisでは、Redisが最初に設計されたアーキテクチャの原則を再確認する必要があるため、この種の課題が気に入っています(Salvatore Sanfilippo、別名antirezへのヒント)。 Redisのパフォーマンスと機能を革新および向