ホームページ >バックエンド開発 >PHPチュートリアル >Redisキャッシュで既存のアプリをスピードアップします
Redisは既存のアプリケーションを加速します:クエリをキャッシュしてサーバーの負荷を減らします
コアポイント:
問題の説明:
ソリューションを適用する前に、問題の定義を明確にする必要があります。問題のアプリケーションには、クエリを実行するときに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を使用するには、次の手順に従う必要があります。現在のクエリ結果がキャッシュに存在するかどうかを表示
テスト後、それがうまく機能することがわかります - ページを更新するか、別のクエリを実行してから前のクエリに戻ると、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 サイトの他の関連記事を参照してください。