首页 > 数据库 >Redis基础篇 - Pub/Sub发布订阅

Redis基础篇 - Pub/Sub发布订阅

时间:2024-08-26 09:26:31浏览次数:9  
标签:订阅 频道 Sub Redis Pub 消息

文章目录

1 关于Pub/Sub发布订阅

在软件架构中,发布/订阅(Publish–subscribe pattern)指的是一种消息范式:

  1. 发布者向消息代理人发布主题(Topic)和消息。
  2. 订阅者向消息代理人订阅主题和接收消息。
  3. 消息代理人保存发布者、订阅者和主题之间的关系。当有新消息发布时,消息代理人将会把消息转发给相应的订阅者。

发布-订阅系统具有低耦合、可扩展性好等优点。

而Redis的内部设计非常适合于实现发布-订阅系统,因此,发布-订阅功能被当作Redis的一个热点功能被推出。在Redis系统中,发布者和订阅者都是Redis的客户端或者Redis应用程序,而消息代理人为Redis服务器。
Redis 发布订阅

2 Redis Pub/Sub的基础操作

2.1 基础操作命令

Redis Pub/Sub基础操作的相关命令如下:

  • PUBLISH channel message:发布者发布消息到指定的频道
  • SUBSCRIBE channel [channel ...]:客户端订阅指定的频道。
  • UNSUBSCRIBE [channel [channel ...]]:客户端取消对给定频道的订阅,如果没有指定频道,表示取消对所有频道的订阅。

2.2 操作示例

在示例中,我们需要实现如同所示的操作:
在这里插入图片描述

  1. 订阅者们订阅指定的频道(以2号订阅者为例)
    127.0.0.1:6379> subscribe channelA channelB
    Reading messages... (press Ctrl-C to quit)
    1) "subscribe"
    2) "channelA"
    3) (integer) 1
    1) "subscribe"
    2) "channelB"
    3) (integer) 2
    
  2. 发布者们发布消息到指定的频道(以发布者1为例)
    127.0.0.1:6379> publish channelA msg_1
    (integer) 2
    127.0.0.1:6379> publish channelB msg_2
    (integer) 2
    

最终结果
在这里插入图片描述

3 使用模式(pattern)订阅

3.1 使用模式匹配

Redis Pub/Sub 支持使用glob 样式的模式匹配进行订阅,客户端使用模式匹配进行订阅后,所有发送到频道名称与给定模式匹配的频道上的消息,都会被客户端接收到。

glob样式举例:

  • h?llo subscribes to hello, hallo and hxllo
  • h*llo subscribes to hllo and heeeello
  • h[ae]llo subscribes to hello and hallo, but not hillo

使用模式订阅涉及到这两个命令:

  • PSUBSCRIBE pattern [pattern ...]:让客户端订阅指定模式(pattern)的频道.
  • PUNSUBSCRIBE [pattern [pattern ...]]:取消客户端对给定模式的频道的订阅,如果没有给出,则取消订阅所有模式。

操作示例:
在这里插入图片描述

3.2 模式匹配的消息格式

从示例中我们看到,使用模式匹配订阅的客户端,收到的消息格式是不一样的:

  • 消息类型为pmessage
  • 第二个元素是匹配的原始模式
  • 第三个元素是原始频道的名称
  • 最后一个元素是实际的消息

3.3 如果同时匹配了多个呢?

按照上文说的,一个客户端可以订阅多个模式/频道,那么如果一个频道名称和多个模式/频道匹配呢?
比如,一个客户端执行了下面的这两个订阅操作:

SUBSCRIBE foo
PSUBSCRIBE * f*

这时,如果一条消息发送到通道 foo,客户端将收到三条消息:

  • 一条message消息
  • 一条匹配了模式*的pmessage消息
  • 一条匹配了模式f*的pmessage消息

4 分片 Pub/Sub

这部分就不详细介绍了,一般Redis Pub/Sub都是用在比较简单的系统里面,个人觉得应该很少人用到这部分内容。所以就贴一下官网原文做个简单介绍吧。

