redis(四)----发布订阅
发布订阅(pub/sub)是一种消息通信模式,主要的目的是解耦消息发布者和消息订阅者之间的耦合。pub /sub不仅仅解决发布者和订阅者直接代码级别耦合,也解决两者在物理部署上的耦合。废话不多说,直接上代码
public class PubSub {
private final String redisChanel1 = "redisChanel1";
private final String redisChanel2 = "redisChanel2";
private String redisHost = "10.5.31.155";
private int redisPort = 6379;
private Jedis redis;
@Before
public void before() {
redis = new Jedis(redisHost, redisPort);
}
@Test
public void pubChanel1() throws InterruptedException {
for (int i = 0; i < 1000; i++) {
// 通过redis的“redisChanel1”频道发布消息
redis.publish(redisChanel1, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " 第" + i + "条消息");
// 消息发布后随即sleep 0-2s
Thread.sleep(Math.round(Math.floor(Math.random() * 2000)));
}
}
@Test
public void pubChanel2() throws InterruptedException {
for (int i = 0; i < 1000; i++) {
// 通过redis的“redisChanel2”频道发布消息
redis.publish(redisChanel2, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " 第" + i + "条消息");
// 消息发布后随即sleep 0-2s
Thread.sleep(Math.round(Math.floor(Math.random() * 2000)));
}
}
@Test
public void sub() {
// 同时订阅“redisChanel1”频道和“redisChanel2”频道的消息并输出到控制台
redis.subscribe(new JedisPubSub() {
@Override
public void onMessage(String channel, String message) {
System.out.println(channel + "-->" + message);
}
}, redisChanel1, redisChanel2);
}
@After
public void after() {
redis.close();
}
}
先运行sub方法,再运行pubChanel1、pubChanel2方法,可以看到输出:
redisChanel1-->2018-09-27 18:04:34 第0条消息
redisChanel1-->2018-09-27 18:04:35 第1条消息
redisChanel2-->2018-09-27 18:04:36 第0条消息
redisChanel2-->2018-09-27 18:04:36 第1条消息
redisChanel1-->2018-09-27 18:04:36 第2条消息
redisChanel1-->2018-09-27 18:04:38 第3条消息
redisChanel1-->2018-09-27 18:04:38 第4条消息
redisChanel2-->2018-09-27 18:04:38 第2条消息
redisChanel1-->2018-09-27 18:04:39 第5条消息
...
先运行pubChanel1、pubChanel2方法,再运行sub方法,可以看到输出:
redisChanel2-->2018-09-27 18:05:56 第2条消息
redisChanel1-->2018-09-27 18:05:57 第3条消息
redisChanel1-->2018-09-27 18:05:57 第4条消息
redisChanel2-->2018-09-27 18:05:57 第3条消息
redisChanel1-->2018-09-27 18:05:58 第5条消息
redisChanel2-->2018-09-27 18:05:58 第4条消息
redisChanel2-->2018-09-27 18:05:59 第5条消息
...
也就说明:在消费者下线的情况下,生产者生产的消息会丢失。如果要避免这种问题,需要使用专业的消息队列如rabbitMQ等。
redis(四)----发布订阅的更多相关文章
- Redis之发布订阅
一 什么是发布订阅 发布订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都将得到通知 Redis 发布订阅(pub/sub)是一种消息通信模式: ...
- [翻译] C# 8.0 新特性 Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南) 【由浅至深】redis 实现发布订阅的几种方式 .NET Core开发者的福音之玩转Redis的又一傻瓜式神器推荐
[翻译] C# 8.0 新特性 2018-11-13 17:04 by Rwing, 1179 阅读, 24 评论, 收藏, 编辑 原文: Building C# 8.0[译注:原文主标题如此,但内容 ...
- redis(3)发布订阅
一.发布/订阅模式 在软件工程里面,发布/订阅是一种消息模式,这种模式旨在将消息发送者和消息接收者解耦.发送者不需要关心将消息发送给谁,接收者也不需要知道消息的发送者是谁.发送者将消息发布以后就结束动 ...
- Redisson 分布式锁实现之前置篇 → Redis 的发布/订阅 与 Lua
开心一刻 我找了个女朋友,挺丑的那一种,她也知道自己丑,平常都不好意思和我一块出门 昨晚,我带她逛超市,听到有两个人在我们背后小声嘀咕:"看咱前面,想不到这么丑都有人要." 女朋友 ...
- redis的发布订阅模式
概要 redis的每个server实例都维护着一个保存服务器状态的redisServer结构 struct redisServer { /* Pubsub */ // 字典,键为频道, ...
- StackExchange.Redis 使用-发布订阅 (二)
使用Redis的发布订阅功能 redis另一个常见的用途是发布订阅功能 . 它非常的简单 ,当连接失败时 ConnectionMultiplexer 会自动重新进行订阅 . ISubscriber s ...
- .net core 使用Redis的发布订阅
Redis是一个性能非常强劲的内存数据库,它一般是作为缓存来使用,但是他不仅仅可以用来作为缓存,比如著名的分布式框架dubbo就可以用Redis来做服务注册中心.接下来介绍一下.net core 使用 ...
- redis的发布订阅模式pubsub
前言 redis支持发布订阅模式,在这个实现中,发送者(发送信息的客户端)不是将信息直接发送给特定的接收者(接收信息的客户端),而是将信息发送给频道(channel),然后由频道将信息转发给所有对这个 ...
- java实现 redis的发布订阅(简单易懂)
redis的应用场景实在太多了,现在介绍一下它的几大特性之一 发布订阅(pub/sub). 特性介绍: 什么是redis的发布订阅(pub/sub)? Pub/Sub功能(means Publ ...
- spring boot 使用redis进行发布订阅
异步消息的方式有很多,这篇博客介绍如何使用redis进行发布订阅, 完成这个示例只需要三个文件 1.redis消息监听配置 @Configuration public class RedisListe ...
随机推荐
- 弱点扫描-openvas初始化
OPENVAS: NESSUS项目分支:商业版的扫描器 管理目标系统的漏洞 免费开源 Kali 默认安装但是未配置个启动 安装 创建证书 同步弱点数据库 创建客户端证书 重建数据库 备份数据库 启动服 ...
- Go 函数与闭包
函数 1.函数与闭包 func adder() func (value int){ sum := 0 return func(value int) int{ sum += value return s ...
- javascript 原型链污染
原理①javascript中构造函数就相当于类,并且可以将其实例化 ②javascript的每一个函数都有一个prototype属性,用来指向该构造函数的原型同样的javascript的每一个实例对象 ...
- 关于js中异步问题的解决方案
在js中有一个始终无法绕过的问题,如何优雅地解决异步问题.实际上,js在执行过程中,每遇到一个异步函数,都会将这个异步函数放入一个异步队列中,只有当同步线程执行结束之后,才会开始执行异步队列中的函数, ...
- CentOS7安装Jenkins与配置
安装 将Jenkins存储库添加到yum repos,并从此安装Jenkins. sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenki ...
- FC 与 FB 与 OB 的区别,时间标记冲突与一致性检查 有详细的步骤
关键字1 组织块的程序是由用户自己编写. 关键字2 时间标记冲突与一致性检查 有详细的步骤. 关键字3 FC 与 FB 与 OB 的区别? (一)功能 功能块 区别 ? FB 和FC均为 用户编写 ...
- 史无前例!一季度Facebook移除22亿假账号
导读 北京时间5月26日上午消息,Facebook表示平台在第一季度移除了22亿虚假账号.这一创纪录的数据显示了这家公司正在与大量试图破坏全球最大社交网络真实性的负面因素进行斗争. 北京时间5月26日 ...
- Git Fork别人的代码后如同步别人的代码
在git上fork别人的代码后,如果别人代码有更新,自己fork的代码是不能自动更新的.需要手动操作. git remote -v 查看是否有远程分支的别名.例如:git remote -v 后显示如 ...
- Arduino 的读串口与写串口
//准备一下 while(Serial.available()>0) WifiSerial.write(Serial.read()); wh ...
- JavaWeb学习——了解HTML
JavaWeb学习——了解HTML 摘要:本文主要简单介绍了什么是HTML以及如何使用. 定义 是什么 HTML(Hyper Text Markup Language),指的是超文本标记语言. 超文本 ...