Heim  >  Artikel  >  Datenbank  >  Verwenden Sie Redis, um die Chatroom-Funktion abzuschließen

Verwenden Sie Redis, um die Chatroom-Funktion abzuschließen

齐天大圣
齐天大圣Original
2020-05-20 08:44:202295Durchsuche

Redis bietet einen Messaging-Mechanismus im Pub/Sub-Modell (Publish/Subscribe). Der Herausgeber veröffentlicht Nachrichten auf dem angegebenen Kanal und Abonnenten, die den Kanal abonnieren, können die Nachrichten erhalten. Durch diesen Mechanismus können wir Funktionen wie Chatrooms und Bulletin Boards ausführen.

Lassen Sie uns zunächst einige Befehle zu Pub/Sub vorstellen.

Nachricht veröffentlichen

Kanalnachricht veröffentlichenEine Nachricht auf dem angegebenen Kanal veröffentlichen

Angenommen, dort ist eine Auto-Freundesgruppe. Zu diesem Zeitpunkt hat ein Benutzer eine Nachricht gepostet

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

Der Rückgabewert dieses Befehls ist die Anzahl der Abonnenten, die diesen Kanal abonniert haben. Wie Sie sehen, hat noch niemand diesen Kanal abonniert.

Nachrichten abonnieren

Kanal [Kanal] abonnieren Abonnenten können einen oder mehrere Benutzer abonnieren

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

Zu diesem Zeitpunkt ist bereits ein Benutzer der Fahrergruppe beigetreten. Nach und nach schließen sich immer mehr Menschen der Gruppe an.

Wenn ein Benutzer eine Nachricht postet, können andere Gruppenmitglieder die Nachricht sehen.

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"

Hinweis: Wenn der Client den Abonnementbefehl ausführt, wechselt er in den Abonnementstatus und kann nur Pub/Sub-bezogene Befehle ausführen. Darüber hinaus können neue Benutzer, die der Gruppe beitreten, frühere Nachrichten nicht sehen, da dieser Mechanismus die Nachrichten nicht dauerhaft speichert. Obwohl die Funktionen begrenzt sind, ist es einfach genug.

Noch etwas: Je mehr Funktionen desto besser, es kommt vor allem darauf an, ob es für die Szene geeignet ist. Wenn Sie es schaffen, gilt: Je einfacher, desto besser.

Abonnementanzahl anzeigen

pubsub numsub [Kanal...]

Möchten Sie ansehen Wie viele Benutzer sind in der Gruppe?

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

Die Gruppe hat derzeit 2 Benutzer.

Abmelden

Abmelden [Kanal [Kanal ...]]

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

Praktischer Kampf

Nachdem wir das oben genannte Wissen eingeführt haben, können wir die Funktion eines Chatrooms vervollständigen.

Der Pseudocode zum Veröffentlichen einer Nachricht ist wie folgt:

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

Der Pseudocode zum Abrufen einer Nachricht ist wie folgt:

//设置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();
}

Hier sind mehrere Punkte zu beachten:

  • Verbraucher müssen eine lange Redis-Verbindung erstellen,

  • set_time_limit und default_socket_timeout festlegen, um sicherzustellen, dass die Verbindung blockiert wird PHP-Nachrichtenerfassungsprozess läuft nicht ab und die Socket-Verbindung läuft nicht ab

Derzeit stellt Redis einen neuen Stream-Typ bereit, der viel leistungsfähiger ist. Interessierte Freunde können die relevanten Informationen selbst überprüfen.

Das obige ist der detaillierte Inhalt vonVerwenden Sie Redis, um die Chatroom-Funktion abzuschließen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn