引言

发布订阅模型是redis的重要功能,它可以像网站动态一样,将消息发送到多个订阅者的主页里。

一、常用命令

二、消息格式

消息是一个有三个元素的多块响应:

如上图,发布者向 mysub 频道发送了一条消息,redis会返回当前订阅者数量。

订阅者这边,当第一次订阅时,响应块分为 3 行,

第一行表示消息类型,subscribe :订阅成功 ;unsubscribe:表示取消订阅;message :表示这个响应块是一个发布的消息

第二行表示频道名称

第三行根据消息类型不同,subscribe/unsubscribe 时会响应目前订阅频道数量,message 时会响应具体消息内容

注意:发布订阅与key所在空间没有任何关系,它不受任何级别的干扰,例如,db1可以订阅db10的发布消息。如果需要区分某些频道,只能使用频道名称来区分,比如在频道名称前加上环境信息:dev-xxx,test-xxx,prod-xxxx等等。

三、模式匹配订阅

psubscribe 配合通配符来匹配多个频道,如下命令可以匹配到 dev.msg 、dev.tag.other 等符合 dev.* 模式的全部频道:

PSUBSCRIBE dev.*

当作模式匹配结果的消息会以不同的格式发送:

消息类型是pmessage,这是另一客户端发出的PUBLISH命令的结果,匹配一个模式匹配订阅。第一个元素是原匹配的模式,第三个元素是原频道名称,最后一个元素是实际消息内容。

如果既使用了模式匹配,又使用了普通的订阅方式,例如:

subscribe foo
psubscribe f*

那么如果一个消息被发布到 foo,客户端会接收到两条消息:一条是 message 类型,另一条是 pmessage类型。

四、发布订阅的使用场景与注意事项

Redis的发布订阅功能可以应用到哪些场景?聊天室?网站用户的动态发布?

首先,需要注意一个问题,当客户端订阅了一个频道后,那么它只能接收到订阅之后发布的消息,也就是说,发布的消息是实时的

因此,我们可以用它来做一个简易聊天室,或弹幕功能。但面对更复杂一些的场景,例如,如果想在客户端加载以前发布的消息又该如何解决这个问题呢?

这里的需求是,客户端即可以接受实时消息,又可以通过某些操作获取到订阅前的历史消息,如何实现?

这时,我们就可以结合redis的其他缓存功能,例如 ZSet 来存储 3天内的发布消息,再往前的数据就持久化到数据库。

这样,我们即实现了实时的订阅发布,也细分了历史数据——三天内和更久的数据:

对于三天内的数据,如何存放在ZSet中?有两种方案,需要根据业务具体考虑,要么是根据时间,要么是根据数据数量,比如某些数据就是只需要存100条。

按时间缓存,如上图中的 3 天,是比较常见的常见,我们可以在 socre 中标记日期,以此来维持数据的容量,参考使用 zremrangebyscore(按分数,即时间戳)或zremrangebyrank(按数据量,如最后100条)。

那么具体一点的实现模型就可以是这样:

Redis 实用技术——消息发布和订阅相关推荐

  1. nodejs 实现 redis 的消息发布及订阅

    nodejs 实现 redis 的消息发布及订阅 业务需求 实现方法(koa) 流程 业务需求 大家好,我终于踩坑了哈哈哈哈--- 如果服务器是单线程的话 消息推送完全可以用websocket来实现, ...

  2. idea springboot 发布webservice 发布服务_太赞了:Spring boot+redis实现消息发布与订阅...

    一.创建spring boot项目 org.springframework.boot spring-boot-starter-data-redis org.springframework.boot s ...

  3. nodejs redis 发布订阅_太赞了:Spring boot+redis实现消息发布与订阅

    一.创建spring boot项目 org.springframework.boot spring-boot-starter-data-redis org.springframework.boot s ...

  4. redis 发布订阅实际案例_【赵强老师】Redis的消息发布与订阅

    欢迎关注赵强老师微信公众号:myitshare Redis 作为一个publish/subscribe server,起到了消息路由的功能.订阅者可以通过subscribe和psubscribe命令向 ...

  5. nodejs redis 发布订阅_「赵强老师」Redis的消息发布与订阅

    Redis 作为一个publish/subscribe server,起到了消息路由的功能.订阅者可以通过subscribe和psubscribe命令向Redis server订阅自己感兴趣的消息类型 ...

  6. redis消息发布和订阅的运用与常见错误解决方法

    本文Redis所在系统:Linux,详细安装步骤可参考:https://www.cnblogs.com/zhaoyan001/p/6143170.html 本文运用程序所在系统:windows7 一  ...

  7. redis:消息发布与订阅频道

    1. 发布与订阅频道 消息发布与订阅像收音机与广播台的关系 1.1. publish channel message 发布频道 语法:publish channel message 作用:发布频道消息 ...

  8. etcd分布式之消息发布与订阅

    分布式之消息发布与订阅:        应用中用到的一些配置信息放到etcd上进行集中管理        索引的元信息和服务器集群机器的节点状态存放在etcd中        分布式日志收集系统   ...

  9. Redis中的发布与订阅

    redis中实现发布与订阅相对于zookeeper非常简单.直接使用publish和subscribe就行. subscrible news; 订阅news这个channel publish news ...

最新文章

  1. 返回倒数第k个结点(返回值)
  2. R开发(part12)--基于RC的面向对象编程
  3. java如何解压rar文件怎么打开,java解压rar文件
  4. php 修改cache数据,修改ThinkPHP缓存为Memcache的方法
  5. 清除eclipse当前登录的SVN账户
  6. redis shell命令
  7. SciPy教程 - 常数constants和特殊函数库special
  8. 基于vue的房屋中介管理系统
  9. ios label 高度紫石英_iOS_NSMutableAttributedString和自适应宽度高度
  10. Docker容器内部 DNS 解析失败的问题
  11. 【GNN报告】复旦大学许嘉蓉:基于图数据的鲁棒机器学习
  12. c# 基于BouncyCastle.Crypto的国密sm2,sm4封装,与java版本兼容
  13. Codeforces446C - DZY Loves Fibonacci Numbers
  14. 组策略设置计算机禁止睡眠
  15. Total Command快捷键大全
  16. 从零开始Android游戏编程(第二版)
  17. java基于springboot+vue的协同过滤算法的图书推荐系统 nodejs
  18. 2022年茶艺师(中级)特种作业证考试题库及在线模拟考试
  19. vue iview 之使用
  20. What 引导的三种名词性从句

热门文章

  1. c语言给定一个非空整数数组_C程序检查给定整数的所有位是否为一(1)
  2. 几位阿里朋友重写的Java并发编程,牛逼了
  3. innerHTML、innerText和outerHTML、outerText的区别
  4. Python获取两个列表list的不同之处
  5. 陕西省2021年高考成绩结果查询,陕西招生考试信息网:2021年陕西高考成绩查询入口、查分系统...
  6. 生物学专业_江南大学微生物学(发酵)20002008历年考研专业课真题汇编
  7. Ubuntu下绘图软件krita64位无中文问题
  8. python偶数列表_使用条件偶数列表创建带有地图的元组 - python
  9. mysql主从配置_MySQL主从配置详解
  10. windows7怎么清空电脑只剩系统