Redis 实用技术——消息发布和订阅
引言
发布订阅模型是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 实用技术——消息发布和订阅相关推荐
- nodejs 实现 redis 的消息发布及订阅
nodejs 实现 redis 的消息发布及订阅 业务需求 实现方法(koa) 流程 业务需求 大家好,我终于踩坑了哈哈哈哈--- 如果服务器是单线程的话 消息推送完全可以用websocket来实现, ...
- idea springboot 发布webservice 发布服务_太赞了:Spring boot+redis实现消息发布与订阅...
一.创建spring boot项目 org.springframework.boot spring-boot-starter-data-redis org.springframework.boot s ...
- nodejs redis 发布订阅_太赞了:Spring boot+redis实现消息发布与订阅
一.创建spring boot项目 org.springframework.boot spring-boot-starter-data-redis org.springframework.boot s ...
- redis 发布订阅实际案例_【赵强老师】Redis的消息发布与订阅
欢迎关注赵强老师微信公众号:myitshare Redis 作为一个publish/subscribe server,起到了消息路由的功能.订阅者可以通过subscribe和psubscribe命令向 ...
- nodejs redis 发布订阅_「赵强老师」Redis的消息发布与订阅
Redis 作为一个publish/subscribe server,起到了消息路由的功能.订阅者可以通过subscribe和psubscribe命令向Redis server订阅自己感兴趣的消息类型 ...
- redis消息发布和订阅的运用与常见错误解决方法
本文Redis所在系统:Linux,详细安装步骤可参考:https://www.cnblogs.com/zhaoyan001/p/6143170.html 本文运用程序所在系统:windows7 一 ...
- redis:消息发布与订阅频道
1. 发布与订阅频道 消息发布与订阅像收音机与广播台的关系 1.1. publish channel message 发布频道 语法:publish channel message 作用:发布频道消息 ...
- etcd分布式之消息发布与订阅
分布式之消息发布与订阅: 应用中用到的一些配置信息放到etcd上进行集中管理 索引的元信息和服务器集群机器的节点状态存放在etcd中 分布式日志收集系统 ...
- Redis中的发布与订阅
redis中实现发布与订阅相对于zookeeper非常简单.直接使用publish和subscribe就行. subscrible news; 订阅news这个channel publish news ...
最新文章
- 返回倒数第k个结点(返回值)
- R开发(part12)--基于RC的面向对象编程
- java如何解压rar文件怎么打开,java解压rar文件
- php 修改cache数据,修改ThinkPHP缓存为Memcache的方法
- 清除eclipse当前登录的SVN账户
- redis shell命令
- SciPy教程 - 常数constants和特殊函数库special
- 基于vue的房屋中介管理系统
- ios label 高度紫石英_iOS_NSMutableAttributedString和自适应宽度高度
- Docker容器内部 DNS 解析失败的问题
- 【GNN报告】复旦大学许嘉蓉:基于图数据的鲁棒机器学习
- c# 基于BouncyCastle.Crypto的国密sm2,sm4封装,与java版本兼容
- Codeforces446C - DZY Loves Fibonacci Numbers
- 组策略设置计算机禁止睡眠
- Total Command快捷键大全
- 从零开始Android游戏编程(第二版)
- java基于springboot+vue的协同过滤算法的图书推荐系统 nodejs
- 2022年茶艺师(中级)特种作业证考试题库及在线模拟考试
- vue iview 之使用
- What 引导的三种名词性从句
热门文章
- c语言给定一个非空整数数组_C程序检查给定整数的所有位是否为一(1)
- 几位阿里朋友重写的Java并发编程,牛逼了
- innerHTML、innerText和outerHTML、outerText的区别
- Python获取两个列表list的不同之处
- 陕西省2021年高考成绩结果查询,陕西招生考试信息网:2021年陕西高考成绩查询入口、查分系统...
- 生物学专业_江南大学微生物学(发酵)20002008历年考研专业课真题汇编
- Ubuntu下绘图软件krita64位无中文问题
- python偶数列表_使用条件偶数列表创建带有地图的元组 - python
- mysql主从配置_MySQL主从配置详解
- windows7怎么清空电脑只剩系统