2016-10-14 15 views
0

私はredisでいくつかの混乱があります。私は自己学習のレディスです。内部処理のRedis要求

私はredisがシングルスレッドであり、イベントループのコンセプトで動作することを知っておく必要があります。したがって、読み取り/書き込み操作は赤字でシリアル化され、競合状態はありません。

混乱は、シングルスレッドアーキテクチャについて純粋に考えてみると、すべての読み取り/書き込み要求が集まり、スレッドが1つずつスケジューリングするバッファがあることが想像できます。しかし、何千も何百万というリクエストが処理される現実のインターネットアプリケーションでは、どのようにしてレディスが大きな待ち時間なしにこれらのリクエストを処理しますか?いくつかの書き込み操作が数ミリ秒の時間を要する場合、その期間中に他の読み取り書き込み操作をブロックしますか?

redisはリレーショナルデータベースのようなロック概念を実装していますか?いいえの場合、どのようにしてredisが何千もの読み取り/書き込みをどのように処理するのですか?

私の今後の研究には、どのような内部構造や例も良いでしょう。

答えて

1

Redis社の内部についてのご理解は非常に正しいです。ロッキングシステムはありません。すべての操作はアトミックでブロックされます。

Redisを使用する場合の推奨事項は、長いものではなく複数の短い要求を行うことです。大量のキーや大規模なデータ構造を扱う場合は、リクエストを書くときにRedis Commandsのドキュメントに記載されている時間の複雑さを考慮してください。 KEYSコマンドを使用しないでください。SCANファミリのコマンドを使用することをお勧めします。 EVALコマンドを使用してRedisに送信されるLuaスクリプトを書くときはさらに注意してください。

各リクエストの実行時間が非常に短い場合、ほとんどのユースケースでは、Redisコマンドは特定のコマンドの実行中に他のコマンドに応答しないという事実によって、クライアントは影響を受けません。

ほとんどの場合、制限要因はRedis自体ではなく、ネットワークです。

しかし、場合によっては、Redisの制限(非常に高い)にぶつかることがあります。このような場合は、multiple Redis instancesをマスタスレーブモード(レプリケーション、Redis Sentinel)で使用し、要求を読み込むためにインスタンス間で何らかの負荷分散を行うことができます。いくつかのRedisインスタンスの前にtwemproxyのようなツールを使用することもできます。

関連する問題