


モデレーターの呼びかけに応えて、入門的な教育記事をいくつか投稿します。Redis のマスター/スレーブ レプリケーション プロセスと、オンライン ビジネスでバグの原因となった私が発見した目立たない機能について簡単に説明します。
モデレーターの呼びかけに応えて、入門的な教育記事をいくつか投稿したいと思います。Redis のマスター/スレーブ レプリケーション プロセスと、オンライン ビジネスでバグの原因となった私が発見した目立たない機能について簡単に説明します
前に書きます:
PHP とは直接関係はありませんが、現在では redis が非常に主流になっており、効率が低いことに不満を持ちながらもリアルタイムで mysql をチェックしている人を多く見かけます。そこで、redis を導入しましょう。結局のところ、それはディスクよりも読み書き速度が n 段高く、mysql、mongo、cassandra よりも学習コストがはるかに低いです。ぜひ試してみる価値があります。
初心者の場合は、Redis の同期方法を詳しく調べて概要を把握することができます。
あなたが古い Redis ユーザーであれば、その詳細は非常に目立たないことですが、将来的には実際に影響を与える可能性があることを思い出させてください。
この記事は Redis に関するチュートリアル記事でも、詳細な Redis ソース コード分析の中核原則の紹介でもありません。私は皆さんに、特別な観点から redis の利点と注意すべき点を見てもらいたいと思っています。今後、必要に応じて、redis の使用方法やパラメータ設定などの詳細を中心に紹介していきます。 Linux C に精通し、ソース コードの解析が得意な専門家に比べれば、私はまだ初心者です。間違いがあれば、直接指摘していただければ幸いです。
redis データの永続化には 2 つのオプションがあります:
1 aof ファイルの書き込み
2 スナップショット rdb ファイルの書き込み
両方が実行される場合同時に開くと、redis は起動後にまず aof ファイルからデータを回復しようとします。さらに、マスター/スレーブの場合、redis はスレーブからマスターに aof ファイルをプルして、マスター/スレーブの同期を実現します。
スナップショット rdb については説明しません。ここでは主に aof について説明します。 redis でコマンドを実行すると、redis は aof ファイルに追加します。
まず、このマシン上で 2 つの Redis サーバーを開き、1 つはマスターとしてポート 12345 をリッスンします。もう 1 つはポート 12346 でリッスンし、スレーブとして機能します。
次に、redis-cli は redis-server マスターに接続し、テスト用の値を書き込みます:
同様に、再度 redis-cli に接続します。サーバースレーブでは、この値が同期されていることがわかります。
次に、master と redis の aof ファイルを見てみましょう。完全に一貫していることがわかります。
マスター:
スレーブ:
ここで、この mytestkey をマスターから削除します。これにより、aof ファイルも書き込まれ、同期されます。スレーブに。マスターで
を実行して、スレーブの aof ファイルを表示します。最後の 3 行が同期されていることに注意してください。
これは、Redis のマスター/スレーブ同期の基本原理です。
redis で実行されたコマンドは aof ファイルに書き込まれ、マスターで実行されたコマンドは aof ファイルをスレーブに同期します (正確には、スレーブはマスターに同期コマンドを送信して aof ファイルをプルします)。
ただし例外もあります:
新しいキーを作成して削除しただけなので、ライブラリには何もないはずです。この時点で削除すると、存在しないキーを削除したことと同じになり、redis は (整数) 0 を返します。 lushdb はデータベースをクリアする操作であり、データベースにデータがあるかどうかに関係なく、ok を返します。
では、ライブラリにデータがない場合、これら 2 つのコマンドは aof ファイルに書き込まれて同期されるのでしょうか?
答えは「いいえ」です。del mytestkey への書き込みは 2 回目ではなく、flushdb への書き込みも行いません。また、aof ファイルはスレーブに同期されません。
なぜこのことを申し上げたいかというと、このような性質上、一昨日ネットビジネスで重大なバグが発生したからです。私たちのオンライン ビジネスは、複数の php Web サーバーと複数の Redis で構成されています。 Redisにも主従関係があり、主従関係は一方向のリンクリスト構造を採用しています。つまり、マスター -> スレーブ -> スレーブ -> スレーブ... マスターは、スレーブが必要とするすべてのパブリック データを保存します。 PHP Web サーバーは Redis スレーブを読み取るため、各スレーブは独自の一意のキャッシュを書き込む必要があります。これは完璧に思えます。Redis の負荷分散が実現され、メモリ データの冗長性が回避されます。キャッシュの冗長性を避けるため。また、キャッシュ キーの競合を避けるために (実際、これはキー プレフィックスを追加するだけで簡単に解決できます)、これはマスターとスレーブの同期、つまりデータの一貫性の中心概念に違反します。各 PHP Web サーバーは、対応するサーバーにデータを送信し、データを書き込みます。奴隷。結局のところ、キャッシュはキャッシュです。これらのキャッシュは、設定時にキーの有効期限を設定しませんでした。代わりに、イベント駆動型のアプローチを使用して、すべてのマシンのキャッシュを一度にクリアします。
Redis 内のすべてのパブリック データを更新するための一連のスクリプトが毎晩あります。パブリック データとキャッシュは別のパーティションに保存されます。パブリック データがライブラリ 0 に保存されている場合、キャッシュはライブラリ 1 に保存されます。 。
select 0
flushdb
select 1
flushdb
をマスターに対して実行します
次の問題は、マスターのキャッシュ パーティション 1 ライブラリにデータがないためです。したがって、このflushdbは実際にはローカルのaofファイルに書き込みませんし、各スレーブと同期しません。その結果、キャッシュがまったくクリアされず、翌日データが更新されないというバグが発生しました。ここでモニターを設定しなかったのですが、翌日、複数の部門から質問を受けました。問題があったので、その理由を見つけるのに午後かかりました。イートンに非難される。 。 。 。
解決策も非常に簡単です:
A マスターに均一にデータを書き込むように変更します
B スクリプトが夜間にマスター上のキャッシュ パーティションをクリーンアップするときに、最初にキーをランダムに設定し、次に、flushdb
を実行します。データの冗長性を回避し、怠惰にするため (変更が最小限になるように)、プラン B を採用しました。
最後に、真相を解明するために、redis のソース コードを調べたところ、確かに aof モジュールに段落があることがわかりました。これは、おそらく del やフラッシュdb などのコマンドを実行するときに、リリースするものがないことがわかったので、このコマンドを aof ファイルに追加するように報告しませんでした。また、info やmonitor などデータに影響を与えない監視関連のコマンドは aof ファイルに書き込まれません。
------解決策---------
Mysqlのメモリテーブルの使い方、よくわかりました ギャップメモリとハードディスク間のデータ読み取りの間は、基本的には memcache
-----解決策----- - ---
良い点
-----解決策---------
ハイチャンは良いです、理解してください。 。 。
------解決策------------------
気に入っていただければ、PHP プログラミングを学びたいと思っています
-----解決策---------
- -----解決策---------------------
----- -解決策 --------------------
サポート :)
-----解決策----- - ----------------
シャドウスナイパー兄弟、ありがとう!
------解決策-----
共有していただきありがとうございます
- -----解決策------------------
通りすがりのphp初心者
-----解決策 - -------------------
悪くない、それについて学ぶチャンスがある
-----解決策- --- ----------------
わかりました、共有してくれてありがとう!
------解決策---------
上部の小さなクリック
------解決策----------------------
わかりました、共有してくれてありがとう!

