Redis クラスタのトランザクションを実装する方法

トランザクションのアトミックな操作はRedisクラスタではサポートされていません。これは、Redisクラスタが厳密な一貫性よりも高可用性と高パフォーマンスを設計目標としているためです。ただし、Redisクラスタでは、トランザクションに似た操作を実行するためのいくつかのメカニズムが提供されています。

MULTI コマンドと EXEC コマンドを Lua スクリプトと組み合わせてトランザクションを実現する方法が一般的です。MULTI コマンドがトランザクション開始、EXEC コマンドがトランザクションの実行を表し、Lua スクリプトは EXEC コマンド内で複数操作を実行できます。具体的な手順は以下のとおりです。

  1. マルチコマンドを使ってトランザクションを開始します。
  2. トランザクション内で実行する必要がある操作は、各種 Redis コマンドを使用して実行します。これらのコマンドは、EXEC コマンドが呼び出されるまでキャッシュされます。
  3. トランザクション実行にはEXECコマンドを使用します。トランザクション実行時にはRedisはバッファリングされたコマンドシーケンスを正しいノードに送信し、実行します。
  4. WATCHコマンドを使用すると、EXECコマンドを実行する前にキーを監視できます。指定されたキーが変更された場合、何も実行されずにトランザクションは中止されます。

Redisクラスタを用いてトランザクションライクな処理を実現する一例を次に示します:

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET key1 value1
QUEUED
127.0.0.1:6379> SET key2 value2
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) OK

ただし、Redisクラスタを利用してトランザクションに似たような操作を実現しても、アトミシティは保証されません。トランザクション実行中にクラスタのノードが障害を起こしたり、ネットワークが分割されたりして、トランザクションを正常に実行できない場合があるからです。そのため、厳密な一貫性とアトミシティを必要とする場合は、単一のRedisインスタンスや、分散トランザクションに対応した他のデータベースを使用することを検討してください。

bannerAds