redis发布订阅

article/2025/9/11 9:22:12

目录

一、概要

二、特点

三、发布及订阅功能

四、Redis发布订阅命令

五、php实现redis发布-订阅

1、消息发布端

2、消息订阅端

六、订阅发布使用场景

七、在订阅时遇到错误

八、模式匹配(正则匹配)订阅


一、概要

        Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。

        Redis 发布订阅(pub/sub)实现了消息系统,发送者(在redis术语中称为发布者)在接收者(订阅者)接收消息时发送消息。传送消息的链路称为信道。

在Redis中,客户端可以订阅任意数量的信道。

  • 消息发布

  • 消息订阅

 

 

二、特点

        发送者(发布者)不是计划发送消息给特定的接收者(订阅者)。而是发布的消息分到不同的频道,不需要知道什么样的订阅者订阅。

        订阅者对一个或多个频道感兴趣,只需接收感兴趣的消息,不需要知道什么样的发布者发布的。

这种发布者和订阅者的解耦合可以带来更大的扩展性和更加动态的网络拓扑。

三、发布及订阅功能

1、 基于事件的系统中,Pub/Sub是目前广泛使用的通信模型,它采用事件作为基本的通信机制,提供大规模系统所要求的松散耦合的交互模式:订阅者(如客户端)以事件订阅的方式表达出它有兴趣接收的一个事件或一类事件;发布者(如服务器)可将订阅者感兴趣的事件随时通知相关订阅者。

2、 消息发布者,即publish客户端,无需独占链接,你可以在publish消息的同时,使用同一个redis-client链接进行其他操作(例如:INCR等)

3、 消息订阅者,即subscribe客户端,需要独占链接,即进行subscribe期间,redis-client无法穿插其他操作,此时client以阻塞的方式等待“publish端”的消息;这一点很好理解,因此subscribe端需要使用单独的链接,甚至需要在额外的线程中使用。

# 订阅一个redisChat频道redis 127.0.0.1:6379> SUBSCRIBE redisChat  
Reading messages... (press Ctrl-C to quit) 
1) "subscribe" 
2) "redisChat" 
3) (integer) 1#发布消息到redisChat频道,发布成功后,订阅者会收到信息
redis 127.0.0.1:6379> PUBLISH redisChat "Redis is a great caching technique"  
(integer) 1  
redis 127.0.0.1:6379> PUBLISH redisChat "Learn redis by yiibai"  
(integer) 1   
1) "message" 
2) "redisChat" 
3) "Redis is a great caching technique" 
1) "message" 
2) "redisChat" 
3) "Learn redis by yiibai"

四、Redis发布订阅命令

PUBLISH channel message	        #将信息发送到指定的频道。
SUBSCRIBE channel [channel …]	#订阅给定的一个或多个频道的信息。
UNSUBSCRIBE [channel [channel …]]	#退订给定的频道。PSUBSCRIBE pattern [pattern …]	#订阅一个或多个符合给定模式的频道。根据模式来订阅,可以订阅许多频道
PUNSUBSCRIBE [pattern [pattern …]]	#退订所有给定模式的频道。PUBSUB subcommand [argument [argument …]]	#查看订阅与发布系统状态。

五、php实现redis发布-订阅

1、消息发布端

<?php//消息发布
$redis = new Redis();
// 第一个参数为redis服务器的ip,第二个为端口
$res = $redis->connect('121.41.88.209', 6379);
// test为发布的频道名称,hello,world为发布的消息
$res = $redis->publish('test','hello,world'.rand(00000,99999));

2、消息订阅端

<?php//消息订阅端
$redis = new Redis();
$res = $redis->pconnect('121.41.88.209', 6379);
$redis->setOption(\Redis::OPT_READ_TIMEOUT,-1);
$redis->subscribe(array('test'), 'callback');// 回调函数,这里写处理逻辑
function callback($instance, $channelName, $message) {echo $channelName, "==>", $message,PHP_EOL;
}

六、订阅发布使用场景

        使用订阅频道达到解耦作用,场景:用户编辑某个模块需要清除缓存,可以在编辑模块后发布到频道,然后订阅该模块的清除缓存

七、在订阅时遇到错误

在命令执行redis订阅端脚本时,发现在终端会输出:

PHP Fatal error:  Uncaught exception 'RedisException' with message 'read error on connection' in …

这个错误大概的意思就是遇到了一个未捕获的异常:RedisException,消息读取错误当连接的时候。 应该是redis的客户端读取超时原因导致。 很多人在github上留言能不能提供一个类似php的pconnect的接口,但是貌似redis官方对这个没有一个官方的解决办法。

错误解决办法(以下3种办法):