ホット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データをクリアする方法:Flushallコマンドを使用して、すべての重要な値をクリアします。 FlushDBコマンドを使用して、現在選択されているデータベースのキー値をクリアします。 [選択]を使用してデータベースを切り替え、FlushDBを使用して複数のデータベースをクリアします。 DELコマンドを使用して、特定のキーを削除します。 Redis-CLIツールを使用してデータをクリアします。

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

Redisは、単一のスレッドアーキテクチャを使用して、高性能、シンプルさ、一貫性を提供します。 I/Oマルチプレックス、イベントループ、ノンブロッキングI/O、共有メモリを使用して同時性を向上させますが、並行性の制限、単一の障害、および書き込み集約型のワークロードには適していません。

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

Redisを使用して操作をロックするには、setnxコマンドを介してロックを取得し、有効期限を設定するために有効期限コマンドを使用する必要があります。特定の手順は次のとおりです。(1)SETNXコマンドを使用して、キー価値ペアを設定しようとします。 (2)expireコマンドを使用して、ロックの有効期限を設定します。 (3)Delコマンドを使用して、ロックが不要になったときにロックを削除します。

Redisのキューを読むには、キュー名を取得し、LPOPコマンドを使用して要素を読み、空のキューを処理する必要があります。特定の手順は次のとおりです。キュー名を取得します:「キュー:キュー」などの「キュー:」のプレフィックスで名前を付けます。 LPOPコマンドを使用します。キューのヘッドから要素を排出し、LPOP Queue:My-Queueなどの値を返します。空のキューの処理:キューが空の場合、LPOPはnilを返し、要素を読む前にキューが存在するかどうかを確認できます。

Redisは、メッセージミドルウェアとして、生産消費モデルをサポートし、メッセージを持続し、信頼できる配信を確保できます。メッセージミドルウェアとしてRedisを使用すると、低遅延、信頼性の高いスケーラブルなメッセージングが可能になります。
