精华内容
下载资源
问答
  • 总结 Redis: 轻量级,低延迟,高...rabbitmq是一个专门的AMQP协议队列,他的优势就在于提供可靠的队列服务,并且可做到异步,而redis主要是用于缓存的,redis的发布订阅模块,可用于实现及时性,且可靠性低的功能,

    总结

    Redis: 轻量级,低延迟,高并发,低可靠性,redis是一种基于键值对(key-value)数据库。

    Redis:主要是用于缓存的,Redis的发布订阅模块,可用于实现及时性,且可靠性低的功能。

    Redis主要的特性:读写速度快,键值对的数据结构服务器,丰富的功能,简单稳定,持久化,主从复制,高可用和分布式转移,客户端语言多。可以用于小型项目的消息队列。

    RabbitMQ:重量级,高可靠,异步,不保证实时;
     

    RabbitMQ是一个专门的AMQP协议队列,他的优势就在于提供可靠的队列服务,并且可做到异步,可以用于大型项目的消息队列

                                                                            Redis与RabbitMQ实时性对比

            对比项                        Redis                                RabbitMQ
            持久性Redis的持久化是针对于整个Redis缓存的内容,它有RDB和AOF两种持久化方式,Redis持久化方式,后续更新,可以将整个Redis实例持久化到磁盘,以此来做数据备份,防止异常情况下导致数据丢失。队列,消息都可以选择性持久化,持久化粒度更小,更灵活。
          队列监控Redis没有监控平台RabbitMQ实现了后台监控平台,可以在该平台上看到所有创建的队列的详细情况,良好的后台管理平台可以方面我们更好的使用。
          负载均衡Redis发布订阅模式,一个队列可以被多个消费者同时订阅,当有消息到达时,会将该消息依次发送给每个订阅者。RabbitMQ队列可以被多个消费者同时监控消费,但是每一条消息只能被消费一次,由于RabbitMQ的消费确认机制,因此它能够根据消费者的消费能力而调整它的负载。
          实时性实时性高,Redis作为高效的缓存服务器,所有数据都存在在服务器中,所以它具有更高的实时性。无,因为RabbitMQ会把未接收的消息放入通道中,或者放入交换机中,直到消费者前来消费这条消息。
          可靠性没有相应的机制保证消息的可靠消费,如果发布者发布一条消息,而没有对应的订阅者的话,这条消息将丢失,不会存在内存中。具有消息消费确认机制,如果发布一条消息,还没有消费者消费该队列,那么这条消息将一直存放在队列中,直到有消费者消费了该条消息,以此可以保证消息的可靠消费。

    本文有些内容摘录:

    将redis发布订阅模式用做消息队列和rabbitmq的区别_听砜_51CTO博客

                                                                                                                                                                 特此声明!!!!!!!

    展开全文
  • 问题背景   在我的聊天服务器项目中,尝试使用nginx的tcp负载均衡来提升多并发的能力,与此同时也带来了另一个问题。因为有了多台服务器,就必须要解决跨服务器通信的问题。...client2client2是好友关

    问题背景

      在我的聊天服务器项目中,尝试使用nginx的tcp负载均衡来提升多并发的能力,与此同时也带来了另一个问题。因为有了多台服务器,就必须要解决跨服务器通信的问题。
      在服务器中有一个_userConnMap,用于存储当前在线用户及其TcpConnection
    在这里插入图片描述

    问题解决思路&&步骤

      假设当前处理client1业务的服务器是Chatserver1,处理client2业务的服务器ChatServer2。client2和client2是好友关系,如果用户1想要给用户2发送消息,就属于跨服务器通信。
    大致处理步骤如下:
    1.在当前服务器的_userConnMap中查找client2的id,如果找到了,就说明client2也在这一台服务器上,直接通信就行。
    2.如果当前_userConnMap找不到client2,就在数据库中查询client2的状态,如果是offline,就将消息存入数据库。
    3.如果其状态是online,则说明client2登录在其它服务器上,需要引入中间件消息队列,来处理。

    redis环境安装和配置

    1.使用sudo apt-get install redis-server,安装redis服务
    在这里插入图片描述2.ps - ef | grep redis 查看redis服务是否启动了
    在这里插入图片描述3.启动redis-cli客户端,测试redis的数据缓存功能
    在这里插入图片描述
    在这里插入图片描述
      redis的发布-订阅机制:发布-订阅模式包含两种角色,分别是消息的发布者和消息的订阅者。订阅者可以订阅一个或者多个channel,发布可以向指定channel发送消息,所有订阅此channel的订阅者都会收到此消息。
    订阅channel的命令 :subscribe channel
    发布channel的命令 :publish channel massage

    展开全文
  • 搜索热词数据库存贮都用list形式 要存2个队列 1个用作消息队列保存到数据 还有个 就是用来实时读取数据在redis$redis->lpush($queenkey,json_encode($array));$redis->lpush($listkey,json_encode($array));/*...

    搜索热词

    数据库存贮都用list形式 要存2个队列 1个用作消息队列保存到数据 还有个 就是用来实时读取数据在redis

    $redis->lpush($queenkey,json_encode($array));

    $redis->lpush($listkey,json_encode($array));

    /*消息队列实例*/

    public function insertinfo()

    {

    $infos = array('info1' => mt_rand(10,100),'info2' => mt_rand(10,100));

    $this->insertinfos($infos,'tutorial-list','tutoriallist');

    }

    public function insertinfos($array,$queenkey,$listkey)

    {

    //连接本地的 Redis 服务

    $redis = new \Redis();

    $redis->connect('127.0.0.1',6379);

    //存储数据到列表中

    $redis->lpush($queenkey,json_encode($array));

    }

    读取 逻辑当redis key没有了 就读取数据库 然后重新写入list 有的话就读取redis数据

    /*读取实例*/

    public function getinfo()

    {

    $sql = 'select * from mobantestinfo';

    $result = $this->getinfos('tutoriallist',$sql);

    //redis key不为空 直接读取redis

    if(empty($result)){

    //连接本地的 Redis 服务

    $redis = new \Redis();

    $redis->connect('127.0.0.1',6379);

    // 获取存储的数据并输出

    $result = $redis->lrange('tutoriallist',-1);

    foreach ($result as $k=>$v){

    $result[$k]=json_decode($v,true);

    }

    print_r($result);

    exit();

    }

    }

    function getinfos($key,$sql)

    {

    //连接本地的 Redis 服务

    $redis = new \Redis();

    $redis->connect('127.0.0.1',6379);

    // 获取存储的数据

    $result = $redis->lrange($key,1);

    if (empty($result)) {

    $VModel = new HuanShanVoteModel();

    $result = $VModel->query($sql);

    //重新将缓存队列的形式放入数据库

    foreach ($result as $k=>$v){

    //这个地方要从右边插入 来保证跟数据库顺序一样

    $redis->rpush($key,json_encode($v));

    }

    } else {

    $result=0;

    }

    return $result;

    }

    以上就是小编为大家带来的PHPredis提高消息队列的实时性方法(推荐)全部内容了,希望大家多多支持编程小技巧~

    总结

    如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

    本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

    展开全文
  • //订阅到服务器的topic标识 String SUBSCRIBE_TOPIC = "v1/devices/me/rpc/request/+"; //mqtt连接 MqttClient mqttClient = new MqttClient(THINGSBOARD_HOST, PUBLISH_CLIENTID, new MemoryPersistence()); //...

    1.首先本地建立mqtt协议的服务器

    2.直接上代码

    package io.test;

    import java.util.Date;

    import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;

    import org.eclipse.paho.client.mqttv3.MqttCallbackExtended;

    import org.eclipse.paho.client.mqttv3.MqttClient;

    import org.eclipse.paho.client.mqttv3.MqttConnectOptions;

    import org.eclipse.paho.client.mqttv3.MqttException;

    import org.eclipse.paho.client.mqttv3.MqttMessage;

    import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;

    public class mqtt3 {

    public static void main(String[] args) throws MqttException {

    // 本地mq服务器

    String THINGSBOARD_HOST = "tcp://localhost:1883";

    //标识mq发送的客户端id

    String PUBLISH_CLIENTID = "clientId";

    //发送到服务器的topic标识

    String PUBLISH_TOPIC = "v1/devices/me/telemetry";

    //订阅到服务器的topic标识

    String SUBSCRIBE_TOPIC = "v1/devices/me/rpc/request/+";

    //mqtt连接

    MqttClient mqttClient = new MqttClient(THINGSBOARD_HOST, PUBLISH_CLIENTID, new MemoryPersistence());

    //设置超时时间

    mqttClient.setTimeToWait(10000);

    //进行连接

    mqttClient.connect(getOptions());

    //订阅

    mqttClient.subscribe(SUBSCRIBE_TOPIC, 2);

    //回调方法

    mqttClient.setCallback(new MqttCallbackExtended() {

    @Override

    public void messageArrived(String topic, MqttMessage message) throws Exception {

    String context = new String(message.getPayload());

    System.out.println(context);

    }

    @Override

    public void deliveryComplete(IMqttDeliveryToken token) {

    // TODO Auto-generated method stub

    }

    @Override

    public void connectionLost(Throwable cause) {

    // TODO Auto-generated method stub

    System.out.println("connect lost");

    }

    @Override

    public void connectComplete(boolean reconnect, String serverURI) {

    // TODO Auto-generated method stub

    System.out.println("connect success-------");

    }

    });

    String sendCon="{\"ts\":"+new Date().getTime()+", \"values\":{\"test\":1111}}";

    mqttClient.publish(PUBLISH_TOPIC, sendCon.getBytes(), 0, false);

    System.out.println("发送成功:"+sendCon);

    }

    //连接到mqtt的连接参数配置

    public static MqttConnectOptions getOptions() {

    MqttConnectOptions options = new MqttConnectOptions();

    //设置session是否保留上一条记录

    options.setCleanSession(false);

    //连接超时时间

    options.setConnectionTimeout(10);

    //心跳会话时间

    options.setKeepAliveInterval(60);

    //自动重连

    options.setAutomaticReconnect(true);

    return options;

    }

    }

    3.我是用的mqtt3 直接引入包:

    org.eclipse.paho

    org.eclipse.paho.client.mqttv3

    1.2.0

    展开全文
  • 最基本的模式就是点对点模式,一个生产者向队列中投入消息,一个消费者循环从队列中取数据php-amqplibproducerrequire_once __DIR__ . '/../composer/vendor/autoload.php';use PhpAmqpLib\Connection\...
  • Redis不仅可作为缓存服务器,还可用作消息队列。它的列表类型天生支持用作消息队列。如下图所示:队列主要是为了保证队列中的数据不会被重复消费,消费队列数据一般有主动消费何自动消费,主动消费及利用程序去队列...
  • 发布订阅(pub/sub)是一种消息通信模式:发送者...那么发布订阅和生产消费有何异同之处呢?生产消费主要是生成一个消息只能被一个客户端消费,而发布订阅可以理解为发布一条消息,在该频道中的所有客户端都会收到,所...
  • SpringBoot整合RocketMQ、发布订阅、顺序消息、事物消息消息重试死信队列 一、RocketMQ RocketMQ是阿里巴巴旗下一款开源的MQ框架,经历过双十一考研、Java编程语言实现,有非常好完整生态系统 Rocketmq相比于...
  • 一般来说,消息队列有两种场景,一种是发布订阅者模式,一种是生产者消费者模式。 生产者消费者模式: 就像我们用微信好友(群聊除外)聊天一样,微信就是这个队列,我们可以很多个好友聊天,但是每条消息...
  • Redis和消息队列

    2021-09-02 17:04:29
    消息发送者(生产者)发布消息,一个或多个消费者订阅消息,消息发送者和消息接收者并没有直接耦合,对新增业务而言,只要对某类消息感兴趣,就可以订阅该消息,对原有的系统和业务没有任何的影响。从而实现网站业务...
  • 发布/订阅模型又称扇出模型,或者是广播模型,可以有多个消费者,每个消费者有自己的队列,每个队列都要绑定到交换机,生产者发送的消息只需要发送到交换机,再由交换机决定要发送到哪些队列,生产者无法自行决定。...
  • 前言redis可以实现发布订阅和消息队列的功能。两者的区别在于订阅者可以是多个,且可以同时处理发布上来的消息,如果订阅者不在线(服务没有启动)消息将丢失,消息没有持久化。发布和订阅是一块执行的,缺少一个直接...
  • /** 发布-订阅* create by superid*/json$queueName = 'superid';$exchangeName = 'superid';$routeKey = 'superid';函数$conn_args = array('host' => '127.0.0.1','port' => '5672','login' => 'guest','...
  • 概念名称及含义channel频道:生产者消费者直接操作的对象publish生产者:向channel发送消息subscribe消费者:订阅一个或多个channelpsubscribe消费者:匹配订阅一个或多个channelpunsubscribe退订:匹配退订,无...
  • 详细介绍了Redis 的Pub/Sub的相关命令优缺点,以及如何实现简单的消息队列
  • 一般来说,消息队列有两种场景,一种是发布订阅者模式,一种是生产者消费者模式。利用redis这两种场景的消息队列都能够实现。定义:生产者消费者模式:生产者生产消息放到队列里,多个消费者同时监听队列,谁先抢...
  • 在项目中用到了redis作为...同时在更高层面上,Redis还支持"发布/订阅"的消息模式,可以基于此构建一个聊天系统。一、redis的列表类型天生支持用作消息队列。(类似于MQ的队列模型--任何时候都可以消费,一条消息只能...
  • 一、fanout发布/订阅模式 生产者可以将消息发送给不同类型的消费者。做到发布一次,消费多次。如下图: 代码演示 1、生产者模拟下订单 @Service public class OrderService { @Autowired private ...
  • 点击上方“朱小厮的博客”,选择“设为星标”后台回复"书",获取后台回复“k8s”,可领取k8s资料导语 |市面上有非常多的消息中间件,rabbitMQ、kafka、roc...
  • 所以消息队列可以解决应用解耦、异步消息、流量削锋等问题,是实现高性能、高可用、可伸缩最终一致性架构中不可以或缺的一环。 现在比较常见的消息队列产品主要有ActiveMQ、RabbitMQ、ZeroMQ、Kafka、RocketMQ等...
  • 1、对比 特性 redis RabbitMQ ...没有相应的机制保证消息的可靠消费,如果发布者发布一条消息,而没有对应的订阅者的话,这条消息...发布订阅模式,一个队列可以被多个消费者同时订阅,当有消息到达时,会将该消息
  • 在 Redis 中提供了专门的类型:Publisher(发布者) Subscriber(订阅者)来实现消息队列。 在文章开始之前,先来介绍消息队列中有几个基础概念,以便大家更好的理解本文的内容。 首先,发布消息的叫做发布方或...
  • 使用spring支持redis实现消息队列,参考官方样例:https://spring.io/guides/gs/messaging-redis/实现后在运行过程中发现消费者在接收消息时会出现乱码的情况。经排查是由于序列化工具不同导致的。生产者的配置...
  • 前言#消息队列中点对点与发布订阅区别 ##背景知识 JMS一个在 Java标准化组织(JCP)内开发的标准(代号JSR 914)。2001年6月25日,Java消息服务发布JMS 1.0....
  • 一、为什么使用消息队列? 其实就是问问你消息队列都有哪些使用场景,然后你项目里具体是什么场景,说说你在这个场景里用消息队列是什么? 面试官问你这个问题,期望的一个回答是说,你们公司有个什么业务场景,这个...
  • 分布式消息队列的演进

    千次阅读 2021-10-01 00:35:17
    作者:vincentchma,腾讯 IEG 后台开发工程师一、消息队列的演进分布式消息队列中间件是是大型分布式系统中常见的中间件。消息队列主要解决应用耦合、异步消息、流量削锋等问题,具有高...
  • Windows 消息队列

    2021-04-14 02:06:08
    事务消息消息队列安装使用消息队列1. 消息队列安装2. 创建消息队列在 C# 中使用消息队列1. 创建消息队列2. 搜索消息队列3. 打开已知队列4. 发送消息5. 接收消息6. 异步读取消息事务队列在 WCF 中使用消息队列 ...
  • 发布-订阅队列

    2021-04-05 16:32:52
    我们这个队列主要解决的问题是,生产者生产的东西要消费者同时都得到,所以我们在这之间添加了几个交换机。 先开启消费者 声明交换机,通过交换机获取队列,在进行绑定 package org.example.exchange.ex.recv; ...
  • 没有专门写zeromq的书,网上的资料多是一些代码的实现简单介绍。rocketmq:少。没有专门写rocketmq的书,网上的资料良莠不齐,官方文档很简洁,但是对技术细节没有过多的描述。activemq:多。没有专门写activemq的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 82,439
精华内容 32,975
关键字:

发布订阅和消息队列