Redisでトランザクションを実行する方法
はじめに
Redisはオープンソースのインメモリキーバリューデータストアです。Redisは、コマンドの連続を計画し、それらを一つずつ実行することができる、トランザクションと呼ばれる手続きを可能にします。各トランザクションは、データの整合性を保証するために、中断されることなく独立した操作として扱われます。トランザクションブロックが実行されている間、クライアントはコマンドを実行することはできません。
このチュートリアルでは、トランザクションの実行とキャンセル方法について説明し、またトランザクションに関連する一般的な落とし穴についても情報を提供します。
このガイドの使い方の説明方法
このガイドは、自己完結型の例を用いたチートシートとして書かれています。お使いのタスクに関連するセクションへ自由に飛ぶことをお勧めします。
このガイドで示されているコマンドは、Redisバージョン6.0.16を実行しているUbuntu 22.04サーバーでテストされました。同様の環境をセットアップするには、Ubuntu 22.04にRedisをインストールしてセキュリティを確保する方法に関する私たちのガイドのステップ1に従うことができます。これらのコマンドの動作を確認するために、redis-cli(Redisのコマンドラインインターフェース)を使用して実行します。例えば、別のRedisインターフェースであるRedliを使用している場合、特定のコマンドの出力は異なる場合があります。
次に述べる方法もあります。これらのコマンドをテストするためには、管理されたRedisデータベースインスタンスを用意することもできますが、データベースプロバイダが許可する制御レベルに依存して、このガイドに記載されている通りに一部のコマンドが動作しない場合もあります。Silicon Cloudの管理されたデータベースを用意するには、Managed Databasesの製品ドキュメントに従ってください。次に、Redliをインストールするか、TLSトンネルを設定してTLS経由で管理されたデータベースに接続する必要があります。
取引の実行
Redisに対してmultiコマンドを実行すると、トランザクションブロックを開始するよう指示します。その後のすべてのコマンドは、execコマンドを実行するまでキューに溜められ、実行されます。
以下のコマンドは1つのトランザクションブロックを形成します。最初のコマンドはトランザクションを開始し、2番目のコマンドは値が1の文字列を保持するキーを設定し、3番目のコマンドはその値を1増やし、4番目のコマンドはその値を40増やし、5番目のコマンドは現在の文字列の値を返し、最後のコマンドでトランザクションブロックを実行します。
- multi
- set key_MeaningOfLife 1
- incr key_MeaningOfLife
- incrby key_MeaningOfLife 40
- get key_MeaningOfLife
- exec
マルチを実行した後、redis-cliは以下の各コマンドに対してQUEUEDと応答します。execコマンドを実行した後、それらのコマンドの個別の出力が表示されます。
1) OK 2) (integer) 2 3) (integer) 42 4) “42”
トランザクションブロックに含まれるコマンドは、キューに入れられた順番に順次実行されます。Redisのトランザクションはアトミックであり、トランザクションブロック内のすべてのコマンドが処理されるか、あるいは一つも処理されないかのいずれかです。ただし、コマンドがキューに正常に入れられたとしても、実行時にエラーが発生する可能性があります。このような場合、トランザクション内の他のコマンドは実行されますが、エラーの原因となったコマンドはスキップされます。トランザクションエラーの理解については、詳細な説明を読んでください。
取引をキャンセルする
取引をキャンセルするには、廃棄コマンドを実行します。これにより、以前にキューに入れられたコマンドの実行が防止されます。
- multi
- set key_A 146
- incrby key_A 10
- discard
OK
「discard」コマンドは、Redisに通常の状態に戻すための接続を返します。これにより、Redisは通常通り単一のコマンドを実行するようになります。別のトランザクションを開始するために、再び「multi」を実行する必要があります。
トランザクションエラーの理解
構文エラーのあるコマンドなど、一部のコマンドはキューにすることができません。構文にエラーがあるコマンドをキューにしようとすると、Redisはエラーを返します。
次のトランザクションは、key_Aというキーを作成し、それを10増加しようと試みています。しかし、incrbyコマンドのスペルの誤りにより、エラーが発生し、トランザクションが終了します。
- multi
- set key_A 146
- incrbuy key_A 10
(error) ERR unknown command ‘incrbuy’
もしも例のように構文エラーのあるコマンドをキューに入れようとしてから実行コマンドを実行しようとすると、トランザクションは破棄されたというエラーメッセージが表示されます。
- exec
(error) EXECABORT Transaction discarded because of previous errors.
このような場合は、トランザクションブロックを再起動し、各コマンドを正しく入力する必要があります。
いくつかの不可能なコマンドは、キーに文字列のみを含んでいる場合でもキューに保存することが可能です。このようなコマンドは構文的に正しいため、Redisはトランザクションに含めようとしてもエラーを返さず、execを実行することを防ぎません。このような場合、キュー内の他のコマンドは実行されますが、不可能なコマンドはエラーを返します。
- multi
- set key_A 146
- incrby key_A “ten”
- exec
1) OK 2) (error) ERR value is not an integer or out of range
トランザクション内でのRedisのエラー処理についての詳細な情報は、その件に関する公式ドキュメントをご覧ください。
結論
このガイドでは、Redisでトランザクションを作成、実行、キャンセルするために使用するいくつかのコマンドについて詳しく説明しています。もしこのガイドで他の関連するコマンドや引数、手順について知りたいことがあれば、コメントで質問や提案をお願いします。
Redisコマンドに関する詳細情報については、当社のRedisデータベースの管理方法に関するチュートリアルシリーズをチェックしてください。