当前位置:网站首页>【redis】发布和订阅消息
【redis】发布和订阅消息
2022-07-31 13:28:00 【冰冷的希望】
1.说明
在Redis2版本之后支持发布订阅功能,发布者创建一个频道,并在上面发送消息,所有订阅该频道的客户端都能收到消息(不出意外的情况下,但实际不一定),发布订阅的好处是减少不必要的轮询,应用场景有即时聊天室、公众号订阅等。但Redis适合小型应用,如果是大型架构,相信还是会使用rabbitMQ或者kafka等更专业的MQ队列软件。
Redis-server内部会维护一个字典,键是频道名,值是一个存储订阅者的链表,每次发布消息都会遍历该链表进行推送。
2.订阅发布
我们打开一个redis终端,使用subscribe命令订阅频道,你不妨多打开几个终端同时订阅同一个频道,比如说我这里打开两个终端都订阅叫做chatChannel的频道
# 订阅格式:subscribe 频道名
127.0.0.1:6379> subscribe chatChannel
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "chatChannel"
3) (integer) 1
再打开一个终端,使用publish命令发布消息,这样订阅该频道的终端都会打印结果
# 发布格式:publish 频道名 消息
127.0.0.1:6379> publish chatChannel "hello"
(integer) 2
结果如下图
每个客户端是可以同时订阅多个频道的,即subscribe参数指定多个频道,另外也可以使用psubscribe命令订阅多个频道(好像称为模式),支持正则表达式
# 同时订阅 频道1、频道2、频道3
subscribe 频道1 频道2 频道3
# 订阅所有以“chat”开头的频道
psubscribe chat*
如果想要取消订阅的话可以使用unsubscribe和punsubscribe命令,用法是命令后面加上频道或匹配模式
3.代码实现
订阅消息,比如说订阅3次之后取消订阅
from redis import Redis
r = Redis(host='localhost', port=6379, db=0)
p = r.pubsub() # 如果不想接收其他一些信息可以把参数ignore_subscribe_messages改为True
p.subscribe("testChannel") # 如果想要同时订阅多个频道,可以传入多个参数
# p.psubscribe("test*") # 模式匹配
i = 0
while True:
msg = p.get_message()
if msg:
print("来电了: ", msg)
i += 1
if i > 2:
break
# 取消订阅
p.unsubscribe()
# p.punsubscribe()
p.close()
r.close()
发布消息比较简单
from redis import Redis
r = Redis(host='localhost', port=6379, db=0)
r.publish('testChannel', 'hello everybody')
r.close()
边栏推荐
- Istio微服务治理网格的全方面可视化监控(微服务架构展示、资源监控、流量监控、链路监控)
- Sliding window method to segment data
- 自制的数据库安全攻防题,相关靶机自己制作
- Save and load numpy matrices and vectors, and use the saved vectors for similarity calculation
- 查看Oracle数据库的用户名和密码
- ECCV 2022 | Robotic Interaction Perception and Object Manipulation
- 报错:npm ERR code EPERM
- 技能大赛训练题:域用户和组织单元的创建
- PartImageNet物体部件分割(Semantic Part Segmentation)数据集介绍
- Selenium自动化测试之Selenium IDE
猜你喜欢
VU 非父子组件通信
20.nn.Module
IDEA连接MySQL数据库并执行SQL查询操作
抓住金三银四的尾巴,解锁程序员面试《刷题神器》
ECCV 2022 | Robotic Interaction Perception and Object Manipulation
CLion用于STM32开发
Invalid bound statement (not found)出现的原因和解决方法
3.爬虫之Scrapy框架1安装与使用
Detailed explanation of network protocols and related technologies
The batch size does not have to be a power of 2!The latest conclusions of senior ML scholars
随机推荐
推荐系统-召回阶段-2013:DSSM(双塔模型)【Embedding(语义向量)召回】【微软】
网络协议及相关技术详解
sqlalchemy determines whether a field of type array has at least one consistent data with an array
Error IDEA Terminated with exit code 1
机器学习模型验证:被低估的重要一环
C#中+=的用法
SAP 电商云 Spartacus UI 和 Accelerator UI 里的 ASM 模块
[CPU Design Practice] Simple Pipeline CPU Design
[RPI]树莓派监控温度及报警关机保护「建议收藏」
49.【拷贝构造函数与重载】
EXCEL如何快速拆分合并单元格数据
深度剖析 Apache EventMesh 云原生分布式事件驱动架构
Introduction to using NPM
计算机复试面试问题(计算机面试常见问题)
ECCV2022:在Transformer上进行递归,不增参数,计算量还少!
csdn发文助手问题
Spark学习:为Spark Sql添加自定义优化规则
A detailed explanation of the usage of Async and Await in C#
Error: npm ERR code EPERM
The latest complete code: Incremental training using the word2vec pre-training model (two loading methods corresponding to two saving methods) applicable to various versions of gensim