まず、最初のエントリポイントを見つけます。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がタスクキュー機能を実装する方法を簡単に理解できます。