Redis質疑応答

1436 ワード

Q 1:redisは単一スレッドですが、なぜコンカレントの問題があるのでしょうか.
A:redisは単一スレッドで、単一コマンド実行時に同時問題は発生しません.しかし、例えばi++操作では、アプリケーションにマルチスレッドが採用されている場合、同時問題が発生します.
Q 2:redisは単一スレッドですが、同時要求をどのように処理しますか?
A:redisはIO多重化を用いて同時要求を処理し,複数のclient要求をキューに格納し,イベントポーリング方式で要求を処理する.
Q 3:redisトランザクションの処理方法
A:redisはMulti,Execを用いてトランザクションを実現します.Multiはトランザクションの開始を識別し、Execはコマンドを実行します.redisのトランザクションは、一連の命令の間に他の命令が挿入されないことを保証します.操作エラーが発生した場合、ロールバックは実行されません.トランザクションが実行されると、他のクライアントのリクエスト実行がブロックされます.
Q 4:redisのwatch命令とトランザクションの違いは?
A:i++操作は単一のステップに分けられる:1、val=get i;2、val=val+1;3、set i.i=1を仮定すると、複数の接続が同時に第1のステップを実行する場合、操作実行が終了すると、iは所望の3ではなく、2である可能性が高い.このような状況に対して単純にMultiを用いると,Execは期待される結果を得ることができない.Watchコマンドは、CAS(check-and-set)機能を提供するために使用できます.Watchコマンドを使用して、トランザクションの実行前に複数のKeysを監視したとします.Watchの後にキーの値が変化した場合、Execコマンドが実行するトランザクションは破棄され、Null multi-bulk応答に戻って呼び出し元のトランザクションの実行に失敗したことを通知します.例:
WATCH i
val = GET i
val = val + 1
MULTI
SET i $val
EXEC

iの値を取得する前にWATCHコマンドでキーを監視し、その後setコマンドをトランザクションに囲みます.これにより、各接続がEXECを実行する前に、現在の接続で取得したiの値が他の接続のクライアントによって変更された場合、現在接続しているEXECコマンドが失敗することを効果的に保証できます.これにより、呼び出し者は、戻り値を判断した後、valが再設定されたかどうかを知ることができる.
Q 5:redisは単一スレッドですが、マルチコアマシンではどのように使用しますか?
A:master-slave形式を構成する複数のredisインスタンスを実行できます.
Q6:master-slave
1、masterは複数のslave 2を持つことができ、複数のslaveは同じmasterに接続することができるほか、他のslave 3に接続することができ、主従レプリケーションはmasterをブロックしない.データを同期する時、masterはclient要求4を処理し続けることができ、システムの伸縮性を高めることができる