[Redisスタディノート(14)]パブリッシュおよびサブスクライブ、トランザクション、Luaスクリプト、遅いクエリログ

記事のディレクトリ

この記事は公式アカウント[DevelopingPigeon]から公開されています!フォローへようこそ!


古いルール-姉妹都市都市:

1。パブリッシュおよびサブスクライブ

(I.概要

       Redisのパブリッシュおよびサブスクライブ機能は、PUBLISH、SUBSCRIBE、PSUBSCRIBEおよびその他のコマンドで構成されています。サブスクリプションコマンドを使用して、クライアントは1つ以上のチャネルにサブスクライブできます。別のクライアントがサブスクライブしたチャネルにメッセージを送信するたびに、チャネルのすべてのサブスクライバーがメッセージを受信します。クライアントは、チャネルのサブスクライブに加えて、PSUBSCRIBEコマンドを使用してモードをサブスクライブすることもできます。モードは、パターンマッチングルールに従ってチャネルにマッチングされます。メッセージがチャネルに送信される限り、パターンのサブスクライバーチャネルに一致すると、メッセージを受信できます。

(2)チャンネルのサブスクリプションとサブスクリプション解除

       Redisは、すべてのチャネルのサブスクリプション関係をサーバー状態のpubsub_channelsディクショナリに保存します。このディクショナリのキーはサブスクライブされたチャネルであり、キーの値は、このチャネルにサブスクライブされたすべてのクライアントを格納するリンクリストです。

(3)モデルのサブスクリプションとサブスクリプション解除

       同様に、パターンのサブスクリプション関係もサーバー状態のpubsub_Patternsリンクリストに格納されます。各ノードはpubsub_Pattern構造であり、サブスクライブされたパターンとそのパターンにサブスクライブするクライアントを格納します。

(4)メッセージを送信する

       RedisクライアントがPUBLISH <channel> <message>コマンドを実行してチャネルチャネルにメッセージを送信すると、サーバーはチャネルのすべてのサブスクライバーにメッセージを送信します。チャネルに一致するパターンが複数ある場合、パターンのサブスクライバーもメッセージを受信します。

(5)サブスクリプションニュースを表示する

       PUBSUBコマンドはRedis2.8の新しいコマンドです。クライアントはこのコマンドを使用して、サブスクライバーの数などのチャネルまたはモード情報を表示できます。

1. PUBSUB CHANNELS [パターン]

       サーバーが現在サブスクライブしているすべてのチャネルを返します。パターンパラメータを追加する場合は、パターンパターンに一致する条件が満たされている必要があります。


2. PUBSUB NUMSUB

       入力パラメーターとして任意の数のチャネルを受け入れ、これらのチャネルへのサブスクライバーの数を返します。

3. PUBSUB NUMPAT

       サーバーの現在サブスクライブされているモードの数を返します。


二。事務

(I.概要

       Redisは、MULTI、EXEC、WATCH、およびその他のコマンドを介してトランザクションを実装します。トランザクションは、1つ以上のコマンド要求をパッケージ化し、これらのコマンドを順番に実行します。

(2)事件の実現

1.トランザクションが開始されます

       MULTIコマンドは、トランザクションの開始をマークします。このコマンドは、コマンドのクライアントを非トランザクション状態からトランザクション状態に切り替えることができます。これは、クライアント状態のflags属性でREDIS_MULTIフラグをオンにすることによって行われます。

2.チームへの参加を注文する

       クライアントが非トランザクション状態の場合、クライアントから送信されたコマンドはすぐに実行されます。クライアントから送信されたコマンドがEXEC、DISCARD、WATCH、MULTI、次に、サーバーはこのコマンドをすぐに実行します。それ以外の場合は実行されませんが、コマンドをキューに入れ、QUEUED応答をクライアントに返します。

3.トランザクションキュー

       各Redisクライアントには独自のトランザクションステータスがあります。トランザクションステータスには、トランザクションキューとカウンターが含まれます。キューには、関数ポインター、パラメーター、およびキューに入れられたコマンドのパラメーターの数が格納されます。

4.事業の遂行

       トランザクション状態のクライアントがEXECコマンドをサーバーに送信すると、すぐに実行されます。サーバーはクライアントのトランザクションキューをトラバースし、キューに格納されているすべてのコマンドを実行して、実行結果をクライアントに返します。

(3)時計注文

1。概要

       WATCHコマンドは楽観的ロックであり、EXECコマンドが実行される前に任意の数のデータベースキーを監視でき、EXECコマンドが実行されると、監視対象のキーの少なくとも1つが変更されているかどうかを確認します。トランザクションを実行し、トランザクションの失敗を表す空の応答をクライアントに返します。これにより、トランザクションのセキュリティが確保されます。

2.実現

       各Redisデータベースにはwatched_keysディクショナリが格納されています。このディクショナリのキーはWATCHコマンドによって監視されるデータベースキーであり、ディクショナリの値はデータベースキーを監視するすべてのクライアントを記録するリンクリストです。このディクショナリを通じて、サーバーは、どのデータベースキーが監視されているか、およびどのクライアントがこれらのデータベースキーを監視しているかを知ることができます。

3.監視メカニズムのトリガー

       データベースを変更するすべてのコマンドは、実行後にwatched_keysディクショナリをチェックして、コマンドによって変更されたばかりのデータベースキーを監視しているクライアントがあるかどうかを確認する関数を呼び出します。ある場合は、すべてのデータベースキーを監視します。 。クライアントのREDIS_DIRTY_CASフラグがオンになっています。これは、クライアントのトランザクションセキュリティが侵害されたことを示します。

4.トランザクションが実行可能かどうかを判断します

       サーバーがクライアントからEXECコマンドを受信すると、サーバーはクライアントのREDIS_DIRTY_CAS識別子に従ってトランザクションを実行するかどうかを決定します。

(4)トランザクションのACID

1.アトミシティ

       トランザクション内の複数の操作は全体として実行されますが、Redisはトランザクションのロールバックをサポートしていません。コマンドの実行中にエラーが発生した場合でも、すべてのコマンドが実行されるまでトランザクション全体が実行され続けます。

2.一貫性

       トランザクションの一貫性とは、トランザクションが実行される前にデータベースが一貫している場合、トランザクションが実行された後、トランザクションが正常に実行されるかどうかに関係なく、データベースも一貫している必要があることを意味します。整合性とは、データがデータベース自体の定義と要件に準拠し、違法または無効なエラーデータが含まれていないことを意味します。したがって、Redisは、エラー検出とシンプルな設計を通じてトランザクションの整合性を保証します。

(1)登録エラー

       トランザクションが存在しない場合、またはenqueueコマンドのコマンド形式が正しくない場合、トランザクションの実行は拒否されるため、整合性は影響を受けません。

(2)実行エラー

       トランザクションの実行中にエラーが発生し、サーバーはトランザクションの実行を中断しないため、整合性に影響はありません。

(3)サーバーがダウンしている

       トランザクションの実行中にRedisサーバーがダウンしている場合は、サーバーが使用する永続モードに従って判断します。

       永続性がない場合、データベースは再起動後に空白になるため、一貫している必要があります。

       RDBの永続性がある場合は、RDBを使用してデータを復元します。データは一貫している必要があります。

       AOFの永続性がある場合は、AOFを使用してデータを復元します。これは一貫している必要があります。


3.分離

       Redisは単一のスレッドを使用してトランザクションを実行し、分離されます。

4.耐久性

       Redisの永続モード、たとえばRDBモードでは、BGSAVEコマンドが非同期で実行されるため、トランザクションデータが初めてハードディスクに保存される保証はありません。AOFモードでは、耐久性は値に基づいて決定されます。 appendfsyncオプションの。

       各トランザクションの最後にSAVEコマンドを追加して、トランザクションの耐久性を確保することもできますが、効率は高くありません。


三。Luaスクリプト

(I.概要

       Redisはバージョン2.6からLuaスクリプトのサポートを導入しました。サーバーにLua環境を埋め込むことにより、RedisクライアントはLuaスクリプトを使用して、サーバー側で複数のRedisコマンドをアトミ​​ックに直接実行できます。

(2つ)Lua環境コラボレーションコンポーネント

1.疑似クライアント

       Redisコマンドの実行には対応するクライアントステータスが必要であるため、Luaスクリプトに含まれるRedisコマンドを実行するために、RedisサーバーはRedisコマンドの処理を担当するLua環境専用の疑似クライアントを作成します。Luaスクリプトはredis.call関数を使用してRedisコマンドを実行し、それを疑似クライアントに送信します。疑似クライアントはコマンドをコマンド実行者に渡し、結果をLua環境に返します。

2.lua_scripts辞書

       このディクショナリのキーはLuaスクリプトのSHA1チェックサムであり、ディクショナリの値はSHA1チェックサムに対応するLuaスクリプトです。RedisはEVALコマンドによって実行されたすべてのLuaスクリプトとすべてのスクリプトをロードします。インポートされたLuaスクリプトはこの辞書に保存されます。

(3)EVALコマンド

       クライアントが実行するLuaスクリプトに従って、Lua環境でこのスクリプトに対応するLua関数を定義します。Lua関数の名前は、f_プレフィックスとスクリプトのSHA1チェックサムで構成され、指定されたスクリプトをに保存します。 lua_scriptsディクショナリ、そして最後に定義したばかりの関数を実行します。


(4)EVALSHAコマンド

       このコマンドは、スクリプトのSHA1チェックサムに従って、スクリプトに対応する関数を呼び出します。要件は、スクリプトがEVALコマンドによって実行されているか、SCRIPTLOADコマンドによってロードされている必要があります。


(5)スクリプト管理コマンド

1.スクリプトフラッシュ

       サーバー内のLuaスクリプトに関連するすべての情報をクリアし、lua_scriptsディクショナリを解放して再構築し、新しいLua環境を再構築します。


2.スクリプトが存在します

       入力されたSHA1チェックサムに従って、対応するスクリプトがサーバーにあるかどうかを確認します。


3.スクリプトロード

       スクリプトコマンドをロードします。このコマンドは、最初にLua環境でスクリプトに対応する関数を作成し、次にスクリプトをlua_scriptsディクショナリに保存しますが、実行しません。


四。遅いクエリログ

(I.概要

       Redisの低速クエリログは、実行時間が特定の期間を超えるコマンドリクエストを記録するために使用されます。ユーザーは、この関数によって生成されたログを通じてクエリ速度を監視および最適化できます。


(二) 配置

       サーバー構成には、低速クエリに関連する2つの構成があります。


1.slowlog-log-slower-than

       実行イベントを実行する微妙なコマンド要求の数がログに記録されます。


2.slowlog-max-len

       サーバーによって保存された低速クエリログの最大数を実行し、FIFOを使用してログを保存します。

(3)確認して削除する

1. SLOWLOG GET

       遅いクエリログを確認してください。

2.スローログレン

       ログの数を表示します。


3.スローログリセット

       遅いクエリログをすべてクリアします。

おすすめ

転載: blog.csdn.net/Mrwxxxx/article/details/114412044