1. Redis为我们提供了publish/subscribe(发布/订阅)功能。我们可以对某个channel(频道)进行subscribe(订阅),当有人在这个channel上publish(发布)消息时, Redis就会通知我们, 这样我们可以收到别人发布的消息。

2. 作为Java的Redis客户端, Jedis提供了publish/subscribe的接口。本文讲述如何使用Jedis来实现Redis的publish/subscribe。

3. Jedis定义了抽象类JedisPubSub, 在这个类中, 定义publish/subsribe的回调方法。通过继承JedisPubSub类并重新实现这些回调方法, 当publish/subsribe事件发生时, 我们可以定制自己的处理逻辑。

4. 新建一个名为JedisPubSub的Java项目, 拷入相关jar包, 并添加到build path

5. 自定义发布和订阅的回调类

package com.redis.publish;import redis.clients.jedis.JedisPubSub;/*** 发布和订阅的回调类*/
public class MyJedisPubSub extends JedisPubSub {private String clientName;public MyJedisPubSub(String clientName) {this.clientName = clientName;}@Overridepublic void onMessage(String channel, String message) {System.out.println(String.format("%s客户端, 订阅%s频道, 接受到的消息是: %s", clientName, channel, message));}@Overridepublic void onSubscribe(String channel, int subscribedChannels) {System.out.println(String.format("%s客户端, 订阅%s频道, 一共订阅%d个频道", clientName, channel, subscribedChannels));}@Overridepublic void unsubscribe(String... channels) {super.unsubscribe(channels); // 这个一定要有, 不然取消订阅不生效for (String item : channels) {System.out.println(String.format("%s客户端, 取消订阅%s频道", clientName, item));}}@Overridepublic void onUnsubscribe(String channel, int subscribedChannels) {System.out.println(String.format("%s客户端, 取消订阅%s频道, 还订阅%d个频道", clientName, channel, subscribedChannels));}}

6. Jedis的subscribe操作

6.1. Jedis的subscribe的声明如下

public void subscribe(final JedisPubSub jedisPubSub, final String… channels)

6.2. 第一个参数接受一个JedisPubSub对象, 第二个参数指定对哪个频道进行订阅。上例中, 我们把我们自定义的MyJedisPubSub对象传给subscribe方法。当publish/subscribe的事件发生时, 会自动调用我们MyJedisPubSub的方法。

6.3. 由于Jedis的subscribe操作是阻塞的, 因此, 我们另起一个线程来进行subscribe操作。

7. 自定义订阅和取消订阅类

package com.redis.publish;import redis.clients.jedis.Jedis;/*** 订阅和取消订阅线程类*/
public class SubscribeThread extends Thread {private Jedis jedis;private MyJedisPubSub myJedisPubSub;private String[] channels;public SubscribeThread(String clientName, String[] channels) {this.jedis = new Jedis("192.168.25.138", 6379);this.jedis.auth("lyw123456");this.myJedisPubSub = new MyJedisPubSub(clientName);this.channels = channels;}@Overridepublic void run() {jedis.subscribe(myJedisPubSub, channels);}public void unsubscribe(String[] channels) {myJedisPubSub.unsubscribe(channels);}}

8. 发布类

package com.redis.publish;import redis.clients.jedis.Jedis;/*** 发布类, 同时启动2个订阅客户端*/
public class RedisPublish {public static void main(String[] args) {String cctv = "cctv";String ximalaya = "xi ma la ya";Jedis jedis = new Jedis("192.168.25.138", 6379);jedis.auth("lyw123456");SubscribeThread lisi = new SubscribeThread("lisi", new String[] {cctv});lisi.start();SubscribeThread zhangsan = new SubscribeThread("zhangsan", new String[] {cctv, ximalaya});zhangsan.start();try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}jedis.publish(cctv, "小冠快走");jedis.publish(ximalaya, "贞观长歌");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}zhangsan.unsubscribe(new String[] {cctv, ximalaya});jedis.publish(cctv, "新年快乐");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}lisi.unsubscribe(new String[] {cctv});jedis.close();}
}

9. 运行结果