从 Redis 7.0 开始,引入了分片的发布/订阅(sharded Pub/Sub)功能,其中分片的频道由与分配键到槽的相同算法来分配。分片消息必须发送到拥有被散列到的分片频道槽的节点。集群确保已发布的分片消息转发到分片中的所有节点,因此客户端可以通过连接到负责该槽的主节点或任何副本来订阅分片频道。SSUBSCRIBE、SUNSUBSCRIBE和SPUBLISH用于实现分片的发布/订阅。

分片的发布/订阅有助于在集群模式下扩展发布/订阅的使用。它限制了消息的传播范围在集群的分片内。因此,与全局发布/订阅相比,通过集群总线传递的数据量受到限制,其中每条消息传播到集群中的每个节点。这使用户可以通过添加更多分片来水平扩展发布/订阅的使用。

原文:From Redis 7.0, sharded Pub/Sub is introduced in which shard channels are assigned to slots by the same algorithm used to assign keys to slots. A shard message must be sent to a node that owns the slot the shard channel is hashed to. The cluster makes sure the published shard messages are forwarded to all nodes in the shard, so clients can subscribe to a shard channel by connecting to either the master responsible for the slot, or to any of its replicas. SSUBSCRIBE, SUNSUBSCRIBE and SPUBLISH are used to implement sharded Pub/Sub.

Sharded Pub/Sub helps to scale the usage of Pub/Sub in cluster mode. It restricts the propagation of messages to be within the shard of a cluster. Hence, the amount of data passing through the cluster bus is limited in comparison to global Pub/Sub where each message propagates to each node in the cluster. This allows users to horizontally scale the Pub/Sub usage by adding more shards.

5 Redis Pub/Sub的一些特性

5.1 消息传递语义Delivery semantics

Redis Pub/Sub的消息传递语义为 at-most-once(最多一次): 消息最多会被传递一次。一旦 Redis 服务器发送了消息,就不会再次发送。如果订阅者无法处理消息(例如,由于错误或网络断开),该消息将永远丢失。

如果需要更强的传递保证,可以考虑使用Redis Streams流。流中的消息是持久化的,并支持 at-most-once至多一次和at-least-once至少一次的传递语义。Redis Streams提供了更灵活和可靠的消息传递机制,适用于对消息传递的可靠性要求更高的应用场景。

5.2 推送消息的格式

推送的消息是一个包含三个元素的数组回复(array_reply),其中第一个元素是消息的类型,根据消息类型的不同,后面两个元素代表不同的含义:

  • subscribe:意味着我们成功订阅了回复中第二个元素给出的频道。第三个参数代表我们当前订阅的频道数量。
    # 订阅频道
    1) "subscribe"
    2) "quene"
    3) (integer) 1
    
  • unsubscribe:意味着我们成功取消了回复中作为第二个元素给出的频道的订阅。第三个参数代表我们当前订阅的频道数量。当最后一个参数为零时,我们不再订阅任何频道,并且客户端可以发出任何类型的 Redis 命令,因为我们处于 Pub/Sub 状态之外。
  • message:一位置我们收到了另一个客户端发出的消息。第二个元素是原始通道的名称,第三个参数是实际的消息负载。
    # 收到消息
    1) "message"
    2) "quene"
    3) "11111"
    

5.3 推送消息的范围

Pub/Sub(发布/订阅)与键空间没有关系。它被设计为在任何层面都不会干扰键空间,包括数据库编号。Pub/Sub提供了一种独立于键空间操作的消息传递机制,用于实现消息的发布和订阅,与数据库的操作是独立的。

Pub/Sub has no relation to the key space. It was made to not interfere with it on any level, including database numbers.

比如:在db10上向频道channelA上发布消息,db0上订阅channelA的客户端也能收到消息。

如果需要某种范围界定,可以通道前添加环境名称(testing、staging、product…)。

参考文档

标签:订阅,频道,Sub,Redis,Pub,消息
From: https://blog.csdn.net/ChineHe/article/details/141394630

相关文章

  • Redis 基础
    1.初始Redis1.1认识NoSQLNoSql可以翻译做NotOnlySql(不仅仅是SQL),或者是NoSql(非Sql的)数据库。是相对于传统关系型数据库而言,有很大差异的一种特殊的数据库,因此也称之为非关系型数据库。1.1.1结构化与非结构化‍​​1.1.2关系型与非关系型的差异存储方式关系型数据......
  • Redission源码浅析一:RedissonLock.lock与RedissonLock.tryLock
    RedissonLock.lock入口流程图源码分析redisssionLock.lock(longleaseTime,TimeUnitunit,booleaninterruptibly)privatevoidlock(longleaseTime,TimeUnitunit,booleaninterruptibly)throwsInterruptedException{//获取当前线程的IDlongthr......
  • Redis源码浅析二:命令执行
    1.入口:readQueryFromClient在redis启动的时候,我们还要关注一个重点,在initServer的时候,会执行aeCreateFileEvent,这里我们还有深入学习一下记住这个readQueryFromClient,它是clientrequest到server端处理的入口,有点类似于netty里面的入栈处理器2.readQueryFromClient......
  • redis下载与安装(以Ubuntu Linux为例)
    redis的下载与安装(Ubuntu)一、下载从GitHub上下载redis官方压缩包:redis官方将下载好的压缩包放入家目录(~)下。(可以使用一些ftp工具将文件传输到Ubuntu)二、安装解压并执行shell命令#进入家目录cd~#7.4.0是我此时安装的版本#输入tarzxvfredis后按tab键补全即可......
  • redis操作
    ``1、string—Strings使用场景:计数器setnameqiyegetnamekeys*查看所有的KEYappappendname1jack2getnameappendnamejackgetnamedelname删除设置多个msetname1jack1name2jack2查看多个mgetname1name2自加:incr自减:decr加:incrby......
  • redis常用命令
    目录一、redis常用的数据类型二、各种数据类型特点​三、redis常用命令字符串操作命令​编辑 哈希常用命令列表常用命令集合操作命令有序集合常用命令通用命令一、redis常用的数据类型二、各种数据类型特点三、redis常用命令字符串操作命令 哈希常用命令列......
  • 【通俗易懂】一篇文章带你了解Redis缓存击穿、缓存穿透、缓存雪崩
    目录一、什么是缓存击穿、缓存穿透、缓存雪崩?二、解决方法2.1缓存击穿异步定时更新互斥锁2.2缓存穿透缓存空值布隆过滤器BloomFilter2.3缓存雪崩设置不同的过期时间集群热点数据永不过期一、什么是缓存击穿、缓存穿透、缓存雪崩?缓存击穿:是指当某一个key的......
  • 利用 Redis Sorted Set 实现高性能排行榜
    文章目录背景使用MySQL实现排行榜实现思路优点弊端复现1)建表2)使用navicat生成500w数据3)直接使用`orderby`查询4)优化:对score添加索引Redis的SortedSet什么是SortedSetSortedSet常用命令使用示例1)添加数据2)查看前五名3)查看具体分数4)查看具体排名5)对排名......
  • Redis 数据类型详解
    Redis是一个开源的内存数据结构存储系统,广泛应用于缓存、消息队列、实时数据分析等场景。Redis提供了多种数据类型,本文将详细介绍Redis的五种主要数据类型及其应用场景,并从概述、基本操作、应用场景和数据结构等方面进行深入探讨。1.字符串(String)概述字符串是Redis......
  • awk打印除某数据项/某列数/某些列数之外其它列数据的实现以及Twemproxy(redis集群方案
    一、awk打印除某数据项/某列数/某些列数之外其它列数据的实现        偶尔碰到一个需求,我需要使用awk打印数据,但是只需要打印某列之后的其它列,比如我只要第2列及之后的所有数据,如何实现呢?实际很简单:#将$1置成空,然后打印即可awk'{$1="";print}'filepathawk'{$1......