【1】设置,default_socket_time = -1 但是本机测试的时候,应该是版本不一样的原因,直接报错:

redis server went away

【2】给redis connect的时候( pconnect( host,port = 6379, $timeout = 0.0 ))给timeout设置一个较大的值。

【3】通过Redis自带的常量设置

$redis->setOption(Redis::OPT_READ_TIMEOUT, -1);

八、模式匹配(正则匹配)订阅

Redis 的Pub/Sub实现支持模式匹配。

客户端可以订阅全风格的模式以便接收所有来自能匹配到给定模式的频道的消息。

比如,将接收所有发到 test.name,test.phone,test.address...等等的消息,该这样写:

PSUBSCRIBE test.*

在终端回车后,同时再新的窗口里分别发布两个频道的消息,名字分别为:test.name和test.phone,然后切换到订阅端的窗口里,结果如下

127.0.0.1:6379> PUBLISH test.name hehe
(integer) 1
127.0.0.1:6379> PUBLISH test.name haha
(integer) 1

由上图可以看出,在订阅了test.*频道后,一共收到了 test.name和test.phone两个频道的消息,这就是模式匹配订阅。

3) "test.name"
4) "haha"

那么取消订阅匹配该模式的客户端也比较简单:

PUNSUBSCRIBE test.*

注意:不能在redis-cli中使用PUNSUBSCRIBE 取消退订,没有效果,指的是在php这些脚本中


http://chatgpt.dhexx.cn/article/0Llt7PuG.shtml

相关文章

springboot 整合使用redis发布订阅功能

前言 发布订阅作为一种设计思想在很多开源组件中都有体现,比如大家熟知的消息中间件等,可谓把发布订阅这一思想体现的淋漓尽致了; 一、redis发布订阅简介 Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收信息。可以参考下面两张图进…

Redis进阶——发布订阅详解

什么是发布订阅&#xff1f; Redis 发布订阅(pub/sub)是一种消息通信模式&#xff1a;发送者(pub)发送消息&#xff0c;订阅者(sub)接收消息。 Redis 的 subscribe 命令可以让客户端订阅任意数量的频道&#xff0c; 每当有新信息发送到被订阅的频道时&#xff0c; 信息就会被发…

Redis 的发布与订阅

3、Redis 的发布与订阅 3.1、发布与订阅简述 Redis提供了基于“发布/订阅”模式的消息机制。此种模式下&#xff0c;消息发布者和订阅者不进行直接通信&#xff0c;发布者客户端向指定的频道&#xff08;channel&#xff09; 发布消息&#xff0c;订阅该频道的每个客户端都可…

6. Redis 发布与订阅

文章目录 6. Redis 发布与订阅为什么需要发布、订阅发布/订阅如何使用&#xff1f; :one:基于频道发布SUBSCRIBE&#xff1a;频道订阅PUBLISH&#xff1a;向频道发送消息UNSUBSCRIBE&#xff1a;退订频道 :two: 基于模式(pattern)的发布/订阅PSUBSCRIBE&#xff1a;模式订阅PUB…

Redis的发布订阅

Redis的发布订阅&#xff08;pub/sub&#xff09;是一种消息通信模式&#xff0c;发送者&#xff08;pub&#xff09;发送信息&#xff0c;订阅者&#xff08;sub&#xff09;接收信息。Redis客户端可以订阅任意数量的频道。Pub/Sub 从字面上理解就是发布&#xff08;Publish&a…

Redis数据库的发布与订阅(详细讲解)

一、实验目的 了解Redis数据库的发布与订阅 二、发布与订阅 1.1什么是发布和订阅 发布订阅是一对多的关系&#xff0c;需要有信息的发布者和消息的收听者。 发布者&#xff1a;提供某个内容或主题&#xff0c;把内容信息发送给多个对此内容感兴趣的订阅者 订阅者&#xff…

Redis发布和订阅

一、什么是Redis发布和订阅 Redis的发布(pub)和订阅(sub)是一种消息通信模式。它包含有三个角色分别是&#xff1a;发送者、订阅者、频道。 Redis客户端可以订阅多个任意的频道。 Redis发布和订阅的结构图&#xff1a; 发送者&#xff1a;用于发送消息 订阅者&#xff1a;订阅…

Redis--发布订阅--原理/使用场景

原文网址&#xff1a;Redis--发布订阅--原理/使用场景_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Redis的发布订阅功能。 Redis发布订阅简述 Redis提供了基于“发布/订阅”模式的消息机制。此种模式下&#xff0c;消息发布者和订阅者不进行直接通信&#xff0c;发布者客户端…

php查netstat,netstat怎么查看端口状态

netstat查看端口状态的方法&#xff1a;首先打开终端命令窗口&#xff1b;然后通过命令“netstat -ntlp”查看当前所有tcp端口&#xff1b;最后通过“netstat -ntulp | grep 80”命令查看所有80端口使用情况即可。 本教程操作环境&#xff1a;linux5.9.8系统&#xff0c;DELL G…

Linux系统使用ss命令查看端口状态

Linux系统使用ss命令查看端口状态 Linux系统使用ss命令查看端口状态 目录 1.可用工具 2.ss帮助 2.1 选项分类说明 2.2 过滤选项family 2.3 过滤选项state 2.4 状态之间的关系 3.ss的使用 3.1 使用示例 3.2 过滤 3.2.1 状态过滤 3.2.2 通过family过滤 3.2.3 使用地址和端口过滤 …

Win7怎样查看端口状态

在Win7系统中&#xff0c;查看端口状态可以采用以下两种方法&#xff1a; 1.netstat 先单击“开始”&#xff0c;再单击“运行”&#xff0c;输入"cmd"&#xff0c;进入DOS窗口。输入命令"netstat -na"&#xff0c;按回车&#xff0c;就会显示本机连接情况…

Linux查看端口状态

在Linux使用过程中&#xff0c;需要了解当前系统开放了哪些端口&#xff0c;并且要查看开放这些端口的具体进程和用户&#xff0c;可以通过netstat命令进行简单查询 netstat命令各个参数说明如下&#xff1a; -t : 指明显示TCP端口   -u : 指明显示UDP端口   -l : 仅显示…

php 查看端口配置信息,查看端口状态的命令是什么

查看端口状态的命令是“netstat”&#xff0c;其语法是“netstat -ntlp”&#xff0c;netstat命令一般用于检验本机各端口的网络连接情况&#xff0c;netstat是在内核中访问网络及相关信息的程序&#xff0c;它能提供TCP连接&#xff0c;TCP和UDP监听等相关报告。 linux系统中查…

通过查看端口状态查看mongodb是否已经启动

LINUX环境下&#xff0c;可以通过查看端口27017的状态查看mongod是否已经启动。 netstat -lanp | grep "27017" 可以看到已经启动了mongod服务。 然后关闭mongod服务 sudo service mongod stop 可以看到端口状态发生了变化 再开启服务 sudo service mongod star…

Linux查看端口状态及 查看与其他主机的联通状态 命令

目录 netstat Telnet netstat 在Linux使用过程中&#xff0c;需要了解当前系统开放了哪些端口&#xff0c;并且要查看开放这些端口的具体进程和用户&#xff0c;可以通过netstat命令进行简单查询 netstat命令各个参数说明如下&#xff1a; -t : 指明显示TCP端口 -u : 指明…

Ubuntu开放端口及其查看端口开放状态

前言 在服务器部署应用的时候&#xff0c;我们经常要查看这个应用是否部署成功&#xff0c;而一般就是通过ip 端口的方式在浏览器上进行查看默认的一些页面是否出现当页面没有出现的情况下&#xff0c;不一定是应用没启动成功&#xff0c;可能是因为端口未开放出去&#xff0…

netstat查看端口状态

netstat&#xff08;network status网络状态&#xff09;命令各个参数说明如下&#xff1a; -t : 指明显示TCP端口&#xff0c;t是TCP的首字母。 -u : 指明显示UDP端口&#xff0c;u是UDP的首字母 -l : 仅显示监听套接字(所谓套接字就是使应用程序能够读写与收发通讯协议(proto…

Netstat查看端口状态,netstat命令详解

netstat命令详解 概述Netstat查看端口状态 概述 netstat命令是一个监控TCP/IP网络的非常有用的工具&#xff0c;它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。 Netstat查看端口状态 1、点击左下角的【开始】&#xff0c;找到运行&#xff0c;或是直接…

聊聊linux查看服务和端口状态命令netstat

使用netstat命令可以查看linux系统中正在使用的服务和端口情况 常见参数 -a (all)显示所有选项&#xff0c;默认不显示LISTEN相关 -t (tcp)仅显示tcp相关选项 -u (udp)仅显示udp相关选项 -n 拒绝显示别名&#xff0c;能显示数字的全部转化成数字。 -l 仅列出有在 Listen (监听…

linux中查看端口状态以及是否被占用的相关操作指令(netstat、isof)

linux中查看端口状态 linux中查看端口状态1、netstat1.1、查看服务器上服务和端口1.2、查看某个端口是否被占用 2、lsof&#xff1a;进程打开文件的相关信息2.1、列出80端口目前打开的文件列表2.2、列出所有的网络连接2.3、查看进程打开了某个文件2.4、查看某个用户打开的所有文…