ホームページ >バックエンド開発 >PHPチュートリアル >Redisキャッシュで既存のアプリをスピードアップします

Redisキャッシュで既存のアプリをスピードアップします

Christopher Nolan
Christopher Nolanオリジナル
2025-02-17 11:03:13198ブラウズ

Redisは既存のアプリケーションを加速します:クエリをキャッシュしてサーバーの負荷を減らします

コアポイント:

  • Redisは、クエリの結果をキャッシュすることにより、既存のアプリケーションを効果的に加速し、サーバーの圧力を低下させます。指定された時間(たとえば、24時間)のクエリ結果を保存し、これらの結果を再利用して、アプリケーション速度を大幅に改善します。
  • Redisのインストールは、オペレーティングシステムパッケージマネージャーを介して、または手動で完了することができます。インストールプロセスには、一般的な警告を避け、サーバーが再起動した後にRedisが自動的に開始されるようにすることが含まれます。
  • PredisライブラリはRedisと連携して、アプリケーションにメモリキャッシュレイヤーを提供します。このプロセスでは、現在のクエリの結果がキャッシュに存在するかどうかを確認し、存在しない場合は結果を取得し、将来の使用のために保存します。
  • パフォーマンスをさらに向上させるために、Predisは、Redisプロトコルのシリアル化と解析のオーバーヘッドを削減するPHP拡張機能であるPhpiredisのインストールを推奨し、Redisのインストールをより速くすることをお勧めします。
以前にPHPでRedisの基本を導入しましたが、今度は実用的なアプリケーションケースを導入する時が来ました。このチュートリアルでは、展開されたアプリケーションに追加して、アプリケーション速度を向上させます。

Speeding up Existing Apps with a Redis Cache

アプリケーションのバージョン0.6をクローンすることができ、簡単に学習できます。

問題の説明:

ソリューションを適用する前に、問題の定義を明確にする必要があります。

問題のアプリケーションには、クエリを実行するときにDiffbotのAPIにアクセスし、データセットに照会します。次に、サブセットを返して表示します。 Diffbotサーバーがどれだけ忙しいかに応じて、これには約5秒かかります。これは間違いなくコンピューティングパワーを拡大するにつれて改善されますが、セット自体が頻繁にのみ更新されるため、24時間実行されて再利用されたクエリの結果が一度実行された場合、それは素晴らしいことです。

あなたは「単一のクエリをキャッシュすることの利点は何ですか?」

実際には、研究では、人々が同じコンテンツを頻繁に検索し(反応する「React」クエリが突然増加します)、有名な著者(または自分自身)も検索します。このキャッシュの実装にはほとんどコストがかかることを考えると(実際にはサーバーの圧力を削減することでコストを削減することで)、頻繁に使用されていなくても、簡単な勝利です。

それを追加しない理由 - は私たちにしか有利です。 問題を明確に定義したら、前提条件に対処しましょう。

インストール:

まず、Redisを開発および生産環境にインストールする必要があります(ローカル開発でHomesteadを使用している場合、Redisはすでにインストールされていますが、執筆時点ではバージョン3.0.1)。

オペレーティングシステムのパッケージマネージャーを通じてこれを行うことができます:

<code class="language-bash">sudo apt-get install redis-server</code>

これは最も簡単で推奨される方法ですが、ゼロからインストールして手動で構成することもできます。彼らのウェブサイトの指示によると、それは次のように行うことができます:

<code class="language-bash">sudo apt-get install gcc make build-essential tcl
wget http://download.redis.io/releases/redis-3.0.2.tar.gz
tar xzf redis-3.0.2.tar.gz
cd redis-3.0.2
make
make test
sudo make install</code>

実行後にJemalloc.hに言及している致命的なエラーに遭遇した場合は、Make DistCleanを実行して再び実行してください。テストコマンドはオプションですが、役立ちます。

注:この記事とバージョン3.0.2が最新ではなくなった場合は、コマンドを最新バージョン番号に調整するだけです。

いくつかの一般的な警告を防ぐため(少なくともubuntuで)、次のコマンドも予防的に実行します。

また、
<code class="language-bash">sudo sh -c 'echo "vm.overcommit_memory=1" >> /etc/sysctl.conf'
sudo sh -c 'echo "net.core.somaxconn=65535" >> /etc/sysctl.conf'
sudo sh -c 'echo "never" > /sys/kernel/mm/transparent_hugepage/enabled'</code>
最後のコマンドを /etc/rc.localに、出口0のすぐ上に追加して、サーバーが再起動するたびに再測定できるようにします。最後に、Sudo Rebootを使用してサーバーを再起動し、Sudo Redis-Serverを実行してRedisが適切に実行されているかどうかを確認できます。

最後に、サーバーが再起動した後、Redisが自動的に起動することを確認する必要があるため、公式の指示に従ってこれを行います。

predis:

以前にプレディスの基本をカバーしてきましたが、この場合も使用します。次のコマンドを使用してインストールしましょう:

