发布订阅(pub/sub)是一种消息通信模式,主要的目的是解耦消息发布者和消息订阅者之间的耦合。pub /sub不仅仅解决发布者和订阅者直接代码级别耦合,也解决两者在物理部署上的耦合。废话不多说,直接上代码

  1. public class PubSub {
  2. private final String redisChanel1 = "redisChanel1";
  3. private final String redisChanel2 = "redisChanel2";
  4.  
  5. private String redisHost = "10.5.31.155";
  6. private int redisPort = 6379;
  7. private Jedis redis;
  8.  
  9. @Before
  10. public void before() {
  11. redis = new Jedis(redisHost, redisPort);
  12. }
  13.  
  14. @Test
  15. public void pubChanel1() throws InterruptedException {
  16. for (int i = 0; i < 1000; i++) {
  17. // 通过redis的“redisChanel1”频道发布消息
  18. redis.publish(redisChanel1, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " 第" + i + "条消息");
  19. // 消息发布后随即sleep 0-2s
  20. Thread.sleep(Math.round(Math.floor(Math.random() * 2000)));
  21. }
  22. }
  23.  
  24. @Test
  25. public void pubChanel2() throws InterruptedException {
  26. for (int i = 0; i < 1000; i++) {
  27. // 通过redis的“redisChanel2”频道发布消息
  28. redis.publish(redisChanel2, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " 第" + i + "条消息");
  29. // 消息发布后随即sleep 0-2s
  30. Thread.sleep(Math.round(Math.floor(Math.random() * 2000)));
  31. }
  32. }
  33.  
  34. @Test
  35. public void sub() {
  36. // 同时订阅“redisChanel1”频道和“redisChanel2”频道的消息并输出到控制台
  37. redis.subscribe(new JedisPubSub() {
  38. @Override
  39. public void onMessage(String channel, String message) {
  40. System.out.println(channel + "-->" + message);
  41. }
  42. }, redisChanel1, redisChanel2);
  43. }
  44.  
  45. @After
  46. public void after() {
  47. redis.close();
  48. }
  49.  
  50. }

先运行sub方法,再运行pubChanel1、pubChanel2方法,可以看到输出:

  1. redisChanel1-->2018-09-27 18:04:34 0条消息
  2. redisChanel1-->2018-09-27 18:04:35 1条消息
  3. redisChanel2-->2018-09-27 18:04:36 0条消息
  4. redisChanel2-->2018-09-27 18:04:36 1条消息
  5. redisChanel1-->2018-09-27 18:04:36 2条消息
  6. redisChanel1-->2018-09-27 18:04:38 3条消息
  7. redisChanel1-->2018-09-27 18:04:38 4条消息
  8. redisChanel2-->2018-09-27 18:04:38 2条消息
  9. redisChanel1-->2018-09-27 18:04:39 5条消息
    ...

先运行pubChanel1、pubChanel2方法,再运行sub方法,可以看到输出:

  1. redisChanel2-->2018-09-27 18:05:56 2条消息
  2. redisChanel1-->2018-09-27 18:05:57 3条消息
  3. redisChanel1-->2018-09-27 18:05:57 4条消息
  4. redisChanel2-->2018-09-27 18:05:57 3条消息
  5. redisChanel1-->2018-09-27 18:05:58 5条消息
  6. redisChanel2-->2018-09-27 18:05:58 4条消息
  7. 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. P1058 选择题

    P1058 选择题 转跳点:

  2. Product of Polynomials

    题意:多项式相乘,合并同类项后输出每一项的系数. 题目链接:https://www.patest.cn/contests/pat-a-practise/1009 分析:注意合并后系数为0,这一项就不存 ...

  3. nodejs配置 https服务

    const port = normalizePort(process.env.PORT || '3000'); const path = require('path'); const https =  ...

  4. Intellij IDEA中配置TFS

    TFS是微软推出的一款研发过程管理利器,C#阵营的VS里做了默认集成,但是对于Java阵营的Intellij IDEA,需要安装插件并进行相应配置才能使用: 1.打开配置 2.搜索并安装插件 3.配置 ...

  5. mysql sql语句不同平台上大小写区分

  6. POJ 1330:Nearest Common Ancestors

    Nearest Common Ancestors Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20940   Accept ...

  7. 禁用u盘再启用

    将u盘量产为CDROM后,刷入ISO后需要重新插拔u盘才能访问新内容.此文展示的代码可以实现模拟这种行为,免插拔使windows重新读取cdrom. 网上参考资料有限,自行试验了很多种方法,终于成功了 ...

  8. Windows按键消息—虚拟键码(转)

    源地址:http://c.biancheng.net/cpp/html/1253.html 虚拟键码保存在WM_KEYDOWN.WM_KEYUP.WM_SYSKEYDOWN和WM_SYSKEYUP消息 ...

  9. node - 获取当前时间并格式化

    1,安装 moment模块 cnpm i moment --save 2,引入 var moment = require('moment'); 3,获取当前时间并格式化 var current_tim ...

  10. 【LeetCode】反转每对括号间的子串

    [问题]给出一个字符串 s(仅含有小写英文字母和括号). 请你按照从括号内到外的顺序,逐层反转每对匹配括号中的字符串,并返回最终的结果. 注意,您的结果中 不应 包含任何括号. 示例 : 输入:s = ...