一、概念

发布订阅是一种应用程序(系统)之间的通讯 传递数据的技术手段
特别是在异构(不同语言)的系统之间作用非常明显

发布订阅可以实现应用(系统)之间的解耦合
类似于微信中关注公众号/订阅号 那么订阅者能及时获取到最新的内容 或者微博的订阅也是类似
日常生活中听广播 看电视 都需要有信息的发布者 收听的人需要先订阅

发布和订阅是一对多的关系

  • 订阅:对某个内容感兴趣 需要实时获取新的内容
    那么当关注的内容一旦有变化就能立即得到通知
    这是""的一方
  • 发布:提供某个内容 将内容信息发送给多个对此内容感兴趣的订阅者
    是有主动权的一方
    是""的一方

    发布订阅应用在即时通信应用中较多
    例如网络聊天室 实时广播 实时提醒等
    滴滴打车的抢单 外卖的抢单 微信群发红包 抢红包都可以用发布订阅来实现

二、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中消息队列/发布和订阅的介绍及代码实现相关推荐

  1. 秒杀抢购异步下单:基于Redis的消息队列秒杀抢购异步下单功能

    学习Redis时,练习的实战项目代码--基于Redis的Stream类型的秒杀抢购异步下单. 说明: Redis的stream类型的消息队列实现异步下单功能.Redis版本至少要5.0及以上版本才可以 ...

  2. 调试笔记 — Redis 消息队列发布信息被消费者重复订阅多次牵扯到的 Tomcat 配置问题 [#00001]

    最近在项目中发现了一个奇葩的 BUG ,当用户调用后台时,后台向消息队列中发布一条消息,这条消息会被监听器(消费者)监听到,有趣的事情就在这里,此时由于只发送了一条消息,照理说监听器应该只会触发一次, ...

  3. 【springboot】【redis】springboot+redis实现发布订阅功能,实现redis的消息队列的功能...

    springboot+redis实现发布订阅功能,实现redis的消息队列的功能 参考:https://www.cnblogs.com/cx987514451/p/9529611.html 思考一个问 ...

  4. java 结合redis队列_在 Java 中使用 redis 的消息队列服务

    前言 关于 redis 我们前面已经讨论过了缓存.分布式锁.分布式唯一标识.LBS服务的用法,这里我们来谈谈利用 redis 来实现一个消息服务. 典型的消息服务是一个生产者和消费者模式的服务.一般是 ...

  5. Redis应用实践-使用消息队列发布微博

    使用消息队列发布微博 有时候我们的应用中(如:微博)会出现这样的情况,一秒钟有很多用户同时发布消息.这个时候数据库Mysql可能会出现"too many connections". ...

  6. 队列消息在html中怎么排列,Redis实现消息队列

    redis只是提供一个高性能的.原子操作的分布式队列实现.具体的业务还是得需要你自己定制. 你的需CSS布局HTML小编今天和大家分享实际上是一个变形的生产者-消费者实现. 对于此类需CSS布局HTM ...

  7. 第04讲:Redis消息的发布和订阅

    一.什么是消息的发布和订阅 Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息. Tip:Redis 客户端(redis-cli) ...

  8. php使用redis消息队列swoole,EasySwoole中利用redis实现消息队列

    什么是队列? 从数据结构上来讲,队列是一种先进先出的数据结构 什么是消息队列? 消息队列可以简单理解为:把要传输的数据放在队列中 消息队列可以分为生产者和消费者,将传输的数据放到消息队列当中,就相当于 ...

  9. PHP下使用Redis消息队列发布微博(复制)

    phpRedisAdmin :github地址  图形化管理界面 git clone https://github.com/ErikDubbelboer/phpRedisAdmin.git cd ph ...

最新文章

  1. 多线程-单生产单消费模型
  2. win8选择哪个python版本_Win8的几个版本该怎么选
  3. Oracle数据库为何出现乱码
  4. RESTful Web Services in Spring 3(上)转载
  5. 安卓系统组态软件_力臻智合分布式组态软件安卓版解决方案
  6. C++ 小游戏程序 (共七款)
  7. 思科模拟器5506防火墙配置_租用电信线路,三地网络互联的配置——Cisco、Hillstone路由配置...
  8. html菜单栏向左展开与收起,网页左侧固定菜单栏的展开与收起
  9. python foo函数_Python函数基础
  10. c语言表达式判断语法错误题,C语言数据类型与表达式习题及答案.doc
  11. Android 音视频开发-FFmpeg 命令
  12. linux下redis设置密码登录(简单易懂)
  13. abaqus编写本构方程vumat_基于ABAQUS的木材本构关系数值模拟方法与流程
  14. 大前端学习笔记--持续随缘更新
  15. 物联网开发笔记(31)- 使用Micropython开发ESP32开发板之手机扫二维码远程控制开关灯(1)
  16. C语言的转义字符,八进制
  17. 如何快速判断一个数是否是素数
  18. 维吉尼亚算法python编程实现
  19. Unity 3D 游戏编程设计g03
  20. python 使用for循环,遍历列表里想要的值

热门文章

  1. Wireshark网络抓包工具的使用
  2. 前端基础路线一:HTML编码规范
  3. JVM调优和参数配置
  4. win10计算机搜索点不了,遇到Win10搜索框失效不用怕!赶紧学上这两招,10秒迅速解决...
  5. 手机的运行内存是否越大就越好?
  6. Redis高频面试题汇总(2021最新版)
  7. Linux 网络静态IP配置以及boot后自动连接
  8. 高途2021年第三季度营收同比骤降四成,市值累计蒸发超375亿美元
  9. Python深度学习篇六《深度学习用于文本和序列》
  10. 网站锚文本链接同步百家号