ホームページ >データベース >Redis >Redis を使用してチャット ルーム機能を完了する

Redis を使用してチャット ルーム機能を完了する

齐天大圣
齐天大圣オリジナル
2020-05-20 08:44:202410ブラウズ

Redis は、Pub/Sub (パブリッシュ/サブスクライブ) モデルのメッセージング メカニズムを提供します。パブリッシャは指定されたチャネルにメッセージをパブリッシュし、チャネルを購読するサブスクライバはメッセージを取得できます。この仕組みにより、チャットルームや掲示板などの機能が完成します。

まず、pub/sub に関するコマンドをいくつか紹介します。

メッセージのパブリッシュ

チャネル メッセージのパブリッシュ指定されたチャネルにメッセージをパブリッシュします

ある場合は car Friends グループで、この時点でユーザーがメッセージを投稿しました

127.0.0.1:6379> publish car:fans hello,everyone
(integer) 0

このコマンドの戻り値は、このチャンネルに登録している登録者の数です。ご覧のとおり、このチャンネルにはまだ誰も登録していません。

メッセージを購読する

チャンネルを購読する [チャンネル] 購読者は 1 人以上のユーザーを購読できます

127.0.0.1:6379> subscribe car:fans
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "car:fans"
3) (integer) 1

この時点で、ユーザーはすでにライダーグループに参加しています。徐々にグループに参加する人が増えていきます。

ユーザーがメッセージを投稿すると、他のグループのメンバーがそのメッセージを見ることができます。

127.0.0.1:6379> publish car:fans 'How are you'
(integer) 2127.0.0.1:6379> subscribe car:fans
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "car:fans"
3) (integer) 1
1) "message"
2) "car:fans"
3) "How are you"

注: クライアントがサブスクリプション コマンドを実行すると、サブスクリプション状態になり、pub/sub 関連のコマンドのみを実行できます。さらに、このメカニズムではメッセージが保持されないため、グループに参加した新しいユーザーは以前のメッセージを見ることができません。機能は限定されていますが、シンプルなので十分です。

もう 1 つ、機能は多ければ多いほど良いのですが、それは主にシーンに適しているかどうかによって決まります。できるなら、シンプルなほど良いです。

サブスクリプション数の表示

pubsub numsub [チャンネル ...]

Wantグループに何人のユーザーがいるかを表示します

127.0.0.1:6379> pubsub numsub car:fans
1) "car:fans"
2) (integer) 2

グループには現在 2 人のユーザーがいます。

#登録解除

登録解除 [チャンネル [チャンネル ...]]

redis-cli UNSUBSCRIBE
1) "unsubscribe"
2) (nil)
3) (integer) 0

実践的な戦闘

上記の知識を導入すると、チャット ルームの機能が完成します。

メッセージを公開するための疑似コードは非常に簡単です。メッセージを公開するための疑似コードは次のとおりです:

function publist ($chanel, $message)
{
    $redis->publist($channel, $message);
}

メッセージを取得するための疑似コードは次のとおりです:

//设置php脚本执行时间
set_time_limit(0);
//设置socket连接超时时间
ini_set('default_socket_timeout', -1);
 
//声明频道名称
$channelName = "testpubsub";
 
try {
    $redis = new \Redis();
    $redis->pconnect('localhost', 6379);
    $redis->subscribe([$channelName], function ($redis, $channel, $msg)
    {
        echo 'channel:' . $channel . ',message:' . $msg . PHP_EOL;
    });
} catch (\Exception $e) {
    echo $e->getMessage();
}

ここで注意すべき点がいくつかあります。

  • コンシューマーは Redis の長い接続を作成する必要があります。

  • set_time_limit とdefault_socket_timeout を設定して、php が確実に接続できるようにします。メッセージ取得プロセスをブロックしてもタイムアウトせず、ソケット接続もタイムアウトになりません。

現在、Redis は、より強力な新しい Stream タイプを提供しています。興味のある友達は自分で関連情報を確認できます。

以上がRedis を使用してチャット ルーム機能を完了するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。