<code class="language-bash">composer require predis/predis</code>
次に、前述のプレディスの紹介を習得したと仮定しましょう。

その投稿が公開されたため、いくつかのわずかな違いが導入されました(名前空間への移行など)が、使用する必要があるAPIはほぼ同じです。

実装:

アプリケーションでRedisを使用するには、次の手順に従う必要があります。

現在のクエリ結果がキャッシュに存在するかどうかを表示
  • それが存在する場合は、結果を取得します
  • それが存在しない場合は、結果を取得し、結果を保存し、結果をアプリケーションの残りの部分に転送します
  • したがって、実装は非常に単純です。「フォーム送信」チェック(「検索」パラメーターを探すもの)の下で、Predisクライアントをインスタンス化し、実行された検索クエリのMD5ハッシュを計算してからチェックしますその結果が確認されている場合。 falseの場合、前のプロセスは継続しますが、次のとおりです。
は終了しますが、結果を直接シリアル化し、キャッシュに保存します。次に、コードブロックの外で、キャッシュの結果を取得し、アプリケーションのフローは通常どおり継続します。したがって、index.phpファイルの変更された部分は次のようになります。

テスト後、それがうまく機能することがわかります - ページを更新するか、別のクエリを実行してから前のクエリに戻ると、1回実行されたクエリは瞬時になります。最後に、展開を追加、送信、プッシュすることができます。

<code class="language-php">$result = ...
$info = ...</code>
それだけです!アプリケーションの最新バージョンが利用可能になり、Redisがキャッシュデータを提供しています。

<code class="language-php">// 检查是否提交了搜索表单
if (isset($queryParams['search'])) {

    $redis = new Client();
    $hash = md5($_SERVER['QUERY_STRING']);
    if (!$redis->get($hash . '-results')) {

        $diffbot = new Diffbot(DIFFBOT_TOKEN);

        // 构建搜索字符串
        $searchHelper = new SearchHelper();
        $string = (isset($queryParams['q']) && !empty($queryParams['q']))
            ? $queryParams['q']
            : $searchHelper->stringFromParams($queryParams);

        // 基础设置
        $search = $diffbot
            ->search($string)
            ->setCol('sp_search')
            ->setStart(($queryParams['page'] - 1) * $resultsPerPage)
            ->setNum($resultsPerPage);

        $redis->set($hash . '-results', serialize($search->call()));
        $redis->expire($hash . '-results', 86400);
        $redis->set($hash . '-info', serialize($search->call(true)));
        $redis->expire($hash . '-info', 86400);
    }

    $results = unserialize($redis->get($hash . '-results'));
    $info = unserialize($redis->get($hash . '-info'));
}</code>
注:1つのコミットで開発モードから生産展開にどのように切り替えるかを知りたい場合は、この記事を読む必要があります。

<code class="language-bash">git add -A
git commit -m "Added Redis cache [deploy:production]"
git push origin master</code>

微調整:

パフォーマンスをさらに向上させるために、Predisは、Redisプロトコルのシリアル化と解析

」のオーバーヘッドを削減するためのPHP拡張機能であるPhpiredisをインストールすることをお勧めします。サーバーを完全に制御できるので、これを行いませんか?

これにより、前提条件がインストールされ、拡張機能が有効になります。これで、Phpiredis接続を使用するようにPredisクライアントを構成するだけです。交換する必要があります:
<code class="language-bash">sudo apt-get install redis-server</code>

is:
<code class="language-bash">sudo apt-get install gcc make build-essential tcl
wget http://download.redis.io/releases/redis-3.0.2.tar.gz
tar xzf redis-3.0.2.tar.gz
cd redis-3.0.2
make
make test
sudo make install</code>

それだけです! Redisのインストールは今より速いです!
<code class="language-bash">sudo sh -c 'echo "vm.overcommit_memory=1" >> /etc/sysctl.conf'
sudo sh -c 'echo "net.core.somaxconn=65535" >> /etc/sysctl.conf'
sudo sh -c 'echo "never" > /sys/kernel/mm/transparent_hugepage/enabled'</code>

結論:

このチュートリアルでは、RedisライブラリとPredisライブラリを組み合わせて使用​​して、展開されたアプリケーションをより速く見えるようにします。ソースを送信する代わりに、Digitalocean液滴の利用可能なRAMを使用して、1日1回クエリの結果を保存し、これらの結果をキャッシュから返します。これは、結果が常に最新であるとは限らないことを意味しますが、この投稿によると、結果自体はこれよりも頻繁に更新されません。

このチュートリアルが、アプリケーションにメモリキャッシュレイヤーを追加するのがどれほど簡単かを示していることを願っています。また、読み込み時間を短縮してサーバーコストを削減する必要がある場合に非常に便利です。

他の提案はありますか?スキル?コメント?以下にメッセージを残してください!

(FAQパーツはここで省略されています。FAQパーツの内容が記事の主要な内容と複製されているため、これは冗長な情報です。擬似原産性は、内容の重複を避ける必要があります。

以上がRedisキャッシュで既存のアプリをスピードアップしますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。