023_Jedis的发布和订阅相关推荐

  1. 面试被问到Redis实现发布与订阅,手摸手教

    简介 Redis发布与发布功能(Pub/Sub)是基于事件座位基本的通信机制,是目前应用比较普遍的通信模型,它的目的主要是解除消息的发布者与订阅者之间的耦合关系. Redis作为消息发布和订阅之间的服 ...

  2. Meteor:发布与订阅

    我们可以使用安全的方法让用户端不直接操作数据库,但是还是可以直接读取数据库内容,如果我们还需要保护私有的数据存储,在客户端直接使用Collection.find(),这样的操作方式在实际的项目中并不会 ...

  3. 知方可补不足~SQL2008中的发布与订阅模式~续

    上一回介绍了如何在sql2008中建立一个数据库的发布者,今天来说一下如何建立一个订阅者,其实订阅者也是一个数据库,而这个数据库是和发布者的数据结构相同的库,它们之间通过SQL代理进行数据上的同步. ...

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

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

  5. Redis发布与订阅(pub/sub)

    Redis发布与订阅(pub/sub) 本文档翻译自: http://redis.io/topics/pubsub . SUBSCRIBE . UNSUBSCRIBE 和 PUBLISH 三个命令实现 ...

  6. RabbitMQ官方中文入门教程(PHP版) 第三部分:发布/订阅(Publish/Subscribe)

    2019独角兽企业重金招聘Python工程师标准>>> 发布/订阅 在上篇教程中,我们搭建了一个工作队列.每个任务之分发给一个工作者(worker).在本篇教程中,我们要做的之前完全 ...

  7. Redis实现发布与订阅(转)

    简介 Redis发布与发布功能(Pub/Sub)是基于事件座位基本的通信机制,是目前应用比较普遍的通信模型,它的目的主要是解除消息的发布者与订阅者之间的耦合关系. Redis作为消息发布和订阅之间的服 ...

  8. Redis中的发布与订阅的概念与以命令行的方式实现发布订阅举例

    场景 什么是发布与订阅 发布订阅是一种应用程序(系统)之间通讯,传递数据的技术手段,特别是在异构(不同语言)系统之间的作用非常明显. 发布订阅: 类似于微信中关注公众号/订阅号,公众号/订阅号发布的文 ...

  9. Redis中的发布与订阅

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

最新文章

  1. Kubernetes安全之认证
  2. Windows 7 上怎样打开SQL Server 配置管理器
  3. 利用Eclipse的JPA自动生成注解实体
  4. Android开发之RecyclerView嵌套ListView自动计算高度的方法
  5. python逆序数的程序_计算逆序数(归并法)程序问题 (Python)
  6. 在java中jvm目录_JVM具体在哪个文件夹下的
  7. C/C++——打开文件存储数据的各种方式
  8. 人间值得!支付宝宣布平台上登记器官捐献人数:90后占比超一半
  9. react redux 简化_Redux 源码解析
  10. 连续语音识别,continuous speech recognition,音标,读音,翻译,英文例句,英语词典
  11. 关于A 星算法的研究与简单分析及其实现-A star
  12. 一篇文章彻底搞懂JVM常见垃圾收集器算法、常见收集器、CMS三色标记等(深度剖析)
  13. scara机器人dh参数表_scara机器人技术参数
  14. WordPress好看的自适应企业站Start主题
  15. NAND flash 基础知识
  16. OpenCV学习笔记(Python)———— 画轮廓
  17. php 处理透明 png 图片黑边问题
  18. 一份给艺术爱好者的书单
  19. 企业一体化信息管理平台是什么
  20. Google的两种广告推广方式

热门文章

  1. git用.gitignore忽略指定文件
  2. SQL Server 调优系列进阶篇 - 查询语句运行几个指标值监测
  3. Hadoop运维记录系列(十)
  4. iOS故障排除指南:基本技巧
  5. PHP CGI 中 fix_pathinfo 引起的安全隐患
  6. centos下添加管理员组和添加管理员用户及相关操作
  7. c++ 宽搜(倒水)
  8. JAVA-初步认识-第三章-if语句练习-星期和季节
  9. lintcode-34-N皇后问题 II
  10. angularjs loading, animate