Maison  >  Article  >  base de données  >  Utilisez Redis pour compléter la fonction de salle de discussion

Utilisez Redis pour compléter la fonction de salle de discussion

齐天大圣
齐天大圣original
2020-05-20 08:44:202295parcourir

Redis fournit un mécanisme de messagerie de modèle Pub/Sub (publication/abonnement). L'éditeur publie des messages sur la chaîne spécifiée et les abonnés abonnés à la chaîne peuvent obtenir les messages. Grâce à ce mécanisme, nous pouvons compléter des fonctions telles que les forums de discussion et les tableaux d'affichage.

Tout d'abord, introduisons quelques commandes concernant pub/sub.

Publier un message

Publier un message de chaînePublier un message sur la chaîne spécifiée

Supposons qu'il y ait est un groupe d'amis de voiture, à ce moment un utilisateur a posté un message

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

La valeur de retour de cette commande est le nombre d'abonnés qui se sont abonnés à cette chaîne. Comme vous pouvez le constater, personne n'est encore abonné à cette chaîne.

S'abonner aux messages

s'abonner à la chaîne [canal] Les abonnés peuvent s'abonner à un ou plusieurs utilisateurs

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

A ce moment, un utilisateur a déjà rejoint le groupe de coureurs. Petit à petit, de plus en plus de personnes rejoignent le groupe.

Lorsqu'un utilisateur publie un message, les autres membres du groupe peuvent voir le message.

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"

Remarque : lorsque le client exécute la commande d'abonnement, il entre dans l'état d'abonnement et ne peut exécuter que les commandes liées à pub/sub. De plus, les nouveaux utilisateurs qui rejoignent le groupe ne peuvent pas voir les messages précédents car ce mécanisme ne conserve pas les messages. Même si les fonctions sont limitées, c'est assez simple.

Encore une chose, plus il y a de fonctions, mieux c'est, cela dépend principalement de son adaptation à la scène. Si vous pouvez le faire, plus c’est simple, mieux c’est.

Afficher le nombre d'abonnements

pubsub numsub [channel...]

Vous souhaitez voir Combien d'utilisateurs y a-t-il dans le groupe

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

Le groupe compte actuellement 2 utilisateurs.

Désabonnement

désabonnement [chaîne [chaîne ...]]

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

Combat pratique

Après avoir introduit les connaissances ci-dessus, nous pouvons compléter la fonction d'un salon de discussion.

Le pseudocode pour publier un message est très simple. Le pseudocode pour publier un message est le suivant :

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

Le pseudocode pour recevoir un message est le suivant :

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

Il y a plusieurs points à noter ici :

  • Les consommateurs doivent créer une connexion longue Redis,

  • définir set_time_limit et default_socket_timeout pour garantir que le blocage Le processus d'acquisition de messages php n'expire pas et la connexion socket n'expire pas

Actuellement, Redis propose un nouveau type Stream, qui est beaucoup plus puissant. Les amis intéressés peuvent vérifier eux-mêmes les informations pertinentes.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn