Redis は、multi、exec、discard、watch を通じてトランザクション関数を実装します。
multi: トランザクションの開始
exec: トランザクションをコミットして実行
discard: トランザクションをキャンセル
watch: トランザクションの開始前に任意の数のキーを監視します
> multi OK > set bookName "Redis" QUEUED > get bookName QUEUED > sadd tag "Redis" "New Book" QUEUED > smembers tag QUEUED > exec 1) OK 2) "Redis" 3) (integer) 2 4) 1) "Redis" 2) "New Book"
> multi OK
このコマンドは、 Redis_multi オプション、クライアントを非トランザクション状態からトランザクション状態に変更させます
> set bookName "Redis" QUEUED > get bookName QUEUED > sadd tag "Redis" "New Book" QUEUED > smembers tag QUEUED
Redis コマンドはすぐには実行されませんが、まず、トランザクションがコミットされるまで、トランザクション キューから高度な First に入ります。 QUEUED は、このコマンドがトランザクション キューに入ったことを示します。
> exec 1) OK 2) "Redis" 3) (integer) 2 4) 1) "Redis" 2) "New Book"
exec コマンドを実行すると、Redis はクライアントによって保存されたトランザクション キューに従って先入れ先出し方式でトランザクション キュー内のコマンドを実行します。キューに入れられる最初のコマンド 最初に実行され、キューに入れられた最後のコマンドが最後に実行されます。 exec コマンドの実行後、Redis は結果を応答キューに保存し、キューをクライアントに送信します。クライアントはトランザクション状態を終了し、トランザクションが完了します。
> multi OK > set author "lisi" QUEUED > discard OK > get author (nil)
discard は、トランザクションをキャンセルするコマンドで、トランザクションがキャンセルされたことを示します。クライアントがトランザクション状態を終了して非トランザクション状態に戻る場合は、Redis_multi オプションをオフにする必要があります。
# Redis 客户端1 > watch letter OK > multi OK > set letter a QUEUED > exec (nil) # Redis 客户端2 > set letter b OK # Redis 客户端1 > get letter "b"
クライアント 1 がトランザクションに入ると、ウォッチは文字キーを設定し、その値を a に設定しますが、トランザクションはまだ開始されていません。提出する。クライアント 2 は、文字の値を b に設定します。クライアント 1 がトランザクションをコミットした後、返される結果は nil ですが、get コマンドを呼び出すと、letter の値が b として取得できます。これは、文字キーが別のクライアントによって変更されると、トランザクションはキャンセルされ、実行されず、失敗することを意味します。
watch コマンドは、トランザクションが開始される前に任意の数のキーを監視します。トランザクションを実行するために Excel コマンドを呼び出すときに、監視されているキーのいずれかが他のクライアントによって変更されている場合、トランザクション全体は実行されなくなります。直接戻ります。失敗します。
> set letter ac QUEUED > get letter ac (error) ERR wrong number of arguments for 'get' command > exec (error) EXECABORT Transaction discarded because of previous errors.
トランザクション内のコマンド例外は構文エラーであり、トランザクションが失敗します。実行されました。
> multi OK > lpush books "Redis" QUEUED > incr books QUEUED > lpush books "Python" QUEUED > lrange books 0 -1 QUEUED > exec 1) (integer) 1 2) (error) WRONGTYPE Operation against a key holding the wrong kind of value 3) (integer) 2 4) 1) "Python" 2) "Redis"
上の例は、文字列に対して incr コマンドを実行できないため、トランザクションの実行中にエラーが発生したことを示しています。 、後続 コマンドは実行を継続するため、books の値は引き続き設定されます。この例外は、プログラマがコード内でのみ回避できます。
アトミックとは、トランザクションが一緒に正常に実行されるか、一緒に失敗してロールバックされるかのいずれかを意味します。 Redis が提供するすべての API はアトミック操作です。この場合、Redis トランザクションは、一連の操作のアトミック性を保証するだけで済みます。ただし、実行時例外の場合、トランザクション内のコマンドで例外が発生した場合、他のコマンドは実行され続けます。ロールバック メカニズムはありません。したがって、Redis トランザクションがアトミックであることは保証されていません。
トランザクション例外
コマンドエラーが発生した場合、トランザクションは実行できません。実行時例外の場合、Redis は戻り結果にエラーを含めます。以降の実行には影響しないため、トランザクションは一貫しています。
Redis プロセスが終了します
ピュア メモリ モードでは、Redis は永続化を実行せず、再起動後はデータベースが空になるため、トランザクションの一貫性が保たれます。
RDBモードでは、トランザクションは途中でRDBファイルを保存する作業を行わず、トランザクションが完了して初めてRDB作業が開始される場合があります。そのため、トランザクション実行中にRedisのプロセスが強制終了され、どんなに成功してもRDBファイルには保存されないので一貫性が保たれます。
AOF モードでは、トランザクション ステートメントの一部が AOF ファイルに書き込まれ、正常に保存されます。不完全なトランザクションは AOF ファイルに保存されます。Redis を再起動するときに、AOF ファイルが不完全であることを確認し、Redis が終了します。エラー。この不完全なトランザクションは、再起動が成功する前に削除する必要があるため、一貫性が保たれます。
AOF モードでは、トランザクションは AOF ファイルに書き込まれないため、Redis データベースの再起動後、最新のデータが AOF ファイルに正常に保存されます。このトランザクションにはデータがないため、一貫性があります。
Redis は単一プロセス プログラムであり、トランザクションの実行時にトランザクションが中断されないことが保証されており、トランザクション キュー内のすべてのコマンドが実行されるまでトランザクションを実行できます。したがって、トランザクションは分離されます。
ピュア メモリ モードでは、トランザクションは明らかに永続的ではありません。
RDB モードでは、トランザクション実行後 RDB ファイルが更新されるまでの間にサーバーがダウンする可能性があるため、RDB モードのトランザクションは永続的ではありません。
AOF モードでは、コマンドを AOF ファイルに追加しますが、ファイルの書き込みはすぐにディスクに書き込まれず、最初にバッファーに保存されます。したがって、データがディスクに保存される間隔は非常に短くなります。このモードのトランザクションも耐久性がありません。
以上がRedis トランザクション インスタンスの分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。