Redis プロジェクトのナレッジポイントは何ですか?
プロジェクトのハイライト:
1. 分散型 Seesion を使用すると、複数のサーバーが同時に応答できます。
2. Redis をキャッシュとして使用すると、アクセス速度と同時実行性が向上し、データベースの負荷が軽減され、メモリ タグを使用して Redis アクセスが軽減されます。
3. 静的ページを使用してユーザー アクセスを高速化し、QPS を向上させ、ページをブラウザーにキャッシュし、フロントエンドとバックエンドを分離してサーバーの負荷を軽減します。
4. メッセージ キューを使用して、非同期の注文を完了し、ユーザー エクスペリエンスを向上させ、ピーク レートとフロー レートを削減します。
5. セキュリティの最適化: ダブル md5 パスワード検証、フラッシュキルインターフェイスアドレスの隠蔽、インターフェイス電流制限とアンチブラッシング、数式検証コード。
主な知識ポイント:
分散型セッション
フラッシュ セール サービスの実際のアプリケーションは、1 台のサーバーに展開されるだけでなく、複数のサーバーに分散される場合があります。ユーザーが最初のサーバーにログインすると、最初のリクエストは最初のサーバーに送信されますが、2 番目のリクエストは 2 番目のサーバーに送信され、ユーザーのセッション情報は失われます。
解決策: セッションの同期では、どのサーバーにアクセスしても、redis キャッシュ メソッドを使用し、特にユーザーのセッション情報を保存するための redis サーバーを使用してセッションを取得できます。この方法では、ユーザー セッションが失われることはありません。 (セッションが必要になるたびに、キャッシュから取得するだけです)
redis はデータベースの負担を軽減します
このプロジェクトでは、ユーザー情報のキャッシュ (分散セッション)、製品などのキャッシュ テクノロジを広範囲に利用しています。情報 キャッシュ、商品在庫キャッシュ、注文キャッシュ、ページ キャッシュ、オブジェクト キャッシュにより、データベース サーバーへのアクセスが軽減されます。
ユニバーサル キャッシュ キーのカプセル化
問題の 1 つは、同じキー値が存在する可能性があるため、異なるモジュール内のキャッシュをどのように区別するかです。
解決策: 抽象クラスを使用して BaseKey を定義します。 ( プレフィックス)。キャッシュ キーをカプセル化するために、キャッシュ キーのプレフィックスとキャッシュの有効期限が定義されます。異なるモジュールにそれを継承させることで、モジュールがキャッシュに保存されるたびにキャッシュ固有のプレフィックスが追加され、異なる有効期限を均一に設定できます。
ページの静的化 (フロント エンドとバック エンドの分離)
ページの静的化の主な目的は、ページの読み込みを高速化し、商品詳細ページと注文詳細ページを静的 HTML にすることです。 (純粋な HTML )、データのロードには ajax を介してサーバーにリクエストするだけで済み、静的な HTML ページをクライアントのブラウザにキャッシュできます。
メッセージ キューを使用して非同期注文発注を完了する
メッセージ キューを使用して非同期注文発注を完了し、ユーザー エクスペリエンスを向上させ、ピークをカットし、フローを削減します
アイデア:
1 .システムが初期化され、製品在庫数量在庫が Redis にロードされます。
2. バックエンドはフラッシュ セール リクエストを受信し、Redis は在庫を事前に削減します。在庫が臨界値に達した場合、リクエストを続行する必要はなく、失敗が直接返されます。後続の多数のリクエストによってシステムに問題が発生する必要はありません。
3. フラッシュ セール注文が成立したかどうかを判断し、フラッシュ セールが到着したかどうかを判断し、1 つのアカウントから複数の製品を避けるようにし、フラッシュ セールが繰り返されるかどうかを判断します。
4. 在庫は十分であり、重複したフラッシュ セールはありません。フラッシュ セール リクエストはカプセル化され、メッセージがキューに入れられます。同時に、コード (0) がフロント エンドに返されます。キューに戻されることを意味します。 (返されるのは失敗か成功ではなく、現時点では判断できません)
5. フロントエンドはデータを受信後、キューを表示し、プロダクトID( 200 ミリ秒ごとにポーリングすることを検討してください)。
6. バックエンドの RabbitMQ はフラッシュ セールの MIAOSHA_QUEUE というチャネルを監視し、メッセージがあれば受信情報を取得します。実際のフラッシュ セールを実行する前に、在庫を判断する必要があります。データベースを参照し、フラッシュ セールが繰り返されるかどうかを判断し、フラッシュ セール トランザクションを実行します (フラッシュ セール トランザクションはアトミックな操作です。在庫を 1 つ減らし、注文し、フラッシュ セール注文を書き込みます)。
7. このとき、フロントエンドは製品 ID に基づいてリクエスト インターフェイス MiaoshaResult をポーリングし、製品注文が生成されたかどうかを確認します。リクエストが -1 を返した場合、フラッシュ セールが失敗したことを意味します。 0 はキューに登録されていることを意味し、>0 は製品 ID が返されたことを意味し、フラッシュ セールが成功したことを意味します。
セキュリティの最適化
ダブル md5 パスワード検証、フラッシュキルインターフェイスアドレスの隠蔽、インターフェイス電流制限とアンチスワイプ、数式検証コード。
エレガントなコードの書き方
インターフェースの出力結果はResultカプセル化されます
間違ったコードはCodeMsgカプセル化されます
アクセスキャッシュキーのカプセル化
プロジェクトと問題解決の難しさ:
1. JMeter を使用してストレス テストを実行すると、5000 のスレッドが開かれ、システムは実行できず、例外が発生します
理由: 構成ファイル内の Redis 構成項目 poolMaxTotal を変更し、1000 に設定します。
#redis 構成項目
redis.poolMaxTotal=1000
redis.poolMaxldle=500
redis.poolMaxWait=500
2 . 大量のキャッシュが使用されるため、キャッシュの故障、キャッシュなだれ、キャッシュの一貫性などの問題が発生しますか?
キャッシュ侵入とは、存在してはいけないデータに対するリクエストを行うことを指します。リクエストはキャッシュを通過してデータベースに到達します。
解決策: これらの存在しないデータについては空のデータをキャッシュし、そのようなリクエストをフィルターします。
キャッシュ雪崩とは、データがキャッシュにロードされていないか、キャッシュされたデータが広範囲で同時に失敗 (期限切れ) しているか、キャッシュ サーバーが停止しているために、データベースに到達する大量のリクエストを指します。下。 ######解決:###
広い領域で同時にキャッシュの期限切れによって引き起こされるキャッシュなだれを防ぐために、ユーザーの行動を観察し、キャッシュの有効期限を合理的に設定できます;
キャッシュ サーバーによって引き起こされるキャッシュなだれを防ぐためにダウンタイムの場合は、分散キャッシュを使用できます。分散キャッシュ内の各ノードは、データの一部のみをキャッシュします。ノードがダウンしても、他のノードのキャッシュが引き続き利用可能であることを確認できます。
システムの起動直後に大量のデータがキャッシュされないことによるキャッシュなだれを回避するために、キャッシュの予熱を実行することもできます。
例: まず、セッション キャッシュなどのキャッシュごとに異なる有効期限を設定します。userKey プレフィックスでは、設定は 30 分で期限切れになり、キャッシュ時間はユーザーが応答するたびに更新されます。各セッションの取得は 30 分延長されるため、キャッシュが期限切れになる可能性は比較的低くなります。
キャッシュの一貫性では、データの更新中にキャッシュされたデータをリアルタイムで更新できることが必要です。
解決策:
データが更新されたらすぐにキャッシュを更新します。まずキャッシュからの読み取りを試行し、データの読み取り後にすぐに戻ります。読み取れない場合は、データベースを読み取り、データを保存すると、キャッシュに書き込まれて返されます。
キャッシュを読み取る前に、キャッシュが最新かどうかを判断し、最新でない場合は更新を行い、データを更新する必要がある場合はデータベースを更新してから無効化(削除)します。キャッシュ内の対応するデータ。
3. キャッシュを大量に使用すると、キャッシュ サーバーに大きな負荷がかかります。Redis アクセスを減らす方法をお考えですか?
redis がインベントリを事前に削減する場合、isOvermap はメモリ マークとしてメモリに維持され、インベントリがない場合は true に設定されます。各フラッシュセール事業者がredisにアクセスする前にマップマークを確認し、trueの場合は在庫がないことを意味し、redisサーバーにリクエストせずに直接失敗を返します。
4. 同時リクエストが多いビジネス シナリオで、大量のリクエストの処理が遅すぎたり、リクエストが積み重なったりする場合はどうすればよいですか?
メッセージ キュー。リクエストを非同期に処理するために使用されます。リクエストが来るたびに、リクエストを処理するのではなくメッセージキューに入れ、バックグラウンドでリスナーを配置してさまざまなビジネスのメッセージキューをリッスンし、メッセージが来るとビジネスロジックが実行されます。 。これにより、複数のリクエストが同時に操作されるときに、過剰なデータベース接続の例外が発生するのを防ぎます。
5. ユーザーが繰り返し注文できないようにするにはどうすればよいですか?
解決策: フラッシュ セール注文テーブル (参照はユーザー ID と製品 GoodsId) に一意のインデックスを作成して、最初のレコードを挿入できるようにします。2 番目のレコードはエラーになり、その後ロールバックされます。トランザクションを通じて、ユーザーが同時に発行された複数のリクエストを処理し、複数の商品を即座に販売することを防ぎます。
ユニーク インデックスとは、一意であることを意味します。データベース テーブル構造内のフィールドに一意のインデックスを追加し、データベースでストレージ操作を実行した後、データベースは、データがデータベースにすでに存在するかどうかを判断します。データが存在しない場合に実行される挿入操作。
これは小さなスキルですが、実際にはビジネス開発において非常に実践的なスキルです。たとえば、同時実行性の高いビジネスにおいて、データが 2 つの同一の注文番号を同時に挿入することをデータベースはどのようにして防ぐことができるでしょうか?もちろん、一意のインデックスを追加するのが最も早い方法の 1 つです。もちろん、インデックスを追加するか、ビジネス コードで解決するかは、会社のビジネスによって異なります。
6. 売られすぎ現象を解決するにはどうすればよいですか?
売れすぎのシナリオ: さまざまなユーザーがリクエストを読んだときに、製品の在庫が十分であることがわかり、同時にリクエストを開始して在庫を減らすフラッシュセール操作を実行し、在庫が減少します。負の数に。
最も簡単な方法は、データベースを更新して在庫を減らし、在庫制限を実装することです。reduceStock(GoodsVo Goodsvo) メソッドで、SQL に Stock_count > 0 をもう 1 つ追加し、データベース機能を使用して売られすぎを確認します。つまり、stock_count が 0 より大きい場合にのみ、stock_count が読み取られて 1 減算されます。
@Update("update miaosha_goods setstock_count=stock_count-1 where Goods_id=#{goodsId} and Stock_count>0" )
public void reduceStock(MiaoshaGoods Goods);
7. ページの静的化のプロセスとブラウザのキャッシュとは何ですか?
HTML 静的ページをクライアント ブラウザにキャッシュします。データのみが Ajax 非同期呼び出しインターフェイスを通じて取得されます。データの一部のみが対話されるため、帯域幅が削減され、ユーザー アクセスが高速化されます。
ブラウザ キャッシュとは、要求された Web リソース (HTML ページ、画像、JS、データなど) のコピーをブラウザに保存することです。キャッシュは、受信リクエストに基づいて出力コンテンツのコピーを保持します。次のリクエストが来たとき、それが同じ URL であれば、キャッシュはキャッシュ メカニズムに従って、コピーを直接使用してアクセス リクエストに応答するか、リクエストをソース サーバーに再度送信するかを決定します。より一般的なのは、ブラウザが Web サイト上で訪問した Web ページをキャッシュすることです。URL アドレスに再度アクセスしたときに、Web ページが更新されていない場合、Web ページは再度ダウンロードされませんが、ローカルにダウンロードされます。キャッシュされた Web ページが直接使用されます。リソースが更新されたことが Web サイトで明確に識別された場合にのみ、ブラウザは Web ページを再度ダウンロードします。
8. フラッシュ セール アーキテクチャの設計コンセプトは?
現在の制限: インスタントキルに成功できるユーザーは少数であるため、ほとんどのトラフィックを制限する必要があり、トラフィックのごく一部のみがサービス バックエンドに入ることが許可されます。
フラッシュセール活動を行う場合、ラッシュセール開始と同時に大量のユーザーが殺到し、ピークタイムが発生します。したがって、ピークカット対策を講じる必要があります。ピーク時のトラフィックがシステムに負荷をかける重要な原因となるため、瞬間的なトラフィックの高さを一定期間安定したトラフィックに変える方法も、フラッシュ セール システムを設計する際の重要なアイデアです。ピーク クリッピングを実現するために一般的に使用される方法には、キャッシュやメッセージ ミドルウェアなどのテクノロジの使用が含まれます。
非同期処理: フラッシュ セール システムは同時実行性の高いシステムです。非同期処理モードを使用すると、システムの同時実行量が大幅に増加します。実際、非同期処理はピーク カットを実現する方法です。
メモリ キャッシュ: フラッシュ セール システムの最大のボトルネックは、一般にデータベースの読み取りと書き込みです。データベースの読み取りと書き込みはディスク IO に属するため、パフォーマンスが非常に低くなります。一部のデータまたはビジネス ロジックを転送できれば、メモリキャッシュの効率は非常に高くなります。
スケーラブル: もちろん、より多くのユーザーとより優れた同時実行性をサポートしたい場合は、システムを柔軟でスケーラブルに設計することが最善です。トラフィックが発生した場合は、マシンを拡張するだけです。タオバオや京東などのダブル イレブン イベント中は、取引のピークに対応するために多数のマシンが追加されます。
9. フラッシュ セール システム アーキテクチャの設計アイデアはありますか?
システムの上流でリクエストをインターセプトしてダウンストリームの圧力を軽減します: Flash Kill システムは大量の同時実行性を特徴としていますが、実際に成功した Flash Kill リクエストの数は非常に少ないため、そうでない場合はフロントエンドでインターセプトされると、データベースの読み取り/書き込みロックの競合が発生する可能性があり、最終的にはリクエストがタイムアウトになります。
キャッシュの使用: キャッシュを利用すると、システムの読み取りおよび書き込み速度が大幅に向上します。
メッセージ キュー: メッセージ キューは、ピークをカットし、多数の同時リクエストをインターセプトできます。これは非同期処理プロセスでもあります。バックグラウンド ビジネスは、メッセージ キューからリクエスト メッセージを積極的に取得し、そのメッセージ キューに基づいてビジネス処理を行います。独自の処理能力。
10. 在庫が減り、ユーザーが支払いをしない場合、どうすれば在庫を復元してラッシュ セールに参加し続けることができますか?
最大支払い時間を設定します (例: 30)バックグラウンドでスケジュールされたタスクがあり (タイマー タイマーを使用)、30 分を超える保留中の注文をローテーションして (注文のステータスはデータベースで決定されます)、注文をクローズして在庫を復元します。
以上がRedis プロジェクトのナレッジポイントは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Redisクラスターモードは、シャードを介してRedisインスタンスを複数のサーバーに展開し、スケーラビリティと可用性を向上させます。構造の手順は次のとおりです。異なるポートで奇妙なRedisインスタンスを作成します。 3つのセンチネルインスタンスを作成し、Redisインスタンスを監視し、フェールオーバーを監視します。 Sentinel構成ファイルを構成し、Redisインスタンス情報とフェールオーバー設定の監視を追加します。 Redisインスタンス構成ファイルを構成し、クラスターモードを有効にし、クラスター情報ファイルパスを指定します。各Redisインスタンスの情報を含むnodes.confファイルを作成します。クラスターを起動し、CREATEコマンドを実行してクラスターを作成し、レプリカの数を指定します。クラスターにログインしてクラスター情報コマンドを実行して、クラスターステータスを確認します。作る

