タスクキュー関数のRedisシンプルな実装

まず、最初のエントリポイントを見つけます。redisのリストタイプには、LPUSHとRPOPの2つのコマンドがあります。LPUSHコマンドを使用すると、要素を左からキューに入力でき、RPOPコマンドを使用すると、要素を右からポップできます。このように、2つのコマンドを一緒に使用して、レフトインとライトアウトの形式を形成し、間接的にキューの機能を実現します。プロデューサーはLPUSHコマンドを使用してキーにタスクを追加し、コンシューマーはRPOPコマンドを使用してキーからタスクを継続的に削除します。

現時点で問題は、タスクがあることを消費者はどのように知るのかということです。コンシューマーは、連続ループでキーに対応するキューのみを読み取り、タスクがある場合は消費し、タスクがない場合はしばらく待ってから、タスクの消費を取得するなどを行うことができます。しかし、キュー内に長時間タスクがない場合、そのようなループは役に立たず、リソースを浪費します。

タスクなしでブロックして、タスクがある場合にのみ実行することはできますか?BRPOPコマンドはそれを実行できます。タスクキューに新しいタスクがない場合、BRPOPコマンドは常にブロックされ、実行されません。したがって、RPOPコマンドをBRPOPコマンドに変更すると、不要なループを回避できると同時に、タスクがキューに生成されると、コンシューマーは通知されたかのようにタスクの取り出しを開始します。

BRPOPの基本構文

BLPOP LIST1 LIST2 .. LISTN TIMEOUT 

第一个是键名,第二个是超时时间,单位是秒,如果列表为空或者超过了超时时间还没获取到新元素,就返回一个nil,否则返回一个含有两个元素的列表,第一个元素是被弹出元素所属的key,第二个元素是被弹出元素的值。

超时时间为"0",表示不限制等待的时间。

LPUSHおよびBRPOPを使用してメッセージキュー操作を実装する例

最初に2つのredis-cliインスタンスを開きます。ポートは6380で、1つはコンシューマー、もう1つはプロデューサーです。
ここに画像の説明を挿入

次に、コンシューマーはbrpopコマンドを入力して、新しいタスクの生成を待機します。結果は返されず、ブロッキング状態であることが次のようにわかります。
ここに画像の説明を挿入

次に、プロデューサーは次のようにlpushコマンドを入力してタスクを生成し、キューに挿入します。
ここに画像の説明を挿入
元々ブロックされていたコンシューマーはブロックされなくなったことがわかり、キューに挿入された新しいタスクのキー名と要素値が返されます。
ここに画像の説明を挿入

このようにして、Redisがタスクキュー機能を実装する方法を簡単に理解できます。

おすすめ

転載: blog.csdn.net/weixin_38106322/article/details/108524051