Redis的发布与订阅
业务:
运用数据与信息指导小药工的采购生产与销售行为
需求背景:
(1)药工汇小程序用户(即小型中药初加工用户)需要知道自己加工的品种的价格涨跌信息和品种相关资讯)
需求分析拆解:
(1)使用爬虫程序脚本从中药材天地网上爬取价格和资讯相关信息(爬虫)
(2)此爬虫程序的执行使用定时任务管理(定时任务)
(3)爬虫获取的信息持久化到mongodb数据库(数据持久化)
(4)药工汇得到的信息的过程使用发布订阅模型,每个指向相同Redis主机数据库的连接为一个订阅者或发布者,一级分发频道为平台名称,二级分发频道为品种名称,订阅者无需点击订阅,订阅是根据主营品种自动默认完成订阅的(发布与订阅)
(5)统一调度守护程序轮询所有消息,根据频道将信息使用消息模板分发到每个订阅者,这样,此守护进行长时间占用CPU,效率低;可以改为使用定时任务,例如8:00-20:00每隔1小时执行一次消息轮询脚本;使用微信服务号的模板消息向用户推送信息(统一调度轮询守护进程)
技术理论:
1. 观察者模式与发布订阅模型的区别
(1)观察者模式图解
(2)发布-订阅模型图解
(3)两者的区别
a. 从图解中可以看出,观察者模式没有调度中心作为中转,直接将观察者注册到目标,发生事件时目标直接更新通知观察者; 发布订阅模型则以调度中心作为中转,订阅者将事件注册到调度中心,发生事件时发布者将信息发送给调度中心进行统一调度,调度中心将信息推送给订阅者
b. 相对来说,观察者模式是存在依赖的;发布订阅模型是松耦合的
2. 发布订阅与RestAPI的优缺点场景对比
(1)发布订阅的优缺点及场景
发布订阅本质上是服务器(发布者)向客户端(订阅者)反向推送的机制;
优点:
a. 是达到了最高的实时性,因为服务器数据的更新同时推向了客户端;
b. 一次性为单条数据同步
c. 采用事件回调的方式更新数据,总体上是异步的
缺点:
a. 是用户可能会很烦,因为用户是被动接收的(即使是用户根据标签,用户自己订阅的,用户依然可能会很烦),而且信息很可能不是精准用户想要的信息;
b. 每更新一条数据则同步一次,同步次数频繁
场景:
是用户迫切需要某一标签的信息或者数据
(2)RestAPI的优缺点及场景
RestAPI本质上是客户端向服务端正向请求的机制,原理和发布订阅刚好相反;
优点:
a. 是客户端根据自己的意愿请求数据,得到的信息是精准的;
b. 一次性同步一个时间段内所有数据, 体现为数据同步的批量操作
c. 采用主动同步请求的方法,是同步的
缺点:
是没有发布订阅的高实时性,不过一般来说,用户不需要这么高的实时性;
场景:
是通用情况
例如:下面的信息平台和药工汇平台数据同步的方案比较
方案 | 详细说明 | 特点 | 需要做什么 |
方案1:使用发布订阅模型同步更细数据 |
信息平台已经向频道发布数据, 需要做的是在时间回调函数中 调用药工汇平台提供的RestAPI,此RestAPI的内容为更新药工汇的数据, 为INSERT操作,PUT操作; |
1. 及时同步 2. 异步执行 3. 单条多批次同步 4. 事件触发 |
1. 只需药工汇平台提供RestAPI, 此RestAPI为PUT操作,INSERT操作; 需传入的参数有访问药工汇平台的平台级access_token,药工汇平台做access_token验证; 需关心药工汇平台数据库结构(主要工作在药工汇) |
方案2:使用定时任务请求RestAPI获取数据 |
信息平台已经向频道发布数据, 需要做的是使用定时任务跨域请求 信息平台提供的RestAPI,此RestAPI的内容为从频道中获取数据, 为SELECT操作, LIST操作 |
1. 延时同步 2. 同步执行 3. 批量同步 4. 定时任务触发 |
1. 只需信息平台提供RestAPI,此RestAPI为LIST操作,SELECT操作; 需传入的参数有访问信息平台的平台级access_token,信息平台做access_token验证; 无需关系药工汇平台数据库结构;药工汇配置定时任务(主要工作在信息平台) |
2. Redis中发布订阅的架构
(1)图解
包括:
a. 订阅者订阅一个或多个频道
b. 订阅者使用模式匹配订阅多个频道
c. 订阅者取消订阅频道
d. 发布者向某个频道发布消息
3. Redis的发布订阅实验(验证已订阅的客户端是否会自动收到消息)
预期:
Redis-client_2在步骤(2)不会收到消息
Redis-client_2在步骤(3)不会收到消息
Redis-client_2在步骤(4)收到消息
步骤:
(1)启动Redis服务器和两个Redis客户端:启动Redis-server,启动Redis-client_1和Redis-client_2
结果:服务器和两个客户端已经成功启动
(2)在Redis-client_1向频道channel_1发送一条消息,消息内容为 "Hello, Word!"; 观察Redis-client_2是否收到此消息
结果:客户端2未订阅任何频道则无法收到消息
(3)在Redis-client_2订阅频道channel_1; 观察Redis-client_2是否收到消息Hello,World!
结果:客户端2订阅了频道1无法收到订阅前发送到频道1的任何消息
(4)在Redis-client_1向频道channel_1发送一条消息,消息内容为 "Good afternoon!"; 观察Redis-client_2是否收到此消息
结果:客户端2能收到订阅后发送到此频道的任何消息
结论:实验结果和预期猜想相符,Redis客户端只能被动接收到订阅此频道发送的消息
4. Redis发布订阅实验(原生PHP+php_redis扩展)
准备:
(1)安装好php_redis扩展(在windows上需要下载php_redis.dll并放入php/extra中;在php.ini中加入extension=php_redis.dll)
注意:
a. 下载php_redis.dll对应版本时需要查看phpinfo中php的版本,php是32位还是64位的,php的thread是否为safety
b. 需要将extension=php_redis.dll放入apache/php.ini和php/php.ini中
(2)启动Redis服务器及启动Redis客户端1
(3)编写Redis客户端2订阅的脚本,如下:
<?php //避免在默认的配置下,1分钟后终端了与redis服务器的链接 ini_set('default_socket_timeout', -1); $redis = new Redis(); $redis->connect('127.0.0.1',6379); $redis->subscribe(['channel_1'], function($redis, $channel, $msg){ var_dump($redis); var_dump($channel); var_dump($msg); }); ?>
启动脚本运行,并在客户端1发送一条消息,观察客户端2:
3. 其他发布订阅框架例如ActiveMQ与 Redis的区别
平台交互图:
编码实现:
服务器运维:
参考:
1. 观察者模式与发布订阅模式的区别
https://www.cnblogs.com/lovesong/p/5272752.html
2. Redis的发布订阅机制
https://www.cnblogs.com/yitudake/p/6747995.html
Redis的发布与订阅的更多相关文章
- redis实现发布(订阅)消息
redis实现发布(订阅)消息 什么是redis的发布订阅(pub/sub)? Pub/Sub功能(means Publish, Subscribe)即发布及订阅功能.基于事件的系统中,Pub/S ...
- Redis的发布和订阅
Redis的发布和订阅 Redis发布订阅(pub/sub)是一种消息通信模式,pub发布消息,sub接收消息.(pub/sub)是一种生产者消费者模式,是实现消息队列的一种方式 redis的订阅和发 ...
- redis的发布与订阅机制
Redis 发布/订阅机制原理分析 Redis 通过 PUBLISH. SUBSCRIBE 和 PSUBSCRIBE 等命令实现发布和订阅功能. 这些命令被广泛用于构建即时通信应用,比如网络聊天室(c ...
- 一文带你了解 Redis 的发布与订阅的底层原理
01.前言 发布订阅系统在我们日常的工作中经常会使用到,这种场景大部分情况我们都是使用消息队列的,常用的消息队列有 Kafka,RocketMQ,RabbitMQ,每一种消息队列都有其特性,关于 Ka ...
- redis:消息发布与订阅频道
1. 发布与订阅频道 消息发布与订阅像收音机与广播台的关系 1.1. publish channel message 发布频道 语法:publish channel message 作用:发布频道消息 ...
- springboot使用redis实现发布与订阅
配置redis连接地址 # Redis服务器地址 spring.redis.host=youxiu326.xin # Redis服务器连接端口 spring.redis.port=6379 # Red ...
- springboot2.0整合redis的发布和订阅
1.Maven引用 <dependency> <groupId>org.springframework.boot</groupId> <artifactId& ...
- redis的发布和订阅操作
- Redis - 发布和订阅
一.概述 1). 发布和订阅是一种消息通信模式. 2). 优点:使消息订阅者和消息发布者耦合度降低,类似设计模式中的观察者模式. 二.发布和订阅 订阅命令: // 订阅一个或多个频道 // 返回值:v ...
随机推荐
- Java开发笔记(三十三)字符包装类型
正如整型int有对应的包装整型Integer那样,字符型char也有对应的包装字符型Character.初始化字符包装变量也有三种方式,分别是:直接用等号赋值.调用包装类型的valueOf方法.使用关 ...
- javascript常用的41个经典技巧
1. 将彻底屏蔽鼠标右键 <table border oncontextmenu=return(false)><td>no</table> 可用于Table 2. ...
- TS学习随笔(四)->数组的类型
少侠们,今天我们继续来搞一搞TS 今天我们要来看一看TS中数组的定义是个什么鬼样子 数组的类型: 在 TypeScript 中,数组类型有多种定义方式,比较灵活.下面我们来看看有哪些定义方法 「类型 ...
- Github:failed to add file / to index
我把Test项目上传到github上,为了截一部分图,来写博客.所以我就上传成功之后,把仓库Respository Test删除了,但是当我再次上传的时候,发现上传不上,会提示failed to ad ...
- Android 简单实现控件的拖动
控件的拖动,使用到一个监听事件 setOnTouchListener:XML代码: <?xml version="1.0" encoding="utf-8" ...
- Java实现栈数据结构
栈(英语:stack)又称为栈或堆叠,是计算机科学中一种特殊的串列形式的抽象数据类型,其特殊之处在于只能允许在链表或数组的一端(称为堆栈顶端指针,英语:top)进行加入数据(英语:push)和输出数据 ...
- 委托学习总结(一)浅谈对C#委托理解
初入社会,对于我这个初级程序员来说要学的东西实在太多了,公司最近在做一个winform框架开发的桌面应用程序,众所周知,winform也好,webform也好,里面随处可见的事件驱动,有事件,当然也少 ...
- AES 加密与解密
using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Securit ...
- 尝试Java,从入门到Kotlin(下)
上篇已提(tu)到(cao)Java中的各种坑.习惯了C#的各种特性和语法糖后,再转到Java感觉比较别扭.最后本着反正Java也不是很熟悉,干脆再折腾折腾其他语言的破罐子破摔的心态,逛了一圈JVM语 ...
- c/c++ 继承与多态 由子类向父类的转换规则
问题1:子类B可以有3种方式(public, protected, private)继承父类A,用哪种方式继承,用户代码才能把子类B的对象转换成父类A的对象呢? 只用当子类B以public方式继承父类 ...