博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
6、消息发布和订阅功能
阅读量:6802 次
发布时间:2019-06-26

本文共 3266 字,大约阅读时间需要 10 分钟。

hot3.png

一:介绍

redis提供了简单的发布订阅功能,producer往某个channel推送,client订阅指定的channel(可以模糊匹配),这样就能够消费。

redis和rabbitmq的区别

  • 可靠性

    • redis :没有相应的机制保证消息的可靠消费,如果发布者发布一条消息,而没有对应的订阅者的话,这条消息将丢失,不会存在内存中;

    • rabbitmq:具有消息消费确认机制,如果发布一条消息,还没有消费者消费该队列,那么这条消息将一直存放在队列中,直到有消费者消费了该条消息,以此可以保证消息的可靠消费,那么rabbitmq的消息是如何存储的呢?(后续更新);

  • 实时性

    • redis:实时性高,redis作为高效的缓存服务器,所有数据都存在在服务器中,所以它具有更高的实时性
  • 消费者负载均衡:

    • rabbitmq队列可以被多个消费者同时监控消费,但是每一条消息只能被消费一次,由于rabbitmq的消费确认机制,因此它能够根据消费者的消费能力而调整它的负载;

    • redis发布订阅模式,一个队列可以被多个消费者同时订阅,当有消息到达时,会将该消息依次发送给每个订阅者;

  • 持久性

    • redis:redis的持久化是针对于整个redis缓存的内容,它有RDB和AOF两种持久化方式(redis持久化方式,后续更新),可以将整个redis实例持久化到磁盘,以此来做数据备份,防止异常情况下导致数据丢失。

    • rabbitmq:队列,消息都可以选择性持久化,持久化粒度更小,更灵活;

  • 队列监控

    • rabbitmq实现了后台监控平台,可以在该平台上看到所有创建的队列的详细情况,良好的后台管理平台可以方面我们更好的使用;

    • redis没有所谓的监控平台。

  • 总结

    • redis:       轻量级,低延迟,高并发,低可靠性;
    • rabbitmq:重量级,高可靠,异步,不保证实时;
    • rabbitmq是一个专门的AMQP协议队列,他的优势就在于提供可靠的队列服务,并且可做到异步,而redis主要是用于缓存的,redis的发布订阅模块,可用于实现及时性,且可靠性低的功能。

二:发布/订阅代码例子

  • 1、pom依赖

    redis.clients
    jedis
    2.9.0
  • 2、publish ==> 只管往chennel发送数据

    public class Publisher {      public static void main(String[] args) {          JedisPool pool = new JedisPool("192.168.50.10", 6279);          while (true) {              Jedis jedis = null;              try {                  jedis = pool.getResource();                  // 就这一句关键推送                  jedis.publish("channel1", "我是channel1 的msg");                  jedis.publish("channel2", "我是channel2 的msg");              } catch (Exception e) {                  e.printStackTrace();              } finally {                  if (jedis != null) {                      jedis.close();                  }              }          }      }  }
  • 3、Subscriber ==> 定义一个订阅者处理类

    public class Subscriber extends JedisPubSub {      public Subscriber() {      }      [@Override](https://my.oschina.net/u/1162528)      public void onMessage(String channel, String message) {     //收到消息会调用          System.out.println(String.format("receive redis published message, channel %s, message %s", channel, message));      }      [@Override](https://my.oschina.net/u/1162528)      public void onSubscribe(String channel, int subscribedChannels) { //订阅了频道会调用          System.out.println(String.format("subscribe redis channel success, channel %s, subscribedChannels %d",                  channel, subscribedChannels));      }      [@Override](https://my.oschina.net/u/1162528)      public void onUnsubscribe(String channel, int subscribedChannels) {//取消订阅 会调用          System.out.println(String.format("unsubscribe redis channel, channel %s, subscribedChannels %d",                  channel, subscribedChannels));      }  }
  • 4、jedis订阅某个主题,并且调用Subscriber来处理

    public class SubMain {      public static void main(String[] args) {          JedisPool jedisPool = new JedisPool("192.168.50.10", 6279);          Jedis jedis = null;          try {              jedis = jedisPool.getResource();              jedis.subscribe(new Subscriber(), "channel1", "channel2");              jedis.psubscribe(new Subscriber(), "*cha*");          } catch (Exception e) {              e.printStackTrace();          } finally {              if (jedis != null) {                  jedis.close();              }          }      }  }

转载于:https://my.oschina.net/liufukin/blog/3026881

你可能感兴趣的文章
Java回调函数
查看>>
linux sort 命令详解
查看>>
总结一下近期的面试题(一)
查看>>
Guava学习笔记:EventBus
查看>>
cordova-plugin-alipay-v2使用沙箱环境
查看>>
OSC android app 退出方法改进
查看>>
android UI之button异步处理
查看>>
quantum 相关问题总结
查看>>
Hadoop学习
查看>>
深入了解android平台的jni---编译ffmpeg源码
查看>>
计算机常用端口一览表
查看>>
【转载】Unity3d引用外部的dll
查看>>
在Oracle Enterprise Linux中安装Oracle 11g
查看>>
CentOs7 急速安装 MongoDB
查看>>
Centos6.5 git 源码安装
查看>>
android自定义TabView实现圆角列表
查看>>
HDFS之SequenceFile和MapFile
查看>>
12, Pipe
查看>>
JAVA 7 中遍历文件目录
查看>>
MySQL命令行
查看>>