Redisトランザクション処理の使用方法
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の過去の記事を検索するか、以下の記事を引き続きご覧ください。
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Redisクラスタのマスターノードとスレーブノードを縮小する詳細チュートリアル
-
redis分散ロックについて解説(redis分散ロックの最適化処理とRedissonの利用について)
-
Redisの重複排除の3つの手法のまとめ
-
Redisにおけるビットマップの説明
-
redis クラスタの実装は同じプレフィックスを持つキーをクリーンアップします。
-
インタビューFAQです。Redisキャッシュとデータベース間のデータ整合性を確保する方法
-
Redis 高効率化の理由とデータ構造の解析
-
Redisによる分散シングルナンバーと分散ID(カスタムルール生成)
-
Redisの分散ロックについて簡単に説明します
-
Redis の例外と使用法のまとめ