【Redis—12】Redis发布和订阅(Python实现)

版权声明:作者:人学物理死的早 出处:https://blog.csdn.net/weixin_39561473 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。 https://blog.csdn.net/weixin_39561473/article/details/89284443

一、什么是发布订阅

在软件架构中,发布订阅是一种消息范式,消息的发送者(称为发布者)不会将消息直接发送给特定的接收者(称为订阅者)。而是将发布的消息分为不同的类别,无需了解哪些订阅者(如果有的话)可能存在。同样的,订阅者可以表达对一个或多个类别的兴趣,只接收感兴趣的消息,无需了解哪些发布者(如果有的话)存在。

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

发布订阅也叫生产者消费者模式,是实现消息队列的一种方式:

  • 消息队列的三要素
    • 1、生产者producer
    • 2、消费者consumer
    • 3、消息服务broker

发布订阅关系图

  • A:生产者/发布
  • Message:消息队列
  • B:消费者/订阅

Redis发布图和订阅图:

channel1就是消息队列

扫描二维码关注公众号,回复: 5881848 查看本文章

二、如何实现发布订阅

1、命令行实现

开启4个redis客户端,如一节的上图,3个客户端作为消息订阅者,1个为消息发布者:./redis-cli 

让3个消息订阅者订阅某个频道主题:subscribe newspaper

  • 如果是订阅匹配模式的频道主题:psubscribe chan*  (表示匹配以chan开头的频道主题)
    注意命令是psubscribe,有个p字母

让1个消息发布者向频道主题上发布消息:publish channel message

然后观察消息的发布和订阅情况

订阅获取的有三条信息

  1. type:message  #类型为message
  2. channel:newspaper  #频道为newspaper
  3. data:xxxxxx  #数据为xxxxxx

  

2、Python实现Redis发布和订阅

先介绍一下redis的pub/sub功能:

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

通俗来讲,就是说我sub端(订阅者)一直监听着,一旦pub端(发布者)发布了消息,那么我就接收过来,举个例子,先是发布者:

#coding:utf-8
import time
from redis import StrictRedis
 
info_list = ['hello', 'world', 'love', 'python']
 
redis = StrictRedis(host='***', port='6379', db=3, password='********')
for i in info_list:
    redis.publish("newschannel", i)  #发布消息到newschannel

接着我们来看看订阅者:

#coding:utf-8
import time
from redis import StrictRedis
 
redis = StrictRedis(host='****', port='6379', db=3, password='******')
ps = redis.pubsub()
ps.subscribe('newschannel')  #从newschannel订阅消息
for item in ps.listen():		#监听状态:有消息发布了就拿过来
    if item['type'] == 'message': #如果信息类型为message
        print item['channel']     #打印频道和信息内容
        print item['data']

关于数据结构,也就是item,

是类似于:{'pattern': None, 'type': 'message', 'channel': 'newschannel', 'data': 'hello'}这样的

所以可以通过channel来判断这个消息是属于哪一个队列里的。(运行程序的时候,先运行订阅者,在运行发布者程序)

总结,要点有两个:

  • 一是连接方式。使用python连接redis有三种方式:
    • 使用库中的Redis类(或StrictRedis类,其实差不多);
    • 使用ConnectionPool连接池(可保持长连接);
    • 使用Sentinel类(如果有多个redis做集群时,程序会自己选择一个合适的连接)。
  • 二是订阅方法。这里使用的是StrictRedis类中的pubsub方法。连接好之后,可使用subscribe或psubscribe方法来订阅redis消息。其中subscribe是订阅一个频道,psubscribe可订阅多个频道(这样写的时候,作为参数的频道应该是一个列表)。之后就可以开始监听了。

 三、应用与总结

发布订阅是消息队列的一种方式,基于消息队列的方式,可以实现系统解耦、削峰填谷,顶住流量洪峰(高并发)

常用的流行的消息队列有:ActiveMQ、RabbitMQ等

猜你喜欢

转载自blog.csdn.net/weixin_39561473/article/details/89284443