redis的发布订阅模式pubsub
时间:2022-05-02
本文章向大家介绍redis的发布订阅模式pubsub,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
前言
redis支持发布订阅模式,在这个实现中,发送者(发送信息的客户端)不是将信息直接发送给特定的接收者(接收信息的客户端),而是将信息发送给频道(channel),然后由频道将信息转发给所有对这个频道感兴趣的订阅者。
发送者无须知道任何关于订阅者的信息,而订阅者也无须知道是那个客户端给它发送信息,它只要关注自己感兴趣的频道即可。
对发布者和订阅者进行解构(decoupling),可以极大地提高系统的扩展性(scalability),并得到一个更动态的网络拓扑(network topology)。
redis 发布订阅主要由三个entity组成:channel/subscriber/publisher。
channel:
频道有两种类型
明确型,news.sport,体育类新闻
模糊型,news.*,各种新闻
下面实现对于这两种是透明的。
# -*- coding:utf-8 -*-
class Channel(object):
def __init__(self, channel=''):
self.channel = channel
def __str__(self):
return self.channel
class ChannelFactory(object):
def __init__(self, *channels):
if isinstance(channels[0], (tuple, list)):
self.channel_list = [Channel(channel) for channel in channels[0]]
self.channel_list = [Channel(channel) for channel in channels]
def get_channels(self):
return self.channel_list
user:
主要有两类,订阅者subscriber和发布者publisher,他们都继承自Pubsub,由继承关系实现:
# -*- coding:utf-8 -*-
import redis
class Pubsub(object):
def __init__(self, redis_config):
pool = redis.ConnectionPool(
host=redis_config.get('host'),
port=redis_config.get('port'),
db=redis_config.get('db')
)
self.redis = redis.StrictRedis(connection_pool=pool)
class Subscriber(Pubsub):
def __init__(self, redis_config):
Pubsub.__init__(self, redis_config=redis_config)
self.pubsub = self.redis.pubsub()
def subscribe(self, *channel):
self.pubsub.subscribe(*channel)
def psubscribe(self, *channel_pattern):
self.pubsub.psubscribe(*channel_pattern)
def listen(self):
for item in self.pubsub.listen():
yield item
def unsubscribe(self, *channel):
self.pubsub.unsubscribe(*channel)
def punsubscribe(self, *channel_pattern):
self.pubsub.unsubscribe(*channel_pattern)
class Publisher(Pubsub):
def __init__(self, redis_config):
Pubsub.__init__(self, redis_config=redis_config)
def publish(self, channel, message):
self.redis.publish(channel, message)
测试
分两部分,订阅进程和发布进程
订阅进程:
from config import redis as redis_config
from subscriber import Subscriber
from channel import ChannelFactory
if __name__ == '__main__':
channel = ChannelFactory('news.*', 'movie.*').get_channels()
sub = Subscriber(redis_config)
sub.psubscribe(channel)
for item in sub.listen():
print item
发布进程:
from config import redis as redis_config
from publisher import Publisher
from channel import Channel
if __name__ == '__main__':
channel = Channel('news.abc')
pub = Publisher(redis_config)
pub.publish(channel, 'aaaaaaaa')
- 更精准!英研究人员利用AI监测预防城市洪水
- 物联网平台的采用将成为2018年首要IT发展趋势
- python基础随笔
- Mysql+Keepalived双主热备高可用操作记录
- Mysql双主热备+LVS+Keepalived高可用操作记录
- 被曝大裁员!曲德君坚称万达网科没有倒下、目标决心不变
- Linux下smokeping网络监控环境部署记录
- Linux下的rsyslog系统日志梳理(用户操作记录审计)
- 数据结构之数组封装
- Centos下内网NDS主从环境部署记录
- 一搜解决,微信的这个功能厉害了!
- Saltstack自动化操作记录(2)-配置使用
- Saltstack自动化操作记录(1)-环境部署
- CentOS源码编译安装Nginx和tcp_proxy module
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 5个可以帮助pandas进行数据预处理的可视化图表
- 聊聊dubbo-go的leastActiveLoadBalance
- 聊聊dubbo-go的randomLoadBalance
- 聊聊dubbo-go的roundRobinLoadBalance
- PowerBI 不同日期区间的活动逐日对比分析
- flask SQLAlchemy查询数据库最近30天,一个月,一周,12小时或之前的数据
- TypeScript是什么,为什么要使用它?
- Python 基础(十):模块与包
- 谷歌浏览器一些https打不开点击高级不行的解决办法
- CV入门赛最全思路&上分技巧汇总!
- VBA专题10-5:使用VBA操控Excel界面之隐藏/取消隐藏及最小化功能区
- 从一道面试题说起:GET 请求能传图片吗?
- ModuleNotFoundError: No module named ‘pip‘【已解决】
- 【原创】Java并发编程系列31 | 阻塞队列(上)
- 【2019-3-3】Mac启动redis