发布订阅(pub/sub)是一种消息通信模式,主要的目的是解耦消息发布者和消息订阅者之间的
耦合,这点和设计模式中的观察者模式比较相似。pub/sub 不仅仅解决发布者和订阅者直接
代码级别耦合也解决两者在物理部署上的耦合。redis 作为一个pub/sub 的server,在订阅者
和发布者之间起到了消息路由的功能。订阅者可以通过subscribe 和psubscribe 命令向redis
server 订阅自己感兴趣的消息类型,redis 将消息类型称为通道(channel)。当发布者通过
publish 命令向redis server 发送特定类型的消息时。订阅该消息类型的全部client 都会收到
此消息。这里消息的传递是多对多的。一个client 可以订阅多个channel,也可以向多个channel
发送消息。
下面做个实验。这里使用3 不同的client, client1 用于订阅tv1 这个channel 的消息,client2
用于订阅tv1 和tv2 这2 个chanel 的消息,client3 用于发布tv1 和tv2 的消息。

Client1:

Client2:

Client3:

下面看Client1和Client2的接收情况:

Client1和Client2都收到了tv1的消息,然后我们再使用Client3发布一条消息:

看看Clien1,Client2的接收情况

下面将详细的解释一下上面的例子
1、client1 订阅了tv1 这个channel 这个频道的消息,client2 订阅了tv1 和tv2 这2 个频道的
消息
2、client3 是用于发布tv1 和tv2 这2 个频道的消息发布者
3、接下来我们在client3 发布了一条消息”publish tv1 program1”,大家可以看到这条消息是
发往tv1 这个频道的
4、理所当然的client1 和client2 都接收到了这个频道的消息
5、 然后client3 又发布了一条消息”publish tv2 program2”,这条消息是发往tv2 的,由于
client1 并没有订阅tv1,所以client1 的结果中并没有显示出任何结果,但client2 订阅了这个
频道,所以client2 是会有返回结果的。
我们也可以用psubscribe tv*的方式批量订阅以tv 开头的频道的内容。
看完这个小例子后应该对pub/sub 功能有了一个感性的认识。需要注意的是当一个连接通过
subscribe 或者psubscribe 订阅通道后就进入订阅模式。在这种模式除了再订阅额外的通道或
者用unsubscribe 或者punsubscribe 命令退出订阅模式,就不能再发送其他命令。另外使用
psubscribe 命令订阅多个通配符通道,如果一个消息匹配上了多个通道模式的话,会多次收
到同一个消息。

Pipeline 批量发送请求

redis 是一个cs 模式的tcp server,使用和http 类似的请求响应协议。一个client 可以通过一
个socket 连接发起多个请求命令。每个请求命令发出后client 通常会阻塞并等待redis 服务
处理,redis 处理完后请求命令后会将结果通过响应报文返回给client。基本的通信过程如下:

Client: INCR X
Server: 1
Client: INCR X
Server: 2
Client: INCR X
Server: 3
Client: INCR X
Server: 4

基本上四个命令需要8 个tcp 报文才能完成。由于通信会有网络延迟,假如从client 和server
之间的包传输时间需要0.125 秒。那么上面的四个命令8 个报文至少会需要1 秒才能完成。
这样即使redis 每秒能处理100 个命令,而我们的client 也只能一秒钟发出四个命令。这显
示没有充分利用redis 的处理能力,怎么样解决这个问题呢? 我们可以利用pipeline 的方式
从client 打包多条命令一起发出,不需要等待单条命令的响应返回,而redis 服务端会处理
完多条命令后会将多条命令的处理结果打包到一起返回给客户端。通信过程如下

Client: INCR X
Client: INCR X
Client: INCR X
Client: INCR X
Server: 1
Server: 2
Server: 3
Server: 4

假设不会因为tcp 报文过长而被拆分。可能两个tcp 报文就能完成四条命令,client 可以将四
个incr 命令放到一个tcp 报文一起发送,server 则可以将四条命令的处理结果放到一个tcp
报文返回。通过pipeline 方式当有大批量的操作时候,我们可以节省很多原来浪费在网络延
迟的时间,需要注意到是用pipeline 方式打包命令发送,redis 必须在处理完所有命令前先缓
存起所有命令的处理结果。打包的命令越多,缓存消耗内存也越多。所以并不是打包的命令
越多越好。具体多少合适需要根据具体情况测试。

具体是否使用pipeline 必须要基于大家手中的
网络情况来决定,不能一切都按最新最好的技术来实施,因为它有可能不是最适合你的。

转载于:https://blog.51cto.com/janephp/1340466

