做论坛网站用什么系统,湖南建筑网,php网站开发最新需求,淘宝城购物中心在现代的软件开发中#xff0c;数据存储和管理是至关重要的一环。Redis#xff0c;作为一个开源的、内存中的数据结构存储系统#xff0c;以其出色的性能和灵活的数据结构#xff0c;赢得了开发者们的广泛喜爱。它不仅可以用作数据库#xff0c;还可以用作缓存和消息代理。… 在现代的软件开发中数据存储和管理是至关重要的一环。Redis作为一个开源的、内存中的数据结构存储系统以其出色的性能和灵活的数据结构赢得了开发者们的广泛喜爱。它不仅可以用作数据库还可以用作缓存和消息代理。今天我们要探讨的是 Redis 中一个强大的功能——发布订阅模式。 发布订阅模式是一种消息通信模式发送者发布者发送消息订阅者接收消息。在 Redis 中客户端可以订阅任意数量的频道当有新消息通过 PUBLISH 命令发送给频道时这个消息会被发送给订阅它的所有客户端。 在接下来的文章中我们将详细介绍 Redis 的发布订阅模式包括它的工作原理如何使用以及一些常见的使用场景。无论你是刚接触 Redis还是已经有一定的使用经验我相信你都能从这篇文章中学到一些新的知识。 文章目录 [toc]1、Redis发布订阅介绍1.1、Redis发布订阅概述1.2、Redis发布订阅与消息队列的区别 2、Redis发布订阅的原理2.1、Redis实现发布订阅的原理2.2、Redis实现发布订阅的底层结构 3、发布订阅的命令3.1、SUBSCRIBE命令3.2、UNSUBSCRIBE命令3.3、PUBLISH命令
1、Redis发布订阅介绍
1.1、Redis发布订阅概述
Redis 的发布订阅Pub/Sub是一种消息通信模式发送者pub发送消息订阅者sub接收消息。Redis 客户端可以订阅任意数量的频道。当有新消息通过 PUBLISH 命令发送给频道时这个消息会被发送给订阅它的所有客户端 1.2、Redis发布订阅与消息队列的区别
Redis的发布订阅Pub/Sub和消息队列是两种不同的消息传递模式它们的主要区别在于消息的处理方式和使用场景。
消息的处理方式
在 Redis 的发布订阅模式中消息是即时的也就是说当消息发布后只有当前在线且订阅了该频道的客户端才能收到这个消息消息不会被存储一旦发布当前没有在线的客户端将无法接收到这个消息。在消息队列中消息是持久化的消息被发送到队列后会一直在队列中等待被消费即使没有在线的消费者消息也不会丢失消费者下次上线后可以继续从队列中获取到消息。
使用场景
Redis 的发布订阅模式通常用于实现实时消息系统比如实时聊天、实时推送通知等。消息队列通常用于异步处理解耦复杂系统比如电商系统中的下单、支付、库存处理等操作通过消息队列可以使这些操作异步处理提高系统的响应速度。
总的来说Redis 的发布订阅模式更适合实时、必须立即处理的场景而消息队列更适合异步处理、耗时操作的场景。 2、Redis发布订阅的原理
2.1、Redis实现发布订阅的原理
Redis 的发布订阅Pub/Sub模式的原理主要涉及到三个命令SUBSCRIBEUNSUBSCRIBE 和 PUBLISH。 SUBSCRIBE 命令当客户端发送 SUBSCRIBE 命令订阅一个或多个频道时Redis 服务器会将这些频道添加到该客户端的订阅频道列表中并向客户端返回一个确认订阅的消息。 UNSUBSCRIBE 命令当客户端发送 UNSUBSCRIBE 命令退订一个或多个频道时Redis 服务器会将这些频道从客户端的订阅频道列表中移除并向客户端返回一个确认退订的消息。 PUBLISH 命令当客户端发送 PUBLISH 命令发布消息到某个频道时Redis 服务器会查找所有订阅了这个频道的客户端并将消息发送给这些客户端。
在 Redis 的内部实现中服务器维护了一个字典字典的键是频道的名字字典的值是一个链表链表中存储了所有订阅了这个频道的客户端。当有新消息发布到某个频道时服务器只需要查找这个字典就可以快速找到需要接收这个消息的所有客户端。
这种实现方式使得 Redis 的发布订阅模式具有很高的效率可以支持大量的客户端同时订阅同一个频道。
2.2、Redis实现发布订阅的底层结构
Redis 的发布订阅Pub/Sub模式的底层结构主要包括两个部分客户端结构和服务器的Pub/Sub结构。
客户端结构每个 Redis 客户端都有一个 pubsub_channels 和 pubsub_patterns 两个属性分别用于存储该客户端订阅的频道和模式。 pubsub_channels这是一个字典键是订阅的频道名值是NULL。当客户端订阅一个新的频道时频道名会被添加到这个字典中当客户端退订一个频道时频道名会从这个字典中删除。 pubsub_patterns这是一个链表存储了所有订阅的模式。每个模式都是一个 redisPubSubPattern 结构包含了模式本身和订阅这个模式的客户端。
服务器的Pub/Sub结构Redis 服务器维护了一个 pubsub_channels 字典和一个 pubsub_patterns 链表用于存储所有的频道和模式。 pubsub_channels这是一个字典键是频道名值是一个链表链表中存储了所有订阅了这个频道的客户端。当有新消息发布到这个频道时服务器会遍历这个链表将消息发送给所有的客户端。 pubsub_patterns这是一个链表存储了所有的模式。每个模式都是一个 redisPubSubPattern 结构包含了模式本身和订阅这个模式的客户端。当有新消息发布时服务器会遍历这个链表查找所有匹配的模式并将消息发送给订阅了这些模式的客户端。
通过这种方式Redis 实现了发布订阅模式使得消息的发布和订阅变得非常高效。 3、发布订阅的命令
3.1、SUBSCRIBE命令
SUBSCRIBE 用于订阅一个或多个频道的信息。
命令格式SUBSCRIBE channel [channel ...]
channel需要订阅的频道名称可以是一个或多个。
当客户端发送 SUBSCRIBE 命令订阅一个或多个频道时服务器会接收到这个命令并将这些频道添加到客户端的订阅列表中。然后服务器会向客户端返回一个消息确认已经订阅了这些频道。
一旦客户端订阅了一个频道它就会持续监听这个频道直到客户端发送 UNSUBSCRIBE 命令取消订阅或者客户端断开连接。
当有新消息发布到这个频道时服务器会将这个消息发送给所有订阅了这个频道的客户端。
例如客户端可以发送如下命令订阅名为 mychannel 的频道
SUBSCRIBE mychannel服务器会返回如下消息
1) subscribe
2) mychannel
3) (integer) 1这表示客户端已经成功订阅了 mychannel 频道。
3.2、UNSUBSCRIBE命令
UNSUBSCRIBE 是 Redis 发布订阅模式中的一个命令用于退订一个或多个频道的信息。
命令格式UNSUBSCRIBE [channel [channel ...]]
channel需要退订的频道名称可以是一个或多个。如果没有指定频道则会退订所有频道。
当客户端发送 UNSUBSCRIBE 命令退订一个或多个频道时服务器会接收到这个命令并将这些频道从客户端的订阅列表中移除。然后服务器会向客户端返回一个消息确认已经退订了这些频道。
例如客户端可以发送如下命令退订名为 mychannel 的频道
UNSUBSCRIBE mychannel服务器会返回如下消息
1) unsubscribe
2) mychannel
3) (integer) 0这表示客户端已经成功退订了 mychannel 频道。如果客户端再次收到 mychannel 频道的消息那么这些消息将会被忽略。
3.3、PUBLISH命令
PUBLISH 是 Redis 发布订阅模式中的一个命令用于将消息发送到指定的频道。
命令格式PUBLISH channel message
channel消息需要发送到的频道名称。message需要发送的消息内容。
当客户端发送 PUBLISH 命令发布消息到某个频道时服务器会接收到这个命令并将消息发送给所有订阅了这个频道的客户端。
例如客户端可以发送如下命令向名为 mychannel 的频道发布一条消息
PUBLISH mychannel hello服务器会返回一个整数表示消息成功发送到的客户端数量。例如
(integer) 1这表示消息已经成功发送到了 1 个客户端。如果没有客户端订阅这个频道那么这个命令将不会有任何效果。