ここでNはすでにチャネルに接続しているクライアントの数です。Nはチャネルをsubscribeしているクライアントの数で、Mはすべてのクライアントによるsubscribeのパターン数です。NはすでにPSUBSCRIBEをしているクライアントのsubscribeのパターン数です。NはPUBSUBSCRIBEをしているクライアントがすでにsubscribeしているパターン数で、Mはクライアントからシステムにsubscribeされているパターン数の合計です。バブリッシュ/サブスクライブ・メッセージ・パラダイムです。sender(publisher)はメッセージを特定のreceiver(subscriber)に送信するのではなく、パブリッシュされたメッセージはチャネルに紐付けられます。このときどんなsubscriberがいるかは意識することはありません。subscriberは1つ以上のチャンネルを指定し、指定したチャンネルのメッセージのみ受信します。このpublisherとsubscriberのデカップリングはスケーラブルで動的なネットワークトポロジーを可能にします。コマンドをチャンネル名とともに発行します。bar他のクライアントによるすべてのメッセージはRedisサーバによりsubscribeされているすべてのクライアントにプッシュされます。replyになります。最初の要素はメッセージの型、2番目はチャンネル、3番目はメッセージの中身です。以外のコマンドを発行するべきではありません。返信は先に説明したメッセージの形で送信されます。クライアントは最初の要素がメッセージの種類を示しているので、それに基づいて一貫したストリームを読み取ることができます。最初の要素はメッセージの種類です。これは無事に2番目の要素にあるチャンネルをsubscribeできたことを示しています。3番目の要素は現在subscribeしているチャンネル数を示しています。これは2番目の要素にあるチャンネルを無事にunsubscribeできたことを示しています。3番目の要素は現在subscribeしているチャンネル数を示しています。0になっていたらひとつもチャンネルを購読していないことを示しています。クライアントはパブリック/サブスクライブの状態からは外れているのでどんなRedisコマンドも発行できます。コマンドの結果のメッセージです。2番目の要素はチャンネル名、3番目の要素はメッセージの中身です。コマンドが引数なしで呼び出された場合、現在subscribeしているすべてのチャンネルをunsubscribeしたことになります。unsubscribeしたすべてのチャンネルにその旨のメッセージが送られます。次は最初のクライアントが受け取るものです。コマンドですべてのチャンネルからunsubscribeします。パターンマッチによるsubscribeRedisのパブリッシュ/サブスクライブの実装はパターンマッチもサポートしています。クライアントはglob形式のパターンを使って、パターンに該当するチャンネル名を持つ全てのメッセージを受信します。コマンドはこんな感じです。いったチャンネルのすべてのメッセージを受信します。すべてのglob形式のパターンが有効です。複数のワイルドカードが対応しています。パターンマッチの結果受け取ったメッセージは異なったフォーマットで送信されます。されたメッセージの受信結果です。2番目の要素は該当したパターン、3番目の要素はチャンネル名で、最後の要素は実際のメッセージの中身です。コマンドと同様に、メッセージタイプが”psubscribe”や”punsubscribe”のメッセージを送信しているシステムによって認識されています。そのシステムが送信しているメッセージの形式は”subscribe”や”unsubscribe”のものと同様です。パターンとチャンネル、両方のsubscribeに該当するメッセージ1つのメッセージに対して複数のパターンが該当する、あるいはパターンとチャンネル名両方がメッセージに該当する場合、クライアントはあるメッセージを複数回受信します。f*上の例ではもしメッセージがfooチャンネルに送信され場合、クライアントは2つのメッセージを受け取ります。それぞれのメッセージタイプは”message”と”pmessage”になります。“punsubscribe”のメッセージタイプでは、最後の要素は購読中のチャンネル数になっています。この数はクライアントがその時点でsubscribeしているチャンネルとパターンの合計です。クライアントは、すべてのチャンネルとパターンをunsubscribeした結果、この数が0になった時にだけパブリック/サブスクライブの状態を抜けることができます。コマンドはbulkコマンドです。最初の引数がターゲットクラスで2番目の引数が送信されるデータです。replyが返ってきます。値はメッセージを受け取ったクライアント数です。Noordhuisが素晴らしいサンプルとして、Event-machineとRedisを使って複数ユーザのハイパフォーマンスWebチャットを作りました。ソースコードももちろん公開されています。クライアントライブラリの実装のためのヒント受信したすべてのメッセージにはメッセージの配信のきっかけとなった元々のsubscriptionを持っているので(”message”であればチャンネル名、”pmessage”であればパターン)、クライアントライブラリは元々のsubscriptionとコールバックをハッシュ表を使ってひもづけることができます。(コールバック先は関数、ブロック、ポインタなどなんでもかまいません)メッセージが受け取られたときには、メッセージを登録したコールバックに配信するために、O(1)の参照が行われます。