Redis中消息队列/发布和订阅的介绍及代码实现
一、概念
发布订阅是一种应用程序(系统)之间的通讯 传递数据的技术手段
特别是在异构(不同语言)的系统之间作用非常明显
发布订阅可以实现应用(系统)之间的解耦合
类似于微信中关注公众号/订阅号 那么订阅者能及时获取到最新的内容 或者微博的订阅也是类似
日常生活中听广播 看电视 都需要有信息的发布者 收听的人需要先订阅
发布和订阅是一对多的关系
- 订阅:对某个内容感兴趣 需要实时获取新的内容
那么当关注的内容一旦有变化就能立即得到通知
这是"多"的一方 - 发布:提供某个内容 将内容信息发送给多个对此内容感兴趣的订阅者
是有主动权的一方
是"一"的一方
发布订阅应用在即时通信应用中较多
例如网络聊天室 实时广播 实时提醒等
滴滴打车的抢单 外卖的抢单 微信群发红包 抢红包都可以用发布订阅来实现
二、Redis的发布和订阅
Redis的发布订阅(pub/sub)是一种消息通信模式
发送者(publish)发送消息 订阅者(subscribe)接收消息
发布订阅也叫生产者-消费者模式 是实现消息队列的一种方式
订阅者先订阅频道 然后发布者向频道发送消息 所有订阅者都能接收到
订阅者订阅一个频道后会一直监听 直到手动退出
订阅示意图:
发布示意图:
1、操作命令
①、订阅一个或多个符合给定模式的频道
每个模式以 * 作为匹配符 比如 it* 匹配所有以 it 开头的频道( it.news 、 it.blog 、 it.tweets 等等)
news.* 匹配所有以 news. 开头的频道( news.it 、 news.global.today 等等),诸如此类
subscribe pattern [pattern ...]
②、订阅给定的一个或多个频道的信息
subscribe channel [channel ...]
③、将信息发送到指定的频道
publish channel message
④、查看订阅与发布系统的状态
pubsub subcommand [argument [argument ...]]
⑤、退订所有给定模式的频道
punsubscribe [pattern [pattern ...]]
⑥、退订给定的频道
unsubscribe [channel [channel ...]]
2、命令行方式实现
本例中有一个发布者和三个订阅者
切记:先订阅再发布
订阅:
发布:
返回的3代表有三个订阅者收到了消息
三个订阅者同时收到消息:
格式:
1) 返回值类型
2) 该消息的频道名称
3) 该消息的内容
查看当前的活跃频道:
退订:
3、Java代码方式实现
JedisPubSub类:Jedis中的JedisPubSub
类是Jedis的一个抽象类 该类定义了publish/subscribe的回调方法
可通过继承JedisPubSub类来重写回调方法 从而实现Java中的Redis发布订阅
当Redis发布或订阅时 会调用这些回调方法 在回调方法中实现业务逻辑
onMessage()
:当发布者发布消息时 会执行订阅者的onMessage()回调方法来接收发布的消息
可在此方法中实现消息接收后的自定义的业务逻辑处理 例如访问数据库等
使用前须导入Jedis依赖:
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</version>
</dependency>
订阅者类:
public class RedisSubscribe extends JedisPubSub {@Overridepublic void onMessage(String channel, String message) {// 当订阅者收到消息 此方法会自动被调用System.out.println("订阅的频道为:"+channel);System.out.println("收到的消息为:"+message);System.out.println("时间为:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));}public static void main(String[] args) {System.out.println("订阅者启动 等待接收消息...");// 创建Jedis对象Jedis jedis=new Jedis("192.168.1.1",6379);// 我设了个密码 所以需要认证 没设密码的可以略过jedis.auth("123456");// 创建订阅者对象:明确谁在订阅RedisSubscribe redisSubscribe =new RedisSubscribe();// 订阅消息jedis.subscribe(redisSubscribe,"classmate");}
}
发布者类:
public class RedisPublish {public static void main(String[] args) {System.out.println("发布者启动...");// 创建Jedis对象Jedis jedis=new Jedis("192.168.1.1",6379);// 我设了个密码 所以需要认证 没设密码的可以略过jedis.auth("123456");// 发布消息jedis.publish("classmate","同学们,今晚有网课哦!");System.out.println("消息发送完毕!");}
}
效果:
订阅者订阅一个频道后会一直监听 直到手动退出
Redis中消息队列/发布和订阅的介绍及代码实现相关推荐
- 秒杀抢购异步下单:基于Redis的消息队列秒杀抢购异步下单功能
学习Redis时,练习的实战项目代码--基于Redis的Stream类型的秒杀抢购异步下单. 说明: Redis的stream类型的消息队列实现异步下单功能.Redis版本至少要5.0及以上版本才可以 ...
- 调试笔记 — Redis 消息队列发布信息被消费者重复订阅多次牵扯到的 Tomcat 配置问题 [#00001]
最近在项目中发现了一个奇葩的 BUG ,当用户调用后台时,后台向消息队列中发布一条消息,这条消息会被监听器(消费者)监听到,有趣的事情就在这里,此时由于只发送了一条消息,照理说监听器应该只会触发一次, ...
- 【springboot】【redis】springboot+redis实现发布订阅功能,实现redis的消息队列的功能...
springboot+redis实现发布订阅功能,实现redis的消息队列的功能 参考:https://www.cnblogs.com/cx987514451/p/9529611.html 思考一个问 ...
- java 结合redis队列_在 Java 中使用 redis 的消息队列服务
前言 关于 redis 我们前面已经讨论过了缓存.分布式锁.分布式唯一标识.LBS服务的用法,这里我们来谈谈利用 redis 来实现一个消息服务. 典型的消息服务是一个生产者和消费者模式的服务.一般是 ...
- Redis应用实践-使用消息队列发布微博
使用消息队列发布微博 有时候我们的应用中(如:微博)会出现这样的情况,一秒钟有很多用户同时发布消息.这个时候数据库Mysql可能会出现"too many connections". ...
- 队列消息在html中怎么排列,Redis实现消息队列
redis只是提供一个高性能的.原子操作的分布式队列实现.具体的业务还是得需要你自己定制. 你的需CSS布局HTML小编今天和大家分享实际上是一个变形的生产者-消费者实现. 对于此类需CSS布局HTM ...
- 第04讲:Redis消息的发布和订阅
一.什么是消息的发布和订阅 Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息. Tip:Redis 客户端(redis-cli) ...
- php使用redis消息队列swoole,EasySwoole中利用redis实现消息队列
什么是队列? 从数据结构上来讲,队列是一种先进先出的数据结构 什么是消息队列? 消息队列可以简单理解为:把要传输的数据放在队列中 消息队列可以分为生产者和消费者,将传输的数据放到消息队列当中,就相当于 ...
- PHP下使用Redis消息队列发布微博(复制)
phpRedisAdmin :github地址 图形化管理界面 git clone https://github.com/ErikDubbelboer/phpRedisAdmin.git cd ph ...
最新文章
- 多线程-单生产单消费模型
- win8选择哪个python版本_Win8的几个版本该怎么选
- Oracle数据库为何出现乱码
- RESTful Web Services in Spring 3(上)转载
- 安卓系统组态软件_力臻智合分布式组态软件安卓版解决方案
- C++ 小游戏程序 (共七款)
- 思科模拟器5506防火墙配置_租用电信线路,三地网络互联的配置——Cisco、Hillstone路由配置...
- html菜单栏向左展开与收起,网页左侧固定菜单栏的展开与收起
- python foo函数_Python函数基础
- c语言表达式判断语法错误题,C语言数据类型与表达式习题及答案.doc
- Android 音视频开发-FFmpeg 命令
- linux下redis设置密码登录(简单易懂)
- abaqus编写本构方程vumat_基于ABAQUS的木材本构关系数值模拟方法与流程
- 大前端学习笔记--持续随缘更新
- 物联网开发笔记(31)- 使用Micropython开发ESP32开发板之手机扫二维码远程控制开关灯(1)
- C语言的转义字符,八进制
- 如何快速判断一个数是否是素数
- 维吉尼亚算法python编程实现
- Unity 3D 游戏编程设计g03
- python 使用for循环,遍历列表里想要的值