redis subscribe/publish(发布订阅)
redis的发布端
package dubbo.wangbiao.project.pubsub; import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import redis.clients.jedis.JedisPool; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit; public class PublishClient {
public static void main(String[] args) throws InterruptedException {
//创建连接池
GenericObjectPoolConfig poolConfig=new GenericObjectPoolConfig();
poolConfig.setMaxIdle(5);
JedisPool jedisPool = new JedisPool(poolConfig,"127.0.0.1",6379,1000,"123456");
//创建线程池,并设定线程数量
ExecutorService executorService = Executors.newFixedThreadPool(5);
//创建一个发布者
Publisher publisher = new Publisher(jedisPool,"发布者1");
executorService.submit(publisher);
executorService.shutdown();
executorService.awaitTermination(600, TimeUnit.SECONDS);
}
}
redis订阅端
package dubbo.wangbiao.project.pubsub; import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import redis.clients.jedis.JedisPool; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit; public class SubscriberClient { public static void main(String[] args) throws InterruptedException {
//创建redis连接池 GenericObjectPoolConfig poolConfig=new GenericObjectPoolConfig();
poolConfig.setMaxIdle(5);
JedisPool jedisPool = new JedisPool(poolConfig,"127.0.0.1",6379,1000,"123456"); //创建线程池
ExecutorService executorService = Executors.newFixedThreadPool(5);
//创建订阅者
final SubscriberListener subscriberListener = new SubscriberListener("订阅者一号");
//订阅频道
Subscriber subscriber = new Subscriber(jedisPool, subscriberListener, "发布者1");
executorService.submit(subscriber);
executorService.shutdown();
executorService.awaitTermination(60, TimeUnit.SECONDS); //30s后取消订阅
Thread.sleep(3000);
subscriberListener.onUnsubscribe("发布者1", 0);
}
}
redis的发布功能
package dubbo.wangbiao.project.pubsub; import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader; /**
* redis的发布
*/
public class Publisher extends Thread{ private final JedisPool jedisPool;
private String chanelName; public Publisher(JedisPool jedisPool, String chanelName) {
this.jedisPool = jedisPool;
this.chanelName = chanelName;
System.out.println("【发布者\""+chanelName+"\"初始化成功】");
System.out.println("请输入要发布的消息:");
} @Override
public void run() {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Jedis jedis = jedisPool.getResource();
while (true) {
String line = null;
try {
line = reader.readLine();
if (!"quit".equals(line)) {
System.out.println(chanelName+"发布消息成功");
jedis.publish(chanelName, line);
} else {
break;
}
} catch (IOException e) {
e.printStackTrace();
} }
}
}
redis的订阅功能
package dubbo.wangbiao.project.pubsub; import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool; /**
* 订阅者
*/
public class Subscriber extends Thread{
//jedis连接池
private final JedisPool jedisPool;
private final SubscriberListener subscriberListener; private String channelName; public Subscriber(JedisPool jedisPool, SubscriberListener subscriberListener, String channelName) {
super();
this.jedisPool = jedisPool;
this.subscriberListener = subscriberListener;
this.channelName = channelName;
} @Override
public void run() {
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
jedis.subscribe(subscriberListener,channelName);// 通过jedis.subscribe()方法去订阅,入参是1.订阅者、2.频道名称
} catch (Exception e) {
e.printStackTrace();
System.out.println(String.format("频道订阅失败:%s",e));
} finally {
if (null != jedis) {
jedis.close();
}
}
}
}
发布订阅监听端
package dubbo.wangbiao.project.pubsub; import redis.clients.jedis.JedisPubSub; /**
* 订阅的监听
*/
public class SubscriberListener extends JedisPubSub { private String subName;
public SubscriberListener(String subName) {
this.subName = subName;
} // 取得订阅的消息后的处理
@Override
public void onMessage(String channel, String message) {
System.out.println(String.format("【"+subName + "接收到消息】频道:%s;消息:%s。" , channel , message));
} // 初始化订阅时候的处理
@Override
public void onSubscribe(String channel, int subscribedChannels) {
System.out.println(String.format( "【"+subName + "订阅频道成功】频道:%s;频道数:%d。" , channel , subscribedChannels));
} // 取消订阅时候的处理
@Override
public void onUnsubscribe(String channelName, int subscribedChannels) {
System.out.println(String.format( "【"+subName + "取消订阅】频道:%s;频道数:%d。",channelName , subscribedChannels));
}
}
客户端命令演示:
- publish/subscribe是一对多的关系,
- Redis Psubscribe 命令订阅一个或多个符合给定模式的频道。
- 每个模式以 * 作为匹配符,比如 it* 匹配所有以 it 开头的频道( it.news 、 it.blog 、 it.tweets 等等)。 news.* 匹配所有以 news. 开头的频道( news.it 、 news.global.today 等等),诸如此类。
redis subscribe/publish(发布订阅)的更多相关文章
- 【python】-- RabbitMQ Publish\Subscribe(消息发布\订阅)
RabbitMQ RabbitMQ Publish\Subscribe(消息发布\订阅) 1对1的消息发送和接收,即消息只能发送到指定的queue里,但这样使用有些局限性,有些时候你想让你的消息被所有 ...
- 15天玩转redis —— 第九篇 发布/订阅模式
本系列已经过半了,这一篇我们来看看redis好玩的发布订阅模式,其实在很多的MQ产品中都存在这样的一个模式,我们常听到的一个例子 就是邮件订阅的场景,什么意思呢,也就是说100个人订阅了你的博客,如果 ...
- redis中的发布订阅(Pub/Sub)
这里使用nodejs的redis模块说明,具体可见https://www.npmjs.com/package/redis,先来通过一个简单的例子了解下redis中的Pub/Sub具体怎么实现吧.. v ...
- python开发-实现redis中的发布订阅功能
Python3学习(二十七):python实现Redis的订阅与发布(sub-pub机制) 先介绍一下redis的pub/sub功能: Pub/Sub功能(means Publish, Subscri ...
- springboot集成redis实现消息发布订阅模式-双通道(跨多服务器)
基础配置参考https://blog.csdn.net/llll234/article/details/80966952 查看了基础配置那么会遇到一下几个问题: 1.实际应用中可能会订阅多个通道,而一 ...
- RabbitMQ --- Publish/Subscribe(发布/订阅)
目录 RabbitMQ --- Hello Mr.Tua RabbitMQ --- Work Queues(工作队列) 前言 在第二篇文章中介绍了 Work Queues(工作队列),它适用于把一个消 ...
- 【c#】RabbitMQ学习文档(三)Publish/Subscribe(发布/订阅)
(本教程是使用Net客户端,也就是针对微软技术平台的) 在前一个教程中,我们创建了一个工作队列.工作队列背后的假设是每个任务会被交付给一个[工人].在这一部分我们将做一些完全不同的事情--我们将向多个 ...
- redis pub/sub 发布订阅
Redis的列表数据结构有blpop和brpop命令,能从列表里返回且删除第一个(或最后一个)元素,或者被堵塞,直到有一个元素可供操作.这可以用来实现一个简单的队列.(参考:http://www.cn ...
- Redis管道和发布订阅
管道:原子性执行命令 ''' redis-py默认在执行每次请求都会创建(连接池申请连接)和断开(归还连接池)一次连接操作, 如果想要在一次请求中指定多个命令,则可以使用pipline实现一次请求指定 ...
随机推荐
- 动静态web项目(三)
在Eclipse中将web项目分为了Dynamic Web Project和Static Web Project. 那么这两种有什么区别呢? 其实这里的Dynamic和Static是通过页面来区分的. ...
- [蓝牙嗅探-Ubertooth One] 千元开源蓝牙抓包 Ubertooth One 安装和使用
目录 前言 1.编译 Ubertooth tools 1.1.准备工作 1.2.编译安装 libbtbb 1.3.编译安装 Ubertooth tools 1.4.Wireshark 插件 1.5.更 ...
- 在Windows7/8/10 64位操作系统下安装并注册ocx控件
例如: 先网上下载一个MtbLine.ocx控件放入C:\Windows\SysWOW64\目录下 1.首先确保你的 Windows7 账户是管理员权限 2.下载MtbLine.ocx控件,网上可搜到 ...
- C++五十一篇 -- VS2017开发人员新闻无法联网
参考链接:https://blog.csdn.net/zz1589275782/article/details/88364983 这几天玩了下以前的电脑,本来想更新一下Visual Studio In ...
- golang可执行文件瘦身(缩小文件大小)
起因 golang部署起来极其遍历,但有时候希望对可执行文件进行瘦身(缩小文件大小) 尝试 情况允许情况下,交叉编译为32位 删除不必要的符号表.调试信息 尝试用对应平台的upx打压缩壳 解决 经过多 ...
- Pb代理工具之mitmproxy
mitmproxy 一 . mitmproxy介绍 mitmproxy 就是用于 MITM 的 proxy,MITM 即中间人攻击(Man-in-the-middle attack). 不同于 fid ...
- JDK1.7HashMap死锁
JDK1.7HashMap多线程问题 Java技术交流群:737698533 在看之前可以先看看JDK1.7的Hashmap的源码 HashMap在多线程情况下是不安全的,一个是数据的准确性问题,一个 ...
- .NET 6 预览版 5 发布
很高兴.NET 6 预览版5终于跟大家见面了.我们现在正处于.NET 6 的后半部分,开始整合一些重要的功能. 例如.NET SDK 工作负载,它是我们.NET 统一愿景的基础,可以支持更多类型的应用 ...
- Tr0ll靶机
一.主机探测 二.信息收集 进入21端口 发现文件并下载 下载文件 作为字典进行登录爆破 用字典爆破 ssh登录 查找信息 /etc/init.d/ssh start scp root@192.1 ...
- fiddler各种颜色锁说明