发布订阅(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(四)----发布订阅的更多相关文章

  1. Redis之发布订阅

    一 什么是发布订阅 发布订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都将得到通知 Redis 发布订阅(pub/sub)是一种消息通信模式: ...

  2. [翻译] C# 8.0 新特性 Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南) 【由浅至深】redis 实现发布订阅的几种方式 .NET Core开发者的福音之玩转Redis的又一傻瓜式神器推荐

    [翻译] C# 8.0 新特性 2018-11-13 17:04 by Rwing, 1179 阅读, 24 评论, 收藏, 编辑 原文: Building C# 8.0[译注:原文主标题如此,但内容 ...

  3. redis(3)发布订阅

    一.发布/订阅模式 在软件工程里面,发布/订阅是一种消息模式,这种模式旨在将消息发送者和消息接收者解耦.发送者不需要关心将消息发送给谁,接收者也不需要知道消息的发送者是谁.发送者将消息发布以后就结束动 ...

  4. Redisson 分布式锁实现之前置篇 → Redis 的发布/订阅 与 Lua

    开心一刻 我找了个女朋友,挺丑的那一种,她也知道自己丑,平常都不好意思和我一块出门 昨晚,我带她逛超市,听到有两个人在我们背后小声嘀咕:"看咱前面,想不到这么丑都有人要." 女朋友 ...

  5. redis的发布订阅模式

    概要 redis的每个server实例都维护着一个保存服务器状态的redisServer结构 struct redisServer {     /* Pubsub */     // 字典,键为频道, ...

  6. StackExchange.Redis 使用-发布订阅 (二)

    使用Redis的发布订阅功能 redis另一个常见的用途是发布订阅功能 . 它非常的简单 ,当连接失败时 ConnectionMultiplexer 会自动重新进行订阅 . ISubscriber s ...

  7. .net core 使用Redis的发布订阅

    Redis是一个性能非常强劲的内存数据库,它一般是作为缓存来使用,但是他不仅仅可以用来作为缓存,比如著名的分布式框架dubbo就可以用Redis来做服务注册中心.接下来介绍一下.net core 使用 ...

  8. redis的发布订阅模式pubsub

    前言 redis支持发布订阅模式,在这个实现中,发送者(发送信息的客户端)不是将信息直接发送给特定的接收者(接收信息的客户端),而是将信息发送给频道(channel),然后由频道将信息转发给所有对这个 ...

  9. java实现 redis的发布订阅(简单易懂)

    redis的应用场景实在太多了,现在介绍一下它的几大特性之一   发布订阅(pub/sub). 特性介绍: 什么是redis的发布订阅(pub/sub)?   Pub/Sub功能(means Publ ...

  10. spring boot 使用redis进行发布订阅

    异步消息的方式有很多,这篇博客介绍如何使用redis进行发布订阅, 完成这个示例只需要三个文件 1.redis消息监听配置 @Configuration public class RedisListe ...

随机推荐

  1. 冰蝎动态二进制加密WebShell特征分析

    概述 冰蝎一款新型加密网站管理客户端,在实际的渗透测试过程中有非常不错的效果,能绕过目前市场上的大部分WAF.探针设备.本文将通过在虚拟环境中使用冰蝎,通过wireshark抓取冰蝎通信流量,结合平时 ...

  2. pandas包 —— drop()、sort_values()、drop_duplicates()

    一.drop() 函数 当你要删除某一行或者某一列时,用drop函数,它不改变原有的df中的数据,而是返回另一个dataframe来存放删除后的数据. 1.命令: df.drop() 删除行:df.d ...

  3. 图形与动画在Android中的实现

    public class MyView extends View{ Bitmap myBitmap; Paint paint; public MyView(Context context, Attri ...

  4. 063、Java中输出信息

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  5. 019.CI4框架CodeIgniter辅助函数类之:Array数组查询

    01. 数组辅助函数,可以方便的查看数组内部的成员,用法如下图所示: <?php namespace App\Controllers; class Hello extends BaseContr ...

  6. 03.Delphi通过接口实现多重继承的优化

    在上一篇02中,写到的sayhello函数,需要使用2个接口参数,很繁琐.可以使用as参数,把多重继承的子类对象变成需要的对象 uSayHello代码如下 unit uSayHello; interf ...

  7. jQuery事件 - toggle() 方法

    1.切换元素的显示与隐藏状态 实例 切换 <p> 元素的显示与隐藏状态: $(".btn1").click(function(){ $("p").h ...

  8. ZOJ 3802 Easy 2048 Again 状态DP

    zoj 上次的月赛题,相当牛的题目啊,根本想不到是状态压缩好吧 有个预先要知道的,即500个16相加那也是不会超过8192,即,合并最多合并到4096,只有2的12次方 所以用状态压缩表示前面有的序列 ...

  9. 八数码问题 双向BFS/Hsh链表存储

    转自洛谷 作者EndSaH #include<iostream> #include<string> #include<cmath> #include<cstr ...

  10. 《ES6标准入门》(阮一峰)--9.数组的扩展

    1.扩展运算符 含义 扩展运算符(spread)是三个点(...).它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列. console.log(...[1, 2, 3]) // 1 ...