Redis 发布订阅

Redis 发布订阅可以用在像消息通知,群聊,定向推送,参数刷新加载等业务场景

发布订阅模型有三个角色:

  1. 发布者(Publisher)
  2. 订阅者(Subscriber)
  3. 频道(channel)

每个订阅者可以订阅多个频道,发布者可以在某个频道里发布消息,订阅者会接受到自己订阅频道里发布的消息。

1.相关命令 (参考)

publish channel message         发布消息
subscribe [channel]             订阅频道
unsubscribe [channel]           取消订阅
psubscribe [pattern...]         订阅指定模式的频道
punsubscribe [pattern...]       退订指定模式的频道
pubsub channels                 列出至少有一个订阅者的频道
pubsub numsub [channel...]      列表给定频道的订阅者数量
pubsub numpat                   列表被订阅模式的数量

在终端使用示例

# 在 终端1 订阅cctv1
127.0.0.1:8100> subscribe cctv1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "cctv1"
3) (integer) 1
# 在 终端2 向cctv1 发布消息
127.0.0.1:8100> publish cctv1 "this is cctv1"
(integer) 1
# 终端1 接受到终端2发的消息
127.0.0.1:8100> subscribe cctv1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "cctv1"
3) (integer) 1
1) "message"
2) "cctv1"
3) "this is cctv1"

2. python 实现

订阅者类,只写了订阅功能,退订原理是一样的,偷了懒,把订阅频道和接收消息写到了一个方法里面,如果严格按面向对象的思想应该分开。

from PublishAndSubscribe.Channel import Channel
from PublishAndSubscribe.RedisTool import RedisToolclass Subscriber:def __init__(self, conn):self._conn = conndef subscribe(self, channel: Channel):# 获取发布/订阅对象pub = self._conn.pubsub()# 选择要订阅的频道pub.subscribe(channel.name)while True:# 接收消息msg = pub.parse_response()print(msg)if __name__ == '__main__':client = RedisTool.redis_connection("0.0.0.0", 8100, "password")cctv1 = Channel("CCTV1")Subscriber(client).subscribe(cctv1)

发布者类

from PublishAndSubscribe.Channel import Channel
from PublishAndSubscribe.RedisTool import RedisToolclass Publisher:def __init__(self, conn):self._conn = conndef publish(self, channel: Channel, mess: str):# 向特定频道发布消息self._conn.publish(channel.name, mess)if __name__ == '__main__':cctv1 = Channel("CCTV1")client = RedisTool.redis_connection("0.0.0.0", 8100, "password")publisher = Publisher(client)while True:publisher.publish(cctv1, input("请输入要发送的消息:"))

频道类,Redis中频道的概念只是一个字符串

class Channel:def __init__(self, name: str):self.name = name

一个工具类,用来连接redis

import redisclass RedisTool:@staticmethoddef redis_connection(address: str, port: int, password: str):"""用来连接RedisArgs:address: Redis 服务端IP地址port: [int] Redis 服务端口password: Redis client 登录凭证Return:type[Redis]: 返回一个redis对象"""return redis.StrictRedis(address, port, password=password)
  • 为了简便在订阅者和发布者两处都实例化了一个“CCTV1”的频道,虽然用起来不会有什么问题(Redis中简单的通过字符串区分频道),但在实际中这应该是同一个对象。

结果:

python实现Redis订阅发布相关推荐

  1. python 实现redis订阅发布功能

    redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set ...

  2. 爬山的蜗牛旅程:redis 订阅发布

    学习的旅程,就像蜗牛爬山,一点点的往上爬,一点点的欣赏旅途的风景 某天,小猿向小编讲了个很好笑的笑话,第二天,全世界都知道了!这是为啥呢?请看下图: 现在大家大概知道什么是订阅和发布的概念(就是上图的 ...

  3. redis 订阅发布

    redis 订阅发布 subscribe 订阅者 publish 发布者 1.我们启用四个进程,三个为订阅者(subscribe),一个为发布者(publish) 订阅者加入demo 发布者发布消息 ...

  4. Redis基础—九、Redis订阅发布、Redis集群

    Redis基础-九.Redis订阅发布.Redis集群 一.Redis订阅发布 Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息 ...

  5. python redis 订阅发布_【Python之旅】第七篇(三):使用Redis订阅服务

    在C/S架构中,可以充分地利用Redis订阅服务,实现服务器端和客户端的信息收发,下面说说在Python中如何使用Redistribute的订阅服务. 这里要举的例子是,Server端进行服务的订阅, ...

  6. python redis 订阅发布_python 实现redis订阅发布功能

    redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set ...

  7. python redis 订阅发布_Python-Redis的发布与订阅

    封装的redis_config # -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" import redis class Redi ...

  8. 2.6_10 Redis订阅发布(消息队列)

    相关链接 Excel目录 redis官网 redis中文网 1. Redis发布订阅(消息队列) 替代产品:ActiveMQ,RabiitMQ,Kafka 订阅/发布消息图:第一个(消息发送者),第二 ...

  9. 初次使用Fleck+redis订阅发布实现学习小demo

    https://www.cnblogs.com/SupPilot/p/10396333.html 首先安装Fleck的程序包添加引用下面是客户端代码: 客户端代码: 运行效果: 遇到的问题: Q:通常 ...

最新文章

  1. 记录一下ECS修改实例密码以及安装可视化桌面
  2. java crossdomin.xml_crossdomain.xml的配置详解
  3. Python 学习笔记12 类 - 使用类和实例
  4. boost::math::quadrature::trapezoidal用法的测试程序
  5. android 随手记代码,用ExpandableListView写的随手记实例
  6. 面试中有哪些经典的数据库问题?
  7. C++ 构造函数分类以及调用
  8. JVM—内存分配与回收策略
  9. 1.1.2获取和控制线程状态(Getting and Seeting Thread State)
  10. LINUX内核段错误调试详细指南精品培训PPT讲义
  11. 驱动人生6网卡版 v6.1.19.90 官方版
  12. JDK和JRE和JVM的区别
  13. 联想电脑(xx%电量可用已连接适配器,未充电)解决方法
  14. 【说明】最近文章可在掘金查看
  15. python股票数据简单分析
  16. VB.net学习笔记(二十九)认识STA与MTA
  17. 04_frp内网穿透实例
  18. C++学习小结 类与对象
  19. fdisk 命令实现磁盘分区详细教程
  20. Excel作图,添加坐标轴名称

热门文章

  1. MQ 之 RocketMQ
  2. 解决 linux 下安装 node 报: command not found
  3. JAVA使用FTPClient类读写FTP
  4. 打印python包含汉字报SyntaxError: Non-ASCII character '\xe4' in file
  5. jquery函数加载及生成随机数
  6. C#指南,重温基础,展望远方!(4)表达式
  7. 将本地代码上传至github
  8. leetcode add Two Numbers
  9. R 包的安装,使用,更新
  10. BestCoder Round #39 解题报告