Redis实战(12)订阅和发布消息相关推荐

  1. redis实战(12):Redis性能监控指标汇总

    1. 添加依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>sprin ...

  2. Redis实战(四):redis的消息订阅、pipeline、事务、modules、布隆过滤器、缓存LRU

    啤酒理论 Buffer机制,减少没必要的来回调用 前置知识 只要和redis建立了连接,发送字符串,就能交互 管道 发布 / 订阅 help @pubsub 发送者 订阅者 PSUBSCRIBE pa ...

  3. Redis 实战笔记

    Redis yum源安装 yum install -y epel-release redis systemctl enable redis systemctl start redis systemct ...

  4. .net core 使用Redis的发布订阅

    Redis是一个性能非常强劲的内存数据库,它一般是作为缓存来使用,但是他不仅仅可以用来作为缓存,比如著名的分布式框架dubbo就可以用Redis来做服务注册中心.接下来介绍一下.net core 使用 ...

  5. 视频教程- 19年录制Redis实战教程 高可用秒杀分布式锁布隆过滤器实战 SpringBoot教程整合-Java

    19年录制Redis实战教程 高可用秒杀分布式锁布隆过滤器实战 SpringBoot教程整合 7年的开发架构经验,曾就职于国内一线互联网公司,开发工程师,现在是某创业公司技术负责人, 擅长语言有nod ...

  6. 终于有阿里P8从开发、运维两个角度总结出了Redis实战手册

    从开发.运维两个角度总结了Redis实战经验,深入浅出地剖析底层实现,包含大规模集群开发与运维的实际案例.应用技巧. 前言 Redis作为基于键值对的NoSQL数据库,具有高性能.丰富的数据结构.持久 ...

  7. Redis的发布订阅模式以及在SpringBoot中的使用

    1.基本介绍 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. Redis 客户端可以订阅任意数量的频道. publish(发布命令) A ...

  8. 4 Redis的发布订阅

    Redis 的发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息 Redis 客户端可以订阅任意数量的频道. 先订阅后发布才能收到消息 1 打开一个客户端 ...

  9. SpringBoot2.x整合Redis实战 4节课

    1.分布式缓存Redis介绍      简介:讲解为什么要用缓存和介绍什么是Redis,新手练习工具 1.redis官网 https://redis.io/download           2.新 ...

  10. 补习系列(13)-springboot redis 与发布订阅

    目录 一.订阅发布 常见应用 二.Redis 与订阅发布 三.SpringBoot 与订阅发布 A. 消息模型 B. 序列化 C. 发布消息 D. 接收消息 小结 一.订阅发布 订阅发布是一种常见的设 ...

最新文章

  1. 在各种xDSL技术中,能提供上下行信道非对称传输的是______。正确答案 B
  2. Spring的常用下载地址
  3. JavaScript定义函数的几种方式
  4. 今天有了意外收获,原来还可以这样提交数据的
  5. ffmpeg流文件合并concat
  6. 形态形成场(矩阵乘法优化dp)
  7. IDEA好用的Servlet模板
  8. 介绍几个医学图像处理会议
  9. TEA、XTEA、XXTEA加密解密算法
  10. ngrok服务器搭建 window_.NET开发框架(三)高可用服务器端设计
  11. 安装360后,visual studio 经常报各种莫名其妙的错误的解决方案
  12. 解决Carsim2016找不Liscens问题
  13. 360 android root权限获取root,360 N5 root过程详解
  14. 步科触摸屏程序上传 程序解密步骤方法
  15. 图数据和知识图谱,数字化转型的新引擎星环科技星环科技
  16. Java jsp导出Excel打开报格式或扩展名错误
  17. phpcms 会员头像h5上传_PHPCMS 在任意页面调取会员头像
  18. C语言控制和鼠标键盘 (windows环境)
  19. 教女朋友学Python是道送命题
  20. 田园仿古砖特点大汇总,田园风格你选对了吗?

热门文章

  1. ORM对mysql数据库中数据进行操作报错解决
  2. Linux 系统必须掌握的文件_【all】
  3. java中正则表达式要进行转义的字符。
  4. Xamarin Visual Studio提示找不到AssemblyAttributes.cs文件
  5. qsort函数的用法
  6. 数据可视化(一)-Matplotlib简易入门
  7. 深入浅出WPF——附加事件(Attached Event)
  8. VC.NET扩展Windows磁盘清理工具的功能
  9. C#重点知识详解(一) 选择自 masterall 的 Blog
  10. mysql 报错 get error 28 from storage engine 解决方法