1. ホーム
  2. データベース
  3. レディス

Redisトランザクション処理の使用方法

2022-01-22 10:58:22

I. はじめに

        Redisは トランザクション制御のための楽観的ロックアプローチ Redisはwatchコマンドで指定したキーを監視し、exec(トランザクションのコミット)時に、監視していたキーがwatchの呼び出し後に変更された場合、トランザクション全体が失敗します。なお、ウォッチキーは接続中ずっと有効であり、接続が切れるとウォッチとトランザクションは自動的にクリアされます。もちろん、exec、discard、unwatchコマンドは、接続からすべてのウォッチをクリアします。

        Redisは、トランザクション内のすべてのコマンドが実行されるかどうか(アトミック性)を保証しています。EXECコマンドが送信される前にクライアントが切断された場合、Redisはトランザクションキューをクリアし、トランザクション内のすべてのコマンドは実行されません。クライアントがEXECコマンドを送信すると、その後クライアントが切断されても、実行されるべきコマンドはすべてRedisに記録されているため、すべてのコマンドが実行される。

よくあるコマンド

  • multi トランザクションを開く
  • トランザクションのコミットを実行する
  • 廃棄 トランザクションをキャンセルする
  • watchは監視し、監視した値が変更された場合、トランザクションのコミットを失敗させます。
  • アンウォッチ 監視を解除する

2つ目は、使用方法をシミュレートすることです。

転送操作のシミュレーション

 トランザクションが開かれると、すべての操作はキューに入れられ、コミット時に一緒に実行されます。

トランザクションのキャンセルをシミュレートする

Redisのトランザクションはシンプルすぎて、ロールバックはなく、キャンセルのみです。

キュー内のステートメントにエラーがある場合、トランザクションは自動的にキャンセルされる

 最適化されたロック使用法のデモ

        Optimistic Lockは、その名の通り非常に楽観的で、データを取りに行くたびに、誰も修正しないと思っているのでロックせず、その間は誰でもデータを読むことができますが、更新するときは、その間に誰かが更新したかどうかを判断するので、バージョン番号などの仕組みを利用することができます。
        バージョン番号機構は楽観的ロックの最も一般的な方法で、テーブルにバージョン番号のフィールドを追加し、更新前にバージョン番号を取得するために再度チェックし、更新文のWhere条件として更新し、バージョン番号を取得した後に更新前にデータが変更されている場合は、最後の更新は0データなので、更新は失敗します、javaバックグラウンドは更新番号が0であれば取得、並行処理の問題がある、その後特定の処理を行うことです。

1. テストデータ文の追加

監視をオンにして、トランザクションをオンにして、ステートメントを実行する

 2. データを変更するために別のredisを起動する

 3. 最初のデータベースコミットトランザクションを返す

ここで、実行トランザクションが失敗したことがわかります。

 3、チケットの練習をつかむための楽観的なロック秒数

/* Implement a simple multi-threaded ticketing operation based on reids
* Focus on the application of delayed optimistic locking */
public class SecondsKillDemo02 {
    //Define the logic of the ticket grabbing
    public static void KillTicket() {
        //1. Connection
        Jedis jedis = JedisDataSource.getConnection();
        / / 2. Monitor the key specified in the reids
        String a = jedis.get("a");
        if (a == null || Integer.valueOf(a) == 0)
            throw new RuntimeException("Out of tickets");
        jedis.watch("a", "b");
        //3. Open the transaction to execute the business
        Transaction multi = jedis.multi();
        try {
            multi.decr("a");
            multi.incrBy("b", 100);
            //4. Commit the transaction
             multi.discard();
            System.out.println("ok");
        } catch (Exception e) {
            multi.exec();
        } finally {
            //5. Unwatch
            jedis.unwatch();
            //6. release
            jedis.close();
        }
    }
 
    public static void main(String[] args) {
        //1. Define the initial data
        Jedis jedis = JedisDataSource.getConnection();
        jedis.set("a", "1");
        jedis.set("b", "0");
        //2. Create multiple threads and execute ticketing in threads
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                KillTicket();
            }
        });
        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                KillTicket();
            }
        });
        t1.start();
        t2.start();
 
    }
}

Redisトランザクションに関する記事は以上です。Redisトランザクションの詳細については、Script Houseの過去の記事を検索するか、以下の記事を引き続きご覧ください。