Redis トランザクションは ACID をサポートしていますか?次の記事では、Redis トランザクションを理解し、Redis がトランザクションを実装する方法を紹介し、Redis トランザクションが ACID をサポートしているかどうかについて説明します。
Tencent インタビュアー:「Redis のトランザクションを理解していますか?そのトランザクション メカニズムは ACID プロパティを実装できますか?」
Cheng Xuyuan : 「頭をかきむしります、これは...Lua スクリプトでトランザクションを実装できることは知っています...」
Tencent 面接官:「わかりました。戻って通知を待ちます。」
Code Brother さん、たくさんのオファーをいただきましたが、「Redis はトランザクションをどのように実装するのか?」という質問で最終的に負けるとは予想していませんでした。
ステップごとに分析してみましょう:
トランザクション ACID とは何ですか?
Redis はトランザクションをどのように実装しますか?
Redis トランザクションはどのようなプロパティを実現できますか?
Lua スクリプトの実装。
事態のACIDとは何ですか
ゴースト・ブローイング・ザ・ランプの「雲南ワーム・バレー」のキャプテン・モジンには、「ルール」という言葉があります。 「生、分断、死。」 ムーヘンビーズを見つけるために、三人は明確な役割分担を持ち、力を合わせて前進と後退を成功させた。
トランザクションは同時実行制御の単位であり、一連の操作で構成され、これらの操作がすべて実行されるか、まったく実行されません。 [関連する推奨事項:Redis ビデオ チュートリアル ]
「これは分割できない作業単位です。」 トランザクションが実行されると、特別な属性保証が提供されます:- アトミック性: トランザクションの複数の操作が完了するか、どれも完了しない必要があります ( ps: MySQL はどのようにして原子性を実現しますか? メッセージ領域へのコメントは歓迎です);
- 一貫性 (一貫性): トランザクションの実行が完了した後、データベースの整合性制約はまだ解除されていません。破棄され、トランザクションの実行前後の順序はすべて正当なデータ状態になります。 データベースの整合性制約には次のものが含まれますが、これらに限定されません:
- エンティティの整合性 (行の主キーが存在し、一意であるなど);
- 列の整合性 (フィールドなど、タイプ、サイズ、長さが要件を満たしている必要があります)
- 外部キー制約;
- ユーザー定義の整合性 (たとえば、2 つのバランスの合計など)アカウントは転送の前後で変更されない必要があります)。
- #分離: トランザクション内の操作は他のトランザクションから分離されており、同時に実行されるトランザクションは相互に干渉できません。 は異なるトランザクション間の相互作用に焦点を当てており、厳密な分離は分離レベルのシリアライズ可能 (Serializable) に相当します。
- 耐久性: トランザクションがコミットされると、すべての変更はデータベースに永続的に保存され、システムがクラッシュして再起動されてもデータは失われません。
# Ma 兄弟、ACID の特定の要件を理解した後、Redis はトランザクション メカニズムをどのように実装しますか?
Redis によるトランザクションの実装方法
MULTI,EXEC,DISCARD andWATCH このコマンドは、Redis がトランザクションを実装するための基礎となります。
Redis トランザクションの実行プロセスは 3 つのステップで構成されます:- トランザクションの開始;
- コマンドのエンキュー;
- トランザクションを実行するか破棄する;
トランザクションを明示的に開始する
顧客最後は、MULTI コマンドを通じてトランザクションを開くことを明示的に示しており、後続のコマンドはキューに入れられてキャッシュされ、実際には実行されません。
コマンドのキューイング
クライアントは、トランザクションで実行される一連の命令をサーバーに送信します。 命令はサーバーに送信されますが、Redis インスタンスはこの一連の命令をコマンド キューに一時的に保存するだけで、すぐには実行されないことに注意してください。トランザクションの実行または破棄
クライアントは、トランザクションを送信または破棄するコマンドをサーバーに送信し、送信されたコマンドを Redis に実行させます。 2 番目のステップでは、特定の命令またはキューのクリア コマンドによって実行が中止されます。 Redis は、EXEC を呼び出すときにキュー コマンドの実行をスケジュールするだけで済みます。
DISCARD を使用して、2 番目のステップでキューに保存されたコマンドを破棄することもできます。
Redis トランザクションのケース
オンライン デバッグ Web サイトを通じてサンプル コードを実行します: try.redis.io
通常の実行
Through MULTI
と EXEC
はトランザクション プロセスを実行します:
# 开启事务 > MULTI OK # 开始定义一些列指令 > SET “公众号:码哥字节” "粉丝 100 万" QUEUED > SET "order" "30" QUEUED > SET "文章数" 666 QUEUED > GET "文章数" QUEUED # 实际执行事务 > EXEC 1) OK 2) OK 3) OK 4) "666"
各読み取りおよび書き込み命令の実行後の戻り結果は QUEUED
であることがわかります。これはありがとうを意味します。この操作はコマンド キューに一時的に保存され、実際には実行されません。
EXEC
コマンドを実行すると、各コマンドの具体的な応答データを確認できます。
トランザクションの破棄
MULTI
および DISCARD
によるキュー コマンドの破棄:
# 初始化订单数 > SET "order:mobile" 100 OK # 开启事务 > MULTI OK # 订单 - 1 > DECR "order:mobile" QUEUED # 丢弃丢列命令 > DISCARD OK # 数据没有被修改 > GET "order:mobile" "100"
Brother Code、Redis トランザクションは ACID プロパティを保証できますか?
これは良い質問です。一緒に分析しましょう。
Redis トランザクションは ACID を満たしていますか?
Redis トランザクションは一度に複数のコマンドを実行でき、次の 3 つの重要な保証があります:
バッチ コマンドが実行されるEXEC コマンドは一時記憶域のキューに入れられます。
EXEC コマンドを受信した後、トランザクションの実行に入ります。トランザクション内のいずれかのコマンドが実行に失敗した場合、残りのコマンドは実行されません。
トランザクションの実行中、他のクライアントによって送信されたコマンドは、現在のコマンド実行シーケンスに挿入されません。
Atomicity
コード兄弟、トランザクション実行中にエラーが発生した場合、アトミックなパフォーマンスが保証されます?
トランザクション中に、2 種類のコマンド エラーが発生する可能性があります。
-
EXEC
コマンドを実行する前に、コマンド自体が正しくありません。次のように:- パラメータの数が間違っています;
- コマンド名が間違っており、存在しないコマンドが使用されています;
- メモリ不足 (Redis インスタンスが構成されています)
maxmemory
ディレクティブのメモリ制限を使用します)。
-
EXEC
コマンドの実行後、コマンドが失敗する場合があります。たとえば、コマンドと操作のデータ型が一致しません (List リスト操作は String 型の値に対して実行されます); - トランザクションの
EXEC
コマンドを実行するとき。 Redis インスタンスで障害が発生し、トランザクションの実行が失敗しました。
EXEC は実行前にエラーを報告します
コマンドがキューに入れられると、Redis は エラーを報告し、エラーを記録します。
現時点では、 は引き続きコマンド操作を送信できます。
EXEC
コマンドが実行されると、Redis は 送信されたすべてのコマンド操作の実行を拒否し、トランザクション失敗の結果を返します。
このようにして、トランザクション内のすべてのコマンドは実行されなくなり、アトミック性が確保されます。
#次は、コマンドのキューイングでエラーが発生し、トランザクションが失敗する例です。#开启事务 > MULTI OK #发送事务中的第一个操作,但是Redis不支持该命令,返回报错信息 127.0.0.1:6379> PUT order 6 (error) ERR unknown command `PUT`, with args beginning with: `order`, `6`, #发送事务中的第二个操作,这个操作是正确的命令,Redis把该命令入队 > DECR b:stock QUEUED #实际执行事务,但是之前命令有错误,所以Redis拒绝执行 > EXEC (error) EXECABORT Transaction discarded because of previous errors.
EXEC が実行後にエラーを報告します
Transaction オペレーションがキューに登録されている コマンドとオペレーションのデータ型が一致しない場合、Redis インスタンスはエラーを検出しません。 ただし、EXEC コマンドの実行後、これらの命令を実際に実行すると、Redis はエラーを報告します。黒板をノックする: Redis は間違った命令のエラーを報告しますが、トランザクションは依然として正しいコマンドを実行します。現時点では、トランザクションのアトミック性は保証できません。
Ma 兄弟、なぜ Redis はロールバックをサポートしないのですか?実際、Redis にはロールバック メカニズムが提供されていません。 Redis は DISCARD コマンドを提供しますが。 ただし、このコマンドはトランザクションの実行を積極的に放棄し、一時コマンド キューをクリアするためにのみ使用でき、ロールバックの効果はありません。
EXEC を実行するとエラーが発生します
Redis が AOF ログをオンにすると、トランザクション操作の一部のみが AOF ログに記録されます。 AOF ログ ファイルを確認するには、redis-check-aof ツールを使用する必要があります。このツールは、AOF ファイルから未完了のトランザクション操作を削除できます。 このように、AOF を使用してインスタンスを復元すると、トランザクション操作は実行されなくなり、アトミック性が確保されます。簡単な概要:
- コマンドがキューに入れられるとエラーが報告され、アトミック性を確保するためにトランザクションの実行は中止されます。
- コマンドがキューに入れられたとき エラーは報告されませんが、実際の実行中にエラーが報告され、アトミック性は保証されません;
- EXEC コマンドの実行時にインスタンスが失敗します。AOF ログがオンになっている場合、アトミック性が保証できる。
一貫性
一貫性は、不正なコマンドやインスタンス障害のタイミングによって影響を受けます。コマンド エラーによると、ディメンションの発生タイミングは 3 つの状況で分析できます。EXEC の実行前、キューに入った後にエラーが報告された場合、トランザクションは破棄されるため、整合性は保証されます。
EXEC 実行後、実際の実行時にエラーが報告されます。エラーのある実行は実行されません。正しい命令は正常に実行され、一貫性を保証できます。
EXEC を実行すると、インスタンスが失敗します。 インスタンスが失敗すると、インスタンスが再起動されます。これはデータの回復方法に関係します。オープン RDB または AOF については、ケースバイケースで検討されます。 RDB または AOF を有効にしない場合、インスタンスが失敗して再起動した後、データは失われ、データベースの整合性は保たれます。 RDB スナップショットを使用する場合、トランザクション実行時に RDB スナップショットは実行されないためです。 したがって、トランザクション コマンド操作の結果は、RDB スナップショットには保存されません。RDB スナップショットを使用してリカバリすると、データベース内のデータは一貫したものになります。 AOF ログを使用し、トランザクション操作が AOF ログに記録される前にインスタンスが失敗した場合、AOF ログを使用して復元されたデータベース データには一貫性があります。 一部の操作のみが AOF ログに記録されている場合、redis-check-aof を使用してトランザクション内の完了した操作をクリアでき、回復後のデータベースの整合性が保たれます。 #分離 EXEC EXEC WATCH 変更された場合、トランザクションの分離が破壊されるのを防ぐために、トランザクションの実行は中止されます。 WATCH なし 同時操作は受信され、EXEC 後に実行されます。 永続性 Redis がどの永続モードを採用しても、トランザクションの耐久性特性は保証されません。 概要 Redis のトランザクション メカニズムは一貫性と分離性を保証できますが、耐久性は保証できません。 トランザクションで使用されるコマンド構文が間違っている場合、アトミック性は保証されません。それ以外の場合、トランザクションはアトミックに実行できます。 プログラミング入門をご覧ください。 !
コマンドの前に実行されます。分離には次のことが必要です。
WATCH メカニズムを通じて保証されます;
コマンドの後で同時操作が保証されます。
マー兄弟、WATCH メカニズムとは何ですか?
最初の状況に注目してみましょう。トランザクションの EXEC コマンドが実行されていないとき、トランザクションのコマンド操作はコマンド キューに一時的に保存されます。 現時点で、他の同時操作があり、同じキーが変更されている場合は、トランザクションが メカニズムを使用しているかどうかを確認する必要があります。
Redis はある程度のアトミック性を備えていますが、ロールバックはサポートしていません。
以上がトランザクションACIDとは何ですか? Redis トランザクションは ACID を実装できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

