023_Jedis的发布和订阅
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的发布和订阅相关推荐
- 面试被问到Redis实现发布与订阅,手摸手教
简介 Redis发布与发布功能(Pub/Sub)是基于事件座位基本的通信机制,是目前应用比较普遍的通信模型,它的目的主要是解除消息的发布者与订阅者之间的耦合关系. Redis作为消息发布和订阅之间的服 ...
- Meteor:发布与订阅
我们可以使用安全的方法让用户端不直接操作数据库,但是还是可以直接读取数据库内容,如果我们还需要保护私有的数据存储,在客户端直接使用Collection.find(),这样的操作方式在实际的项目中并不会 ...
- 知方可补不足~SQL2008中的发布与订阅模式~续
上一回介绍了如何在sql2008中建立一个数据库的发布者,今天来说一下如何建立一个订阅者,其实订阅者也是一个数据库,而这个数据库是和发布者的数据结构相同的库,它们之间通过SQL代理进行数据上的同步. ...
- etcd分布式之消息发布与订阅
分布式之消息发布与订阅: 应用中用到的一些配置信息放到etcd上进行集中管理 索引的元信息和服务器集群机器的节点状态存放在etcd中 分布式日志收集系统 ...
- Redis发布与订阅(pub/sub)
Redis发布与订阅(pub/sub) 本文档翻译自: http://redis.io/topics/pubsub . SUBSCRIBE . UNSUBSCRIBE 和 PUBLISH 三个命令实现 ...
- RabbitMQ官方中文入门教程(PHP版) 第三部分:发布/订阅(Publish/Subscribe)
2019独角兽企业重金招聘Python工程师标准>>> 发布/订阅 在上篇教程中,我们搭建了一个工作队列.每个任务之分发给一个工作者(worker).在本篇教程中,我们要做的之前完全 ...
- Redis实现发布与订阅(转)
简介 Redis发布与发布功能(Pub/Sub)是基于事件座位基本的通信机制,是目前应用比较普遍的通信模型,它的目的主要是解除消息的发布者与订阅者之间的耦合关系. Redis作为消息发布和订阅之间的服 ...
- Redis中的发布与订阅的概念与以命令行的方式实现发布订阅举例
场景 什么是发布与订阅 发布订阅是一种应用程序(系统)之间通讯,传递数据的技术手段,特别是在异构(不同语言)系统之间的作用非常明显. 发布订阅: 类似于微信中关注公众号/订阅号,公众号/订阅号发布的文 ...
- Redis中的发布与订阅
redis中实现发布与订阅相对于zookeeper非常简单.直接使用publish和subscribe就行. subscrible news; 订阅news这个channel publish news ...
最新文章
- Kubernetes安全之认证
- Windows 7 上怎样打开SQL Server 配置管理器
- 利用Eclipse的JPA自动生成注解实体
- Android开发之RecyclerView嵌套ListView自动计算高度的方法
- python逆序数的程序_计算逆序数(归并法)程序问题 (Python)
- 在java中jvm目录_JVM具体在哪个文件夹下的
- C/C++——打开文件存储数据的各种方式
- 人间值得!支付宝宣布平台上登记器官捐献人数:90后占比超一半
- react redux 简化_Redux 源码解析
- 连续语音识别,continuous speech recognition,音标,读音,翻译,英文例句,英语词典
- 关于A 星算法的研究与简单分析及其实现-A star
- 一篇文章彻底搞懂JVM常见垃圾收集器算法、常见收集器、CMS三色标记等(深度剖析)
- scara机器人dh参数表_scara机器人技术参数
- WordPress好看的自适应企业站Start主题
- NAND flash 基础知识
- OpenCV学习笔记(Python)———— 画轮廓
- php 处理透明 png 图片黑边问题
- 一份给艺术爱好者的书单
- 企业一体化信息管理平台是什么
- Google的两种广告推广方式