Redis从入门到放弃(3):发布与订阅

1、介绍

Redis是一个快速、开源的内存数据库,支持多种数据结构,如字符串、哈希、列表、集合、有序集合等。除了基本的数据存储和检索功能外,Redis还提供了许多高级功能,其中之一就是发布订阅(Pub/Sub)。

发布订阅是一种消息传递模式,它允许消息的发布者(发布者)将消息发送给多个订阅者(订阅者)而不必知道订阅者的存在。这种模式在许多应用中都非常有用,例如实时通知、事件处理、聊天应用等。

2、如何使用发布订阅

2.1、订阅频道

要订阅一个频道,首先需要使用 SUBSCRIBE 命令。假设我们有一个频道名为 notifications,下面是订阅该频道的示例代码:

[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 # 返回值为当前已订阅的频道数量
[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      # 返回值为当前已订阅的频道数量
[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 # 返回值为当前已订阅的频道数量

当执行以上命令后,当前客户端就会进入订阅状态,它将持续等待来自 notifications 频道的消息。如果频道不存在,那么客户端将一直阻塞,直到有消息发布到该频道。

2.2、发布消息

要发布一条消息到指定的频道,使用 PUBLISH 命令。下面是发布一条消息到 notifications 频道的示例代码:

发布端(发布消息):

[root@ds-huangshan-01 src]# ./redis-cli
127.0.0.1:6379> publish notifications "hello world!"
(integer) 1
[root@ds-huangshan-01 src]# ./redis-cli 
127.0.0.1:6379> publish notifications "hello world!"
(integer) 1
[root@ds-huangshan-01 src]# ./redis-cli 127.0.0.1:6379> publish notifications "hello world!" (integer) 1

执行以上命令后,所有已经订阅 notifications 频道的客户端都会收到消息 “hello world!”。

"message"
"notifications"
"hello world!"
"message"
"notifications"
"hello world!"
"message" "notifications" "hello world!"

2.3、取消订阅

如果客户端不再需要接收特定频道的消息,可以使用 UNSUBSCRIBE 命令来取消订阅。如果没有指定频道名,则客户端将取消所有频道的订阅。

UNSUBSCRIBE notifications
UNSUBSCRIBE notifications
UNSUBSCRIBE notifications

2.4、模式订阅

除了普通的频道订阅,Redis还支持模式订阅(Pattern Subscriptions)。模式订阅允许客户端订阅满足特定模式的频道。

例如,假设我们有多个频道名以 “notifications:” 开头,后面跟着不同的分类(例如 “notifications:news”、”notifications:sports” 等)。要订阅所有以 “notifications:” 开头的频道,可以使用以下命令:

PSUBSCRIBE notifications:*
PSUBSCRIBE notifications:*
PSUBSCRIBE notifications:*

2.5、取消模式订阅

取消模式订阅使用 PUNSUBSCRIBE 命令,用法与取消普通频道订阅类似。

PUNSUBSCRIBE notifications:*
PUNSUBSCRIBE notifications:*
PUNSUBSCRIBE notifications:*

有关订阅命令有两点需要注意:

  1. 客户端在执行订阅命令之后进入了订阅状态,只能接收 subscribe、psubscribe、 unsubscribe、 punsubscribe 的四个命令。
  2. 新开启的订阅客户端,无法收到该频道之前的消息,因为 Redis 不会对发布的消息进行持久化。

3、使用案例(伪代码)

消息通知: 在一个Web应用程序中,可以使用发布订阅功能来向所有在线用户发送实时通知,比如新消息、新订单等。

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

// 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();
}
}
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();
    }
}
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、Redis的发布订阅与ActiveMQ、RocketMQ区别

Redis的发布订阅与ActiveMQ、RocketMQ是不同类型的消息传递系统,它们有以下区别:

  1. 消息队列模式 vs. 发布订阅模式:

    • ActiveMQ和RocketMQ是消息队列系统,它们遵循消息队列模式。消息队列将消息发送到一个或多个消费者,每个消息只能由一个消费者处理。
    • Redis的发布订阅是一种发布者-订阅者模式,其中一个消息可以广播给多个订阅者。
  2. 持久性:

    • ActiveMQ和RocketMQ通常支持消息的持久性,可以确保即使在消费者离线的情况下,消息不会丢失。
    • Redis的发布订阅默认不支持持久性。一旦消息被发送,如果没有订阅者接收,那么消息就会丢失;
  3. 功能特性:

    • ActiveMQ和RocketMQ提供了丰富的功能,如消息重试、消息顺序保证、延迟消息等。
    • Redis的发布订阅相对简单,主要用于实时通知和简单消息的发布与订阅。
  4. 分布式特性:

    • ActiveMQ和RocketMQ都是为分布式环境而设计的,支持集群和负载均衡。
    • Redis可以在分布式环境中使用,但其发布订阅功能相对来说较为简单,不如ActiveMQ和RocketMQ在复杂分布式场景下灵活。

总的来说,如果需要一个功能丰富且专注于消息队列模式的消息传递系统,可以选择ActiveMQ或RocketMQ。而如果只需简单的发布订阅功能,Redis的发布订阅是个不错的选择。

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MY28bmkb' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片