1. Introduction
Redis est une base de données en mémoire rapide et open source qui prend en charge diverses structures de données, telles que des chaînes, des hachages, des listes, des ensembles, des ensembles ordonnés, etc. En plus des fonctions de base de stockage et de récupération de données, Redis fournit également de nombreuses fonctions avancées, dont la publication et l'abonnement (Pub/Sub).
La publication-abonnement est un modèle de messagerie qui permet à l'éditeur d'un message (éditeur) d'envoyer des messages à plusieurs abonnés (abonnés) sans savoir que les abonnés existent. Ce modèle est très utile dans de nombreuses applications, telles que les notifications en temps réel, la gestion d'événements, les applications de chat, etc.
2. Comment utiliser la publication et l'abonnement
2.1. Abonnez-vous aux chaînes
Pour vous abonner à une chaîne, vous devez d'abord utiliser SUBSCRIBE
la commande. Supposons que nous ayons une chaîne nommée notifications
, voici l'exemple de code pour vous abonner à la chaîne :
[root@ds-huangshan-01 src]# ./redis-cli
127.0.0.1:6379> SUBSCRIBE notifications
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "notifications"
3) (integer) 1 # 返回值为当前已订阅的频道数量
Après avoir exécuté la commande ci-dessus, le client actuel entrera dans l'état d'abonnement et continuera d'attendre les notifications
messages du canal. Si le canal n'existe pas, le client bloquera jusqu'à ce qu'un message soit publié sur le canal.
2.2. Communiquer des nouvelles
Pour publier un message sur un canal spécifié, utilisez PUBLISH
la commande. notifications
Voici un exemple de code pour publier un message sur une chaîne :
Éditeur (publier le message) :
[root@ds-huangshan-01 src]# ./redis-cli
127.0.0.1:6379> publish notifications "hello world!"
(integer) 1
Après avoir exécuté la commande ci-dessus, tous notifications
les clients abonnés à la chaîne recevront le message "hello world!".
"message"
"notifications"
"hello world!"
2.3. Annuler l'abonnement
Si un client n'a plus besoin de recevoir des messages d'un canal spécifique, il peut utiliser UNSUBSCRIBE
la commande pour se désinscrire. Si aucun nom de chaîne n'est spécifié, le client se désabonnera de toutes les chaînes.
UNSUBSCRIBE notifications
2.4. Abonnement au modèle
En plus des abonnements aux chaînes ordinaires, Redis prend également en charge les abonnements de modèles (Pattern Subscriptions). Les abonnements à des modèles permettent aux clients de s'abonner à des chaînes qui satisfont à un modèle spécifique.
Par exemple, disons que nous avons plusieurs noms de chaînes commençant par « notifications : » suivis de différentes catégories (telles que « notifications : actualités », « notifications : sports », etc.). Pour vous abonner à toutes les chaînes commençant par « notifications : », vous pouvez utiliser la commande suivante :
PSUBSCRIBE notifications:*
2.5. Annuler l'abonnement au mode
Utilisez la commande pour annuler un abonnement au mode PUNSUBSCRIBE
, et son utilisation est similaire à l'annulation d'un abonnement à une chaîne normale.
PUNSUBSCRIBE notifications:*
Il y a deux points à noter concernant la commande d'abonnement :
- Le client entre dans l'état d'abonnement après avoir exécuté la commande d'abonnement et ne peut recevoir que quatre commandes : Subscribe, psubscribe, unsubscribe et punsubscribe.
- Un client d'abonnement nouvellement ouvert ne peut pas recevoir les messages précédents du canal car Redis ne conserve pas les messages publiés.
3. Cas d'utilisation (pseudocode)
Notification de message : dans une application Web, vous pouvez utiliser la fonction de publication et d'abonnement pour envoyer des notifications en temps réel à tous les utilisateurs en ligne, telles que de nouveaux messages, de nouvelles commandes, etc.
Code éditeur Redis :
import redis.clients.jedis.Jedis;
public class RedisPublisher {
public static void main(String[] args) {
// 连接到Redis服务器
Jedis jedis = new Jedis("localhost");
// 发布消息到频道
jedis.publish("notifications", "Hello, world!");
// 关闭连接
jedis.close();
}
}
// Code d'abonné Redis
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPubSub;
public class RedisSubscriber extends JedisPubSub {
@Override
public void onMessage(String channel, String message) {
System.out.println("Received message: " + message + " from channel: " + channel);
// 在这里可以实现发送通知给在线用户的逻辑
}
public static void main(String[] args) {
// 连接到Redis服务器
Jedis jedis = new Jedis("localhost");
// 创建订阅者实例
RedisSubscriber subscriber = new RedisSubscriber();
// 订阅频道
jedis.subscribe(subscriber, "notifications");
// 关闭连接
jedis.close();
}
}
4. La différence entre la publication et l'abonnement Redis et ActiveMQ et RocketMQ
Redis Publishing et Subscribe, ActiveMQ et RocketMQ sont différents types de systèmes de messagerie. Ils présentent les différences suivantes :
-
Modèle de file d'attente de messages et modèle de publication-abonnement :
- ActiveMQ et RocketMQ sont des systèmes de file d'attente de messages et suivent le modèle de file d'attente de messages. Une file d'attente de messages envoie des messages à un ou plusieurs consommateurs, et chaque message ne peut être traité que par un seul consommateur.
- Redis publier et s'abonner est un modèle éditeur-abonné, dans lequel un message peut être diffusé à plusieurs abonnés.
-
Durabilité :
- ActiveMQ et RocketMQ prennent généralement en charge la persistance des messages, ce qui garantit que les messages ne sont pas perdus même si le consommateur se déconnecte.
- La publication et l'abonnement Redis ne prennent pas en charge la persistance par défaut. Une fois un message envoyé, si aucun abonné ne le reçoit, le message sera perdu ;
-
Caractéristiques :
- ActiveMQ et RocketMQ offrent des fonctionnalités riches, telles que la nouvelle tentative de message, la garantie de l'ordre des messages, le message retardé, etc.
- La publication et l'abonnement de Redis sont relativement simples et sont principalement utilisés pour les notifications en temps réel ainsi que pour la publication et l'abonnement de messages simples.
-
Fonctionnalités distribuées :
- ActiveMQ et RocketMQ sont tous deux conçus pour les environnements distribués et prennent en charge le clustering et l'équilibrage de charge.
- Redis peut être utilisé dans un environnement distribué, mais ses fonctions de publication et d'abonnement sont relativement simples et ne sont pas aussi flexibles qu'ActiveMQ et RocketMQ dans des scénarios distribués complexes.
Dans l'ensemble, si vous avez besoin d'un système de messagerie riche en fonctionnalités et axé sur le modèle de file d'attente de messages, vous pouvez choisir ActiveMQ ou RocketMQ. Et si vous n'avez besoin que de simples fonctions de publication et d'abonnement, la publication et l'abonnement Redis sont un bon choix.