如何彻底掌握Redis发布订阅,最终放弃学习?

摘要:## 1、介绍 Redis是一个快速、开源的内存数据库,支持多种数据结构,如字符串、哈希、列表、集合、有序集合等。除了基本的数据存储和检索功能外,Redis还提供了许多高级功能,其中之一就是发布订阅(PubSub)。 发布订阅是一种消息传
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 # 返回值为当前已订阅的频道数量 当执行以上命令后,当前客户端就会进入订阅状态,它将持续等待来自 notifications 频道的消息。如果频道不存在,那么客户端将一直阻塞,直到有消息发布到该频道。 2.2、发布消息 要发布一条消息到指定的频道,使用 PUBLISH 命令。下面是发布一条消息到 notifications 频道的示例代码: 发布端(发布消息): [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!" 2.3、取消订阅 如果客户端不再需要接收特定频道的消息,可以使用 UNSUBSCRIBE 命令来取消订阅。如果没有指定频道名,则客户端将取消所有频道的订阅。 UNSUBSCRIBE notifications 2.4、模式订阅 除了普通的频道订阅,Redis还支持模式订阅(Pattern Subscriptions)。模式订阅允许客户端订阅满足特定模式的频道。 例如,假设我们有多个频道名以 "notifications:" 开头,后面跟着不同的分类(例如 "notifications:news"、"notifications:sports" 等)。要订阅所有以 "notifications:" 开头的频道,可以使用以下命令: PSUBSCRIBE notifications:* 2.5、取消模式订阅 取消模式订阅使用 PUNSUBSCRIBE 命令,用法与取消普通频道订阅类似。 PUNSUBSCRIBE notifications:* 有关订阅命令有两点需要注意: 客户端在执行订阅命令之后进入了订阅状态,只能接收 subscribe、psubscribe、 unsubscribe、 punsubscribe 的四个命令。 新开启的订阅客户端,无法收到该频道之前的消息,因为 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(); } } // 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、Redis的发布订阅与ActiveMQ、RocketMQ区别 Redis的发布订阅与ActiveMQ、RocketMQ是不同类型的消息传递系统,它们有以下区别: 消息队列模式 vs. 发布订阅模式: ActiveMQ和RocketMQ是消息队列系统,它们遵循消息队列模式。消息队列将消息发送到一个或多个消费者,每个消息只能由一个消费者处理。 Redis的发布订阅是一种发布者-订阅者模式,其中一个消息可以广播给多个订阅者。 持久性: ActiveMQ和RocketMQ通常支持消息的持久性,可以确保即使在消费者离线的情况下,消息不会丢失。 Redis的发布订阅默认不支持持久性。一旦消息被发送,如果没有订阅者接收,那么消息就会丢失; 功能特性: ActiveMQ和RocketMQ提供了丰富的功能,如消息重试、消息顺序保证、延迟消息等。 Redis的发布订阅相对简单,主要用于实时通知和简单消息的发布与订阅。 分布式特性: ActiveMQ和RocketMQ都是为分布式环境而设计的,支持集群和负载均衡。 Redis可以在分布式环境中使用,但其发布订阅功能相对来说较为简单,不如ActiveMQ和RocketMQ在复杂分布式场景下灵活。 总的来说,如果需要一个功能丰富且专注于消息队列模式的消息传递系统,可以选择ActiveMQ或RocketMQ。而如果只需简单的发布订阅功能,Redis的发布订阅是个不错的选择。