前書き:
ほとんどのプログラマーにとって、Redis ミドルウェアはよく知られているはずだと私は信じています。しかし、仕事で業務コードを書くことが多いプログラマーの場合、実際の業務では値の設定や値の取得などの操作しか使わず、redis について全体的な理解が不足している可能性があります。ここで、redis について詳しく紹介します。
Redis とは何ですか?
Redis は、C 言語で書かれたオープンソースの基盤となるキー/値ストレージ データベースです。キャッシュ、イベントの発行とサブスクリプション、高速キューなどのシナリオで使用できます。また、豊富なデータ型をサポートしています: string (文字列)、hash (ハッシュ)、list (リスト)、set (順序なしセット)、zset (並べ替えられたセット: 順序付きセット)
Redis はプロジェクトにあります アプリケーション シナリオ
1. データのキャッシュ
# が最も一般的に使用され、頻繁にクエリする必要があり、頻繁に変更されないデータは、ホット データと呼ばれることがよくあります。
2. Message Queue
は、ActiveMQ や RocketMQ などのメッセージ サブスクリプション システムに相当します。データに高い一貫性要件がある場合でも、MQ)
3, counter
を使用することをお勧めします。たとえば、クリック率やいいね率をカウントすると、Redis はアトミックであり、同時実行の問題を回避できます。
4. 電子商取引 Web サイト情報
大規模な電子商取引プラットフォームでは、ページ データのキャッシュが初期化されます。たとえば、Qunar.com で航空券を購入する場合、ホームページ上の価格はクリックした価格とは異なります。
5. ホットスポット データ
たとえば、ニュース Web サイトのリアルタイムのホットスポット、Weibo のホット検索などは、頻繁に更新する必要があります。データの総量が比較的大きい場合、データベースから直接クエリを実行するとパフォーマンスに影響します。
愛すべき理由を教えてください
通常、これは単一ノード サーバーで実行されます
#企業の発展と事業の拡大とともに。大量のデータに直面して MySql を直接使用するとパフォーマンスの低下が発生し、データの読み取りと書き込みも非常に遅くなります。したがって、キャッシュを使用して大量のデータを処理できます。 これで、次のようになります: #上の図は、キャッシュの役割を簡単に説明したものにすぎません。データが増加し続ける場合、次のことが必要になります。マスター/スレーブ レプリケーション テクノロジを使用します。読み取りと書き込みの分離を実現するには、データベース層はキャッシュと直接対話します。キャッシュにデータがある場合は、直接クライアントに返されます。ない場合は、クライアントに返されます。 MySQL からクエリされます。これにより、データベースへの負荷が軽減され、効率が向上します。 通常、新しい携帯電話が発売されると、駆け込み販売が行われます。同じ期間中に、サーバーは多くの注文リクエストを受信します。 この「単一スレッド」を実装するには、redis のアトミック操作を使用する必要があります。まず、在庫をリストに保存します。在庫に 10 個の品目があると仮定して、リストに 10 個の数字を入力します。この数字には実際的な意味はなく、在庫内の 10 個の品目を表すだけです。急ぎ購入の開始後、ユーザーが到着するたびに、リストに番号がポップアップ表示され、ユーザーの急ぎ購入が成功したことが示されます。リストが空の場合は、リストが削除されたことを意味します。リストのポップ操作はアトミックであるため、多くのユーザーが同時に到着した場合でも、それらは順番に実行されます。 余談: 一部の急ぎ購入では、フロントエンド ページでのリクエストが直接制限されます。これらのリクエストはフロントエンドによって直接インターセプトされ、バックエンド サーバーには送信されませんRedis はなぜそれほど高速なのでしょうか? 1. Redis は純粋なメモリ操作です。必要に応じて、手動でハードディスクに永続化する必要があります。2. Redis はシングルスレッドであるため、頻繁なコンテキスト切り替え操作を回避できます。マルチスレッドで。 3. Redis データ構造は単純であり、データの操作は比較的単純です。 4. 使用される基礎となるモデルは異なり、基礎となる実装メソッドと通信用のアプリケーション プロトコルは異なります。同様に、一般的なシステムがシステム関数を呼び出すと、#5 の移動とリクエストに一定の時間が無駄になるため、Redis は独自の VM メカニズムを直接構築します。 /O 多重化モデル、ノンブロッキング I/O O
複数の I/O 多重化: I/O 多重化テクノロジは、特定の I/O システム コールをブロックするプロセスまたはスレッドの問題を解決すると思われるテクノロジです。複数の記述子を監視できます。特定の記述子の準備が整うと (通常は読み取り準備完了または書き込み準備完了、つまりファイル記述子が読み取りおよび書き込み操作を実行する前)、プログラムに対応する読み取り操作および書き込み操作を実行するように通知できます。
(学習ビデオ共有:
redis ビデオ チュートリアル前述したように、Redis は 5 つの豊富なデータ型をサポートしています。では、さまざまなシナリオでどのように選択すればよいのでしょうか?
String
String は最も一般的に使用されるデータ型で、バイナリ、JSON でエンコードされたオブジェクト、さらには Base64 でエンコードされた画像など、あらゆる種類の文字列を格納できます。 Redis の文字列の最大容量は 512MB であり、これは万能と言えます。 ######ハッシュ###
構造化データの保存によく使用され、たとえばフォーラム システムでは、ユーザー ID、ニックネーム、アバター、ポイント、その他の情報の保存に使用できます。情報を変更する必要がある場合は、Key を介して Value を取り出し、デシリアライズし、項目の値を変更し、シリアライズして Redis に保存するだけです。ハッシュ構造が保存されるのは、ハッシュ構造が保存されるためです。単一のハッシュ要素が特定の数未満の場合に変更されます。圧縮されたストレージなので、メモリを大幅に節約できます。これは String 構造には存在しません。
List
List は二重リンク リストとして実装されており、逆方向検索とトラバーサルをサポートできるため、操作がより便利になります。ただし、追加のメモリ オーバーヘッドが生じます。Redis 内の多くの実装, 送信バッファキューなども含めて、このデータ構造が使用されます。さらに、lrange コマンドを使用して、優れたパフォーマンスと優れたユーザー エクスペリエンスを備えた Redis ベースのページング機能を実装できます。
Set
set が提供する外部関数は list の関数と似ています。特別なことは、set が重複を自動的に排除できることです。リスト データを保存する必要があるが、保存しない場合重複データが表示された場合、この時点で設定を使用することを選択できます。
ソートセット
は、特定の条件の重みに従ってソートすることができ、たとえばクリック数に基づいてランキングデータを適用することができます。
Redis キャッシュのデータ整合性について
データベースのデータとキャッシュされたデータが整合性を持つことは本当の意味では不可能であり、データは最終整合性と強整合性の 2 つに分類されます。 。ビジネスでデータに対する要件が厳しくなければならない場合、キャッシュは使用できません。キャッシュでできることは、データの最終的な整合性を確保することだけです。
私たちにできることは、データの一貫性を可能な限り確保することだけです。最初にデータベースを削除してからキャッシュを削除するか、最初にキャッシュを削除してからデータベースを削除するかに関係なく、データの不整合が発生する可能性があります。読み取り操作と書き込み操作は並行して行われるため、順序は保証できません。具体的な対応戦略はビジネス ニーズに基づいて決定する必要があるため、ここでは詳しく説明しません。
Redis の有効期限とメモリの削除
Redis がデータを保存するときに、その有効期限を設定できます。しかし、このキーはどのように削除されるのでしょうか?
最初は、スケジュールされた削除だと思っていましたが、後でそうではないことがわかりました。なぜなら、スケジュールされた削除の場合、キーを継続的に監視するためにタイマーが必要だからです。がリリースされると、大量の CPU リソースが消費されます。
Redis の有効期限の削除では、定期的な削除が使用されます。デフォルトでは、100 ミリ秒ごとに検出されます。期限切れのキーが見つかると、削除されます。ここでの検出は、連続的な検出ではなく、ランダムな検出です。魚は網をすり抜けてしまうでしょうか? Redis もこれを考慮していることは明らかです。期限切れのキーを読み書きすると、Redis の遅延削除戦略がトリガーされ、期限切れのキーが直接削除されます。
メモリの削除とは、メモリの削除とは、によって保存されたキーの一部を指します。ユーザー Redis によって自動的に削除されるため、キャッシュ内でデータが見つからなくなります。弊社サーバーのメモリは2Gですが、事業の発展に伴いキャッシュデータが2Gを超えてきました。ただし、オペレーティング システムの可視メモリは物理メモリによって制限されないため、これはプログラムの実行には影響しません。物理メモリが足りなくても、コンピュータはハードディスクの領域を仮想メモリとして割り当てます。これは、キャッシュと永続ストレージという 2 つのアプリケーション シナリオを設計するという Redis の本来の目的です。
キャッシュの内訳
キャッシュは、データベースへの負担を軽減するために追加される単なる保護層です。キャッシュからのクエリは実行できません。必要なデータを取得したら、データベース内でクエリを実行する必要があります。ハッカーがキャッシュにないデータに頻繁にアクセスすると、キャッシュは意味を失い、すべてのリクエストの圧力が瞬時にデータベースにかかり、データベース接続異常が発生します。
解決策:
1. バックグラウンドでスケジュールされたタスクを設定して、キャッシュされたデータをアクティブに更新します。この解決策は理解するのが簡単ですが、キーが比較的分散している場合、操作は依然として比較的複雑です (
2. 階層キャッシュ)。たとえば、2 層のキャッシュ保護を設定すると、レベル 1 キャッシュの有効期限は短く、レベル 2 キャッシュの有効期限は長くなります。リクエストが受信されると、まずレベル 1 キャッシュで検索されます。対応するデータがレベル 1 キャッシュに見つからない場合、スレッドはロックされます。その後、このスレッドはデータベースからデータを取得し、レベル 1 に更新します。そしてレベル2キャッシュ。他のスレッドは、レベル 2 スレッドから
3 を直接取得し、インターセプト メカニズムを提供し、一連の正当なキー値を内部的に維持します。要求されたキーが無効な場合は、キーが直接返されます。
キャッシュなだれ
キャッシュなだれとは、何らかの理由 (ダウンタイム、キャッシュ サービスのハング、応答不能など) によりキャッシュがクラッシュし、その結果、バックエンド データベースに大量のリクエストが到達することを意味します。したがって、データベースがクラッシュし、システム全体がクラッシュし、前述のキャッシュの故障である災害が発生します。
雪崩を回避する方法:
1. 特定の範囲内のランダムな有効時間をキャッシュに追加し、異なる有効期限を設定します。同時に集団的な失敗を避けるために、異なるキーを使用します。
2. キャッシュ故障の解決策と同様に、2 次キャッシュを作成し、元のキャッシュに障害が発生した場合はコピー キャッシュからデータを読み取ります。
3. ロックまたはキューを使用して、多数のリクエストが同時にサーバーに対して読み書きできないようにします。 ######結論:###
Redis は、読み取り速度 110,000 回/秒、書き込み速度 81,000 回/秒と非常に高いパフォーマンスを備えており、トランザクション、バックアップ、豊富なデータ型をサポートしています。
すべてのものには 2 つの側面があり、Redis にも欠点があります:
1. インメモリ データベースであるため、単一マシンに保存されるデータ量は限られており、開発者は次のことを行う必要があります。不要なデータは速やかに削除してください。
2. Redis データを変更した後、ハードディスクに保存されているデータをコンテンツに再度追加する必要があるため、時間がかかり、現時点では Redis が正常に実行できません。
元のリンク: https://www.pianshen.com/article/589052263/
関連する推奨事項: redis データベース チュートリアル
以上がRedis が非常に便利だと言われているのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。