Redisはハッシュテーブルを使用してデータを保存し、文字列、リスト、ハッシュテーブル、コレクション、注文コレクションなどのデータ構造をサポートします。 Redisは、スナップショット(RDB)を介してデータを維持し、書き込み専用(AOF)メカニズムを追加します。 Redisは、マスタースレーブレプリケーションを使用して、データの可用性を向上させます。 Redisは、シングルスレッドイベントループを使用して接続とコマンドを処理して、データの原子性と一貫性を確保します。 Redisは、キーの有効期限を設定し、怠zyな削除メカニズムを使用して有効期限キーを削除します。

Redis-Serverが見つからない問題を解決するための手順:インストールを確認して、Redisが正しくインストールされていることを確認します。環境変数Redis_hostとredis_portを設定します。 Redis Server Redis-Serverを起動します。サーバーがRedis-Cli pingを実行しているかどうかを確認します。

Redisのすべてのキーを表示するには、3つの方法があります。キーコマンドを使用して、指定されたパターンに一致するすべてのキーを返します。スキャンコマンドを使用してキーを繰り返し、キーのセットを返します。情報コマンドを使用して、キーの総数を取得します。

Redisバージョン番号を表示するには、次の3つの方法を使用できます。(1)情報コマンドを入力し、(2) - versionオプションでサーバーを起動し、(3)構成ファイルを表示します。

Redisソースコードを理解する最良の方法は、段階的に進むことです。Redisの基本に精通してください。開始点として特定のモジュールまたは機能を選択します。モジュールまたは機能のエントリポイントから始めて、行ごとにコードを表示します。関数コールチェーンを介してコードを表示します。 Redisが使用する基礎となるデータ構造に精通してください。 Redisが使用するアルゴリズムを特定します。

Redis指令を使用するには、次の手順が必要です。Redisクライアントを開きます。コマンド(動詞キー値)を入力します。必要なパラメーターを提供します(指示ごとに異なります)。 Enterを押してコマンドを実行します。 Redisは、操作の結果を示す応答を返します(通常はOKまたは-ERR)。

Redis Orderedセット(ZSET)は、並べ替えられた要素を保存し、関連するスコアでソートするために使用されます。 zsetを使用する手順には次のものがあります。1。zsetを作成します。 2。メンバーを追加します。 3.メンバースコアを取得します。 4。ランキングを取得します。 5.ランキング範囲のメンバーを取得します。 6.メンバーを削除します。 7.要素の数を取得します。 8。スコア範囲のメンバーの数を取得します。
