優れたソフトウェアと実用的なチュートリアル
LinuxにRedisをインストールしてPHPへのアクセスを高速化
LinuxにRedisをインストールする PHPウェブサイトのアクセス速度が遅い場合はどうすればいいでしょうか?現在、多くの人がWordPressを使ってウェブサイトを構築しています。WordPressはPHPをベースに開発された大規模なブログプログラムです。WordPressウェブサイトのアクセス速度を向上させるにはどうすればよいでしょうか?ここでは、サーバー側キャッシュツールRedisをインストールする必要があります。以下では、Redisとは何か、LinuxにRedisをインストールする方法について詳しく説明します。
PHPキャッシュツールRedis
Redisが最も人気があるPHPキャッシュツール一、Webアプリケーション開発の初期段階では、当時のWebサイトはアクセス数や同時実行性が低く、インタラクションも少なかったため、リレーショナルデータベースが広く注目され、広く利用されていました。その後、トラフィックの増加に伴い、リレーショナルデータベースを使用するWebサイトはパフォーマンスのボトルネックに直面するようになりました。ボトルネックの原因は、一般的にディスクI/Oでした。インターネット技術のさらなる発展に伴い、さまざまな種類のアプリケーションが次々と登場し、今日のクラウドコンピューティングとビッグデータ時代におけるパフォーマンス要件はますます厳しくなり、主に以下の4つの側面に反映されています。
- 低レイテンシの読み取りおよび書き込み速度: アプリケーションの応答が速いため、ユーザー満足度が大幅に向上します。
- 膨大な量のデータとトラフィックのサポート: 検索などの大規模なアプリケーションでは、PB レベルのデータを使用し、数百万のトラフィックを処理できる必要があります。
- 大規模クラスターの管理: システム管理者は、分散アプリケーションをより簡単に展開および管理できることを期待しています。
- 莫大な運用コストの考慮: IT 部門は、ハードウェア コスト、ソフトウェア コスト、人件費を大幅に削減したいと考えています。
この問題を克服するためにNoSQLが誕生しました。NoSQLは、高いパフォーマンス、強力なスケーラビリティ、高可用性といった利点を備えており、幅広い開発者や倉庫管理者に支持されています。
Redisとは
Redisは最も人気のあるNoSQLデータベースの1つです。ANSI Cで記述されたオープンソースのメモリベースで、オプションで永続的なキーと値のペアを保存できるデータベースです。複数のデータ構造を持ち、ネットワークをサポートしています。以下の機能を備えています。
- メモリ操作に基づく高性能
- 分散をサポートし、理論上は無限に拡張可能
- キーバリューストレージシステム
- ANSI Cで書かれたオープンソースで、BSDプロトコルに準拠し、ネットワークをサポートし、メモリまたは永続的なログタイプ、キーバリューデータベースをベースとすることができ、複数の言語でAPIを提供します。
他のデータベース タイプと比較して、Redis には次の特性があります。
- C/Sコミュニケーションモデル
- 単一プロセス、単一スレッドモデル
- 豊富なデータ型
- 操作はアトミック
- 粘り強さ
- 高い同時読み取りと書き込み
- Luaスクリプトをサポート
どの大企業が Redis を使用していますか?
- ギットハブ
- ツイッター
- 微博
- スタックオーバーフロー
- アリババ
- 百度
- 美団
- 捜狐
Redis の適用シナリオは何ですか?
Redis のアプリケーション シナリオには、キャッシュ システム (「ホット」データ: 高頻度の読み取り、低頻度の書き込み)、カウンター、メッセージ キュー システム、ランキング、ソーシャル ネットワーク、リアルタイム システムなどがあります。
Redis のデータ型と主な機能
Redisが提供するデータ型は、主に5つの組み込み型と1つのカスタム型に分けられます。これらの5つの組み込み型には、文字列型、ハッシュ型、リスト型、セット型、シーケンシャルセット型が含まれます。
文字列型:
これはバイナリセーフ文字列であり、文字列だけでなく、画像、ビデオ、その他のタイプも保存でき、最大長は 512 MB です。
Redis は、各データ型に対して次のようなさまざまな操作コマンドを提供します。
- GET/MGET
- SET/SETEX/MSET/MSETNX
- 増加/減少
- ゲットセット
- 削除
ハッシュタイプ:
この型は、フィールドと関連付けられた値で構成されるマップであり、フィールドと値は両方とも文字列型です。
ハッシュ操作コマンドは次のとおりです。
- HGET/HMGET/HGETALL
- HSET/HMSET/HSETNX
- ヘクシスト/ヘレン
- HKEYS/HDEL
- HVALS
リストタイプ:
この型は、挿入順にソートされた文字列要素のコレクションであり、二重リンクリストに基づいて実装されています。
リスト操作コマンドは次のとおりです。
- LPUSH/LPUSHX/LPOP/RPUSH/RPUSHX/RPOP/LINSERT/LSET
- LINDEX/LRANGE
- レン/Lトリム
コレクションタイプ:
Set型は順序のないコレクションです。List型との最大の違いは、セット内の要素に順序がなく、要素が一意であることです。
Set 型の基礎レイヤーはハッシュ テーブルを通じて実装されており、その操作コマンドは次のとおりです。
- サッド/スポップ/スムーブ/スカード
- シンター/SDIFF/SDIFFSTORE/SUNION
Set型は主に、ソーシャルなシナリオなど、特定のシナリオで使用されます。Set型は、積集合、和集合、差集合の演算を通じて、共通の友人、共通の関心事、共通の好みといったソーシャルな関係性を簡単に見つけることができます。
シーケンシャルコレクションタイプ:
ZSet は順序付き集合型です。各要素には double 型のスコア重みが関連付けられており、これを用いて集合内の要素を小さい順に並べ替えます。Set 型と同様に、その基礎構造もハッシュテーブルによって実装されています。
ZSet コマンド:
- ZADD/ZPOP/ZMOVE/ZCARD/ZCOUNT
- ザンター/ZDIFF/ZDIFFSTORE/ZUNION
Redisのデータ構造
Redis のデータ構造は次の図に示されています。
上記の表についていくつか説明します。
- 圧縮リストは、リストキーとハッシュキーの基盤となる実装の一つです。リストキーに含まれるリスト項目の数が少なく、各リスト項目が小さな整数または短い文字列である場合、Redisはリストキーの基盤となる実装として圧縮リストを使用します。
- 整数セットは、セットキーの基盤となる実装の一つです。セットに整数値要素のみが含まれており、そのセット内の要素数が少ない場合、Redisはセットキーの基盤となる実装として整数セットを使用します。
以下は Struct データ構造を定義する例です。
シンプルな動的文字列 SDS
C 言語の従来の文字列の欠陥に基づいて、Redis は次の構造を持つ SDS と呼ばれる単純な動的文字列という抽象型を構築しました。
SDS は Redis のほぼすべてのデータ構造で実行され、広く使用されています。
SDSの特徴
C 文字列と比較すると、SDS には次の特性があります。
- 文字列の長さを取得するための定数の複雑さ
Redis では、SDS 文字列の len 属性を使用して、保存された文字列の長さを直接取得できます。
文字列の長さを取得する複雑さは、C文字列のO(N)からO(1)に直接削減されます。
- 文字列を変更するときに発生するメモリの再割り当て回数を削減します
C文字列の特性から、N文字を含むC文字列の場合、その基礎となる実装は常にN+1文字の長さの配列(末尾にヌル文字が追加される)であることが分かります。
この時点で文字列を変更する必要がある場合、プログラムは事前にC文字列配列のメモリを再割り当てする必要があります(拡張または解放される可能性があります)。
メモリの再割り当ては時間のかかる操作であることを意味します。
RedisはC文字列の欠陥を回避するためにSDSを巧みに使用しています。SDSでは、buf配列の長さは必ずしも文字列の文字数に1を加えた値ではありません。buf配列には未使用のバイトが含まれる場合があり、それらはfree属性によって記録されます。
同時にSDSはスペースの事前割り当てこの戦略により、C 文字列が変更されるたびに時間のかかるメモリ再割り当て操作が回避され、メモリ再割り当てが N 回の変更ごとに N 回から、N 回の変更に対して最大 N 回に削減されます。
以下は、Redis による SDS の簡単な定義です。
Redisの機能1:トランザクション
- コマンドのシリアル化、順番に実行
- 原子性
- 3つのフェーズ: トランザクションの開始 - コマンドのキューへの追加 - トランザクションの実行
- コマンド: MULTI/EXEC/DISCARD
Redis の機能 2: Pub/Sub
- Pub/Subはメッセージングモデルです
- Pubがメッセージを送信し、Subがメッセージを受信します
- Redisクライアントは任意の数のチャネルをサブスクライブできる
- 「火事と忘れ物」
- コマンド: Publish/Subscribe/Psubscribe/UnSub
Redisの機能3:ストリーム
- Redis 5.0 の新機能
- 消費を待つ
- 消費者グループ(グループ内競争)
- 消費履歴データ
- 先入れ先出し法
以上がRedisの基本的な概念です。次に、開発プロセスで遭遇する可能性のある「落とし穴」について紹介します。
Redis FAQ: 内訳
概念: Redis がキーを取得する場合、キーが存在しないため、DB にリクエストを行う必要があり、これを「Redis の故障」と呼びます。
故障の原因:
- 初回訪問
- 存在しないキーへの悪意のあるアクセス
- キーの有効期限が切れました
合理的な回避策:
- サーバーが起動したら、事前に書いておく
- キーの命名とインターセプトをミドルウェアを通じて標準化する
- 頻繁にアクセスされるキーについては、適切なTTLを設定するか、無期限にする
Redis FAQ: Avalanche
概念:Redisのキャッシュ層が何らかの理由でダウンすると、すべてのリクエストがストレージ層に流れます。短時間に大量のリクエストが同時発生すると、ストレージ層がハングアップする可能性があり、これを「Redisアバランシェ」と呼びます。
合理的な回避策:
- Redis クラスターの使用
- 電流制限
製品開発におけるRedisの応用実践
そこで、Grape CityのアーキテクトであるJimが、2019年11月27日14:00より公開講座を開催いたします。Redisの基礎を解説するだけでなく、JimはプロジェクトチームがRedisを使用する際に遭遇した問題と解決策を実演します。Redisを初めて使用する方にとって、より有意義で価値のある参考資料と学習資料となるでしょう。どなたでもご参加いただけます。公開講座のアドレスは以下のとおりです。https://live.vhall.com/661463644。
- バックエンドはNodeJSを使用しています
- Azure Redis サービスの使用
- Redisの使用シナリオ
- トークン検証に使用されるトークンキャッシュ
- IPホワイトリスト
遭遇した問題
- 「ネットワークジッター」またはRedisサービスの異常によりRedisのアクセスタイムアウトが発生する
- Redis クライアント ドライバーの安定性の問題
- 接続プールの「接続切断」問題
- JS Promise による Redis リセット問題
Redis の高度な知識を簡単に見てみましょう。
Redisプロトコルの高度な入門
Redis クライアント通信プロトコル: RESP (Redis Serialization Protocol)、その特徴は次のとおりです。
- 単純
- 高速解析速度
- 読みやすさが良い
Redis クラスターの内部通信プロトコル: RECP (Redis Cluster Protocol)、その特徴は次のとおりです。
- 各ノードには2つのTCP接続がある
- 1つはクライアントとサーバー間の通信を担当します(P: 6379)
- 1つはノード間の通信を担当します(P:10000 + 6379)
Redis プロトコルでサポートされるデータ型:
- 単純な文字(最初のバイト:「+」)
"+OK\r\n"
- エラー(最初のバイト:「-」)
"-エラーメッセージ\r\n"
- 数値(最初のバイト: ":")
「:123\r\n」
- バッチ文字(最初のバイト:「$」)
「&hello\r\nあなたは誰ですか\r\n」
- 配列(最初のバイト:「*」)
「*0\r\n」
"*-1\r\n"
Redis の他に、どのような NoSQL データベースがありますか?
市場にはRedisに似たNoSQLデータベースが数多く存在します。下図に示すように、Redisに加えて、MemCache、Cassadra、Mongoなどがあります。以下では、これらのデータベースについて簡単に紹介します。
メモリキャッシュ:これはRedisに非常によく似たデータベースですが、データ型はRedisほど豊富ではありません。MemcacheはLiveJournalのBrad Fitzpatrick氏によって開発されました。分散型の高速キャッシュシステムとして、多くのウェブサイトでウェブサイトのアクセス速度向上に利用されています。データベースへの頻繁なアクセスが必要な大規模ウェブサイトのアクセス速度向上に大きな効果を発揮します。
アパッチ カサンドラ:(コミュニティでは一般的にC*と呼ばれています)これはオープンソースの分散NoSQLデータベースシステムです。元々はFacebookが受信トレイなどのシンプルな形式のデータを保存するために開発しました。グーグル BigTableのデータモデルとアマゾン Dynamoの完全分散アーキテクチャ。Facebookは2008年にCassandraをオープンソース化しました。その優れたスケーラビリティとパフォーマンスにより、Apple、Comcast、Instagram、Spotifyなどで使用されています。イーベイ、ラックスペース、ネットフリックスなどの有名なウェブサイトで採用されており、人気の分散構造化データ ストレージ ソリューションとなっています。
モンゴDB: C++で記述された、分散ファイルストレージをベースとしたドキュメント指向のNoSQLデータベースです。Webアプリケーション向けにスケーラブルで高性能なデータストレージソリューションを提供することを目的としています。MongoDBは、リレーショナルデータベースと非リレーショナルデータベースの中間に位置する製品です。非リレーショナルデータベースの中で最も機能豊富なリレーショナルデータベースです。サポートされるデータ構造は非常に緩やかで、JSONに似たBSON形式です。
LinuxにRedisをインストールする
以下では、CentOS システムを例として使用して、Redis をインストールし、WordPress に Redis を適用します。
DNFを使用してRedisをインストールする
dnf で redis をインストール
list コマンドを使用して、インストールが成功したかどうかを確認します。
インストール後、ブートとサービスの開始を設定します
systemctl で Redis を有効にする systemctl で Redis を起動する
コマンドを使用して、Redis の実行ステータスを確認します。
systemctl ステータス redis
DNFを使ってRedisをインストールすると、便利で手早くインストールできます。これでRedisがインストールされました。Redisの設定ファイルは/etc/redis.confにあります。
WordPressにRedisプラグインをインストールする
WordPressのバックグラウンドプラグインでredisを検索
Redisオブジェクトキャッシュのインストール
プラグインのプロフェッショナル バージョンが必要な場合は、PHP 拡張機能をインストールする必要があります。