Redis是现在最热门的key-value数据库,Redis的最大特点是key-value存储所带来的简单和高性能;相较于MongoDB和Redis,晚一年发布的ES可能知名度要低一些,ES的特点是搜索,ES是围绕搜索设计的。

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了关于redis的一些优势和特点,Redis 是一个开源的使用ANSI C语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式存储数据库,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了Redis Cluster集群收缩主从节点的相关问题,包括了Cluster集群收缩概念、将6390主节点从集群中收缩、验证数据迁移过程是否导致数据异常等,希望对大家有帮助。

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了Redis实现排行榜及相同积分按时间排序,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,希望对大家有帮助。

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了关于原子操作中命令原子性的相关问题,包括了处理并发的方案、编程模型、多IO线程以及单命令的相关内容,下面一起看一下,希望对大家有帮助。

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了bitmap问题,Redis 为我们提供了位图这一数据结构,位图数据结构其实并不是一个全新的玩意,我们可以简单的认为就是个数组,只是里面的内容只能为0或1而已,希望对大家有帮助。

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了Redis实现排行榜及相同积分按时间排序,本文通过实例代码给大家介绍的非常详细,下面一起来看一下,希望对大家有帮助。

redis error就是redis数据库和其组合使用的部件出现错误,这个出现的错误有很多种,例如Redis被配置为保存数据库快照,但它不能持久化到硬盘,用来修改集合数据的命令不能用。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

ホットトピック



