RabbitMQ简介、概念、安装、启动、工作模式

2023-05-16

RabbitMQ简介、概念、安装、启动、工作模式


1、RabbitMQ简介

  • RabbitMQ是支持多种消息协议,易于部署和使用的开源消息代理服务器,用于在分布式系统中存储转发消息
    由以高性能、健壮以及可伸缩性出名的Erlang语言编写;提供了成熟的高并发,高可用的解决方案
    可以根据实际业务情况动态地扩展集群节点在集群中的机器上设置镜像,使得在部分节点出现问题的情况下仍然可用
  • 支持多种客户端语言,如:Python、Ruby、.NET、Java等,支持AJAX
  • RabbitMQ提供了一个易用的用户界面,使得用户可以监控和管理消息、集群中的节点等。

2、Message Queue : MQ

  • 跨进程的通信机制,用来在系统之间进行传递
  • MQ作为中间件,可以进行系统间异步请求和响应,从而减少响应数据及解耦
  • MQ典型应用场景:
    • 异步处理。把消息放入消息中间件中,等到需要的时候再去处理。
    • 流量削峰。例如秒杀活动,在短时间内访问量急剧增加,使用消息队列,当消息队列满了就拒绝响应,跳转到错误页面,这样就可以使得系统不会因为超负载而崩溃。
    • 日志处理
    • 应用解耦。假设某个服务A需要给许多个服务(B、C、D)发送消息,当某个服务(例如B)不需要发送消息了,服务A需要改代码再次部署;当新加入一个服务(服务E)需要服务A的消息的时候,也需要改代码重新部署;另外服务A也要考虑其他服务挂掉,没有收到消息怎么办?要不要重新发送呢?是不是很麻烦,使用MQ发布订阅模式,服务A只生产消息发送到MQ,B、C、D从MQ中读取消息,需要A的消息就订阅,不需要了就取消订阅,服务A不再操心其他的事情,使用这种方式可以降低服务或者系统之间的耦合。

3、MQ安装

  • Window环境下安装与使用RabbitMQ
    • 安装Erlang程序运行环境
      • 下载地址http://www.erlang.org/downloads
    • 安装RabbitMQ服务器
      • 下载地址http://www.rabbitmq.com/
    • 启动RabbitMQ服务
    • 激活RabbitMQ管理控制台
      • cd sbin
      • rabbitmq-plugins.bat enable rabbitmq_management
    • 通过浏览器进行访问
      • http://localhost:15672/
    • 用户名:guest 密码:guest
  • linux安装
    • 下载Erlang运行环境RPM包
    • https://www.erlang-solutions.com/resources/download.html
      esl-erlang_21.2.6-1_centos_7_amd64.rpm
    • 下载RabbitMQ服务器安装包
      http://www.rabbitmq.com/install-rpm.html#downloads
      rabbitmq-server-3.7.13-1.el7.noarch.rpm
    • 安装rpm包
      rpm -ivh --nodeps esl-erlang_21.2.6-1_centos_7_amd64.rpm
      rpm -ivh --nodeps rabbitmq-server-3.7.13-1.el7.noarch.rpm
    • 启用服务:前台启动
      rabbitmq-server
    • 启用控制台
      • 通过后台管理插件我们可以动态监控mq的流量,创建用户,队列等。
      • rabbitmq-plugins enable rabbitmq_management

4、启动、停止服务

  • rabbitmq-server 前台启动
  • rabbitmq-server -detached 后台启动服务
  • rabbitmqctl stop 停止服务

5、登录网页管理界面

rabbitmq的网页管理的端口是15672,如果你是远程操作服务器,输入http://ip:15672,发现连接不上,因为服务器防火墙不允许这个端口远程访问;

放行防火墙端口

# 将mq的tcp监听端口和网页管理端口都设置成允许远程访问

firewall-cmd --permanent --add-port=15672/tcp
firewall-cmd --permanent --add-port=5672/tcp
systemctl restart firewalld.service

管理界面介绍

# 输入用户名密码登录后进入主界面
Overview:用来显示流量,端口,节点等信息,以及修改配置文件;
Connections:显示所有的TCP连接;
channels:显示所有的信道连接;
exchanges:显示所有的交换机以及创建删除等;
queues:显示所有的队列以及创建删除等;
admins:显示所有的用户以及用户管理;

6、概念

  • 生产者: 用来向队列(或交换机)发送消息
  • 消费者: 处理(消费)队列中的消息
  • 消息: 队列中进行存储的数据
  • 队列: 存放消息的容器,安装先进先出的方式进行存储
  • 虚拟主机:用来存储消息队列,类似MySQL中的数据库。

7、常用命令

  • 创建虚拟主机

    • rabbitmqctl add_vhost /名称
    • rabbitmqctl delete_vhost [vhost_name]
  • rabbitmq有一个默认的用户名和密码,guest和guest,但为了安全考虑,该用户名和密码只允许本地访问,如果是远程操作的话,需要创建新的用户名和密码;

    • 创建用户
      • rabbitmqctl add_user 用户名 密码
      • rabbitmqctl add_user {username} {password}
    • 删除
      • rabbitmqctl delete_user {username}
    • 修改密码
      • rabbitmqctl change_password {username} {newpassword}
  • 设置标签(用户角色)

    • rabbitmqctl set_user_tags 用户名 角色

    • 用户角色说明

    • management:用户可以访问管理插件
      policymaker:用户可以访问管理插件,并管理他们有权访问的vhost的策略和参数。
      monitoring:用户可以访问管理插件,查看所有连接和通道以及与节点相关的信息。
      administrator:用户可以做任何监视可以做的事情,管理用户,vhost和权限,关闭其他用户的连接,并管理所有vhost的政策和参数。
      
  • 设置权限:设置用户可以访问哪些vhost;配置权限、读权限、写权限

    rabbitmqctl set_permissions -p /虚拟主机名称  用户名 '.*' '.*'  '.*'
    

8、Java客户端访问RabbitMQ

  • 添加依赖
<dependency>
      <groupId>com.rabbitmq</groupId>
      <artifactId>amqp-client</artifactId>
      <version>5.9.0</version>
    </dependency>
  • 生产者端开发,程序编码
public static void main(String[] args) throws IOException, TimeoutException {
        //创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("192.168.8.113");
        factory.setPort(5672);
        factory.setUsername("root");
        factory.setPassword("root");
        factory.setVirtualHost("/myvhost");
        //获取连接
        Connection con = factory.newConnection();
        //创建通道
        Channel channel = con.createChannel();
        //声明队列:创建一个队列,如果vhost中没有则创建对列,如果有则直接使用。
        //参数一:队列的名称
        //参数二:是否持久化
        //参数三:是否私有化,true表示私有化,只有第一次访问该队里的消费者才能使用该队列;false表示所有消费者都可以访问队列。
        //参数四:表示是否自动删除,当消费者连接断开后是否删除该队列。false表示不删除
        //参数五: 其他一些额外参数的配置,比如延迟时间
        channel.queueDeclare("simple_queue",true,false,false,null);
        //发布消息
        //参数1:是交换机的名称,暂时不用
        //参数2:队列名称
        //参数3:额外的参数
        //参数4:要投递的消息
        channel.basicPublish("","simple_queue",null,"这是一条message".getBytes());
        channel.close();
        con.close();
        System.out.println("消息发送成功!");
    }
  • 消费者端
public static void main(String[] args) throws IOException, TimeoutException {
        Connection con = RabbitMQUtil.getConnection();
        //创建通道
        final Channel channel = con.createChannel();
        //声明队列:有则直接使用,没有则创建
        //2:是否持久化
        //3:是否私有化
        //4: 是否自动删除
        channel.queueDeclare("simple_queue", true, false, false, null);
        //签收消息
        //参数1:队列名称
        //参数2: 是否自动签收,false:表示手动编程的方式签收
        //参数3:处理签收消息的回调方法
        channel.basicConsume("simple_queue", false, new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
                                       byte[] body) throws IOException {
                System.out.println("消费者处理的消息:" + new String(body));
                //签收
                //参数1:消息的Id
                //参数2: true 表示签收当前队里中所有小于该Id的消息,false表示只签收当前消息
                channel.basicAck(envelope.getDeliveryTag(), false);
            }
        });
//        channel.close();
//        con.close();
    }

9、消息的状态

  • ready: 表示消息待消费
  • unacked: 表示消息被消费者认领了,但是没有确认签收。此时一旦消费者断开连接,消息就回到ready状态
  • finished:表示已经消费完成,消息会被从队列中移除。

10、RabbitMQ的工作模式

总共是6种工作模式:

  • 简单模式
    • 一个生产者、一个消费者
  • work工作模式
    • 一个生产者、多个消费者;每个消费者获取的消息是唯一的。并且在集群架构下可以最大发挥每台服务器的性能。
  • 发布订阅模式:
    • 一个生产者,多个消费者;并且每个消费者获取的数据是一致的;该模式下交换机的类型是fanout扇形交换机。发布订阅模式中,生产者不在和对列打交道,直接将消息发送给交换机,交换机负责将消息转发给对列。
//生产者
public class Ticket {

    public static void main(String[] args) throws IOException, TimeoutException {
        Connection con = RabbitMqUtil.getConnectin();
        Channel channel = con.createChannel();
        //申明交换机,类型为fanout
        channel.exchangeDeclare("pubsub_exchange", BuiltinExchangeType.FANOUT);
        //发布消息
        for (int i = 0; i < 10; i++) {
            channel.basicPublish("pubsub_exchange","",null,("票务消息"+i).getBytes());
        }
        channel.close();
        con.close();
        System.out.println("发送成功");
    }

}
//消费者
public class Xc {

    public static void main(String[] args) throws IOException, TimeoutException {
        Connection con = RabbitMqUtil.getConnectin();
        final Channel channel = con.createChannel();
        //声明队列
        channel.queueDeclare("xc_queue",true,false,false,null);
        //绑定交换机
        channel.queueBind("xc_queue","pubsub_exchange","");
        //消费
        channel.basicConsume("xc_queue",false,new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                super.handleDelivery(consumerTag, envelope, properties, body);

                System.out.println("消息: "+ new String(body));

//                channel.basicAck(envelope.getDeliveryTag(),false);
            }
        });

    }


}
//消费者
public class Qn {

    public static void main(String[] args) throws IOException, TimeoutException {
        Connection con = RabbitMqUtil.getConnectin();
        final Channel channel = con.createChannel();
        //声明队列
        channel.queueDeclare("qn_queue",true,false,false,null);
        //绑定交换机
        channel.queueBind("qn_queue","pubsub_exchange","");
        //消费
        channel.basicConsume("qn_queue",false,new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                super.handleDelivery(consumerTag, envelope, properties, body);

                System.out.println("消息: "+ new String(body));

//                channel.basicAck(envelope.getDeliveryTag(),false);
            }
        });

    }


}

  • 路由模式:
    • 在发布订阅模式基础之上,路由模式提供了条件筛选的功能,将符合路由key条件的数据,转发给对应的队列。direct直接交换机。
public class Ticket {

    public static void main(String[] args) throws IOException, TimeoutException {
        Connection con = RabbitMqUtil.getConnectin();
        Channel channel = con.createChannel();
        //申明交换机,类型为direct
        channel.exchangeDeclare("route_exchange", BuiltinExchangeType.DIRECT);
        Map<String,String> map = new HashMap();
        map.put("schk20201001","成都-上海");
        map.put("schk20201002","成都-北京");
        map.put("xmhk20201001","厦门-上海");
        map.put("xmhk20201002","厦门-北京");
        //发布消息
        for (String key : map.keySet()){
            channel.basicPublish("route_exchange",key,null,map.get(key).getBytes());
        }
        channel.close();
        con.close();
        System.out.println("发送成功");
    }

}

public class Xc {

    public static void main(String[] args) throws IOException, TimeoutException {
        Connection con = RabbitMqUtil.getConnectin();
        Channel channel = con.createChannel();
        //声明duilie
        channel.queueDeclare("xc_queue",true,false,false, null);
        //绑定交换机
        channel.queueBind("xc_queue","route_exchange","schk20201001");
        channel.queueBind("xc_queue","route_exchange","schk20201002");
        //消费
        channel.basicConsume("xc_queue",false,new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                super.handleDelivery(consumerTag, envelope, properties, body);
                System.out.println("票务信息:" + new String(body) );
            }
        });
    }

public class Qn {
    public static void main(String[] args) throws IOException, TimeoutException {
        Connection con = RabbitMqUtil.getConnectin();
        Channel channel = con.createChannel();
        //声明duilie
        channel.queueDeclare("qn_queue",true,false,false, null);
        //绑定交换机
        channel.queueBind("qn_queue","route_exchange","xmhk20201001");
        channel.queueBind("qn_queue","route_exchange","xmhk20201002");
        //消费
        channel.basicConsume("qn_queue",false,new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                super.handleDelivery(consumerTag, envelope, properties, body);
                System.out.println("票务信息:" + new String(body) );
            }
        });
    }
}
  • 主题模式:
    • Rabbitmq提供了相关的表达式来进行模糊匹配;* 表示一个关键字,#多个关键字
public class Ticket {

    public static void main(String[] args) throws IOException, TimeoutException {
        Connection con = RabbitMqUtil.getConnectin();
        Channel channel = con.createChannel();
        channel.exchangeDeclare("topic_exchange", BuiltinExchangeType.TOPIC);
        //开启消息确认机制
        channel.confirmSelect();
        //确认机制
        channel.addConfirmListener(new ConfirmListener() {
            @Override
            public void handleAck(long deliveryTag, boolean multiple) throws IOException {
                System.out.println("接收到的消息id:" + deliveryTag);
            }

            @Override
            public void handleNack(long deliveryTag, boolean multiple) throws IOException {
                System.out.println("拒接的消息id:" + deliveryTag);
            }
        });
        //消息返回监听
        channel.addReturnListener(new ReturnCallback() {
            @Override
            public void handle(Return rm) {
                System.out.println("-----------------------------------------");
                System.out.println("交换机:"+rm.getExchange());
                System.out.println("消息的状态码:" + rm.getReplyCode());
                System.out.println("消息描述:"+rm.getReplyText());
                System.out.println("路由key:"+rm.getRoutingKey());
                System.out.println("----------------------------------------");
            }
        });
        Map<String,String> map = new HashMap();
        map.put("schk.20201001","成都-上海");
        map.put("schk.20201002","成都-北京");
        map.put("xmhk.20201001","厦门-上海");
        map.put("xmhk.20201002","厦门-北京");
        map.put("gjhk.20201001","北京-东京");
        map.put("gjhk.20201002","北京-美国");
        //发布消息
        for (String key : map.keySet()){
            //参数三表示如果没有将对应的消息转发给对应的队列,就强制退回给生产者
            channel.basicPublish("topic_exchange",key,true,null,map.get(key).getBytes());
        }
//        channel.close();
//        con.close();
        System.out.println("发送成功");
    }

}

public class Qn {

    public static void main(String[] args) throws IOException, TimeoutException {
        Connection con = RabbitMqUtil.getConnectin();
        Channel channel = con.createChannel();
        channel.queueDeclare("qn_queue",true,false,false,null);
        channel.queueBind("qn_queue","topic_exchange","xmhk.#");
        channel.basicConsume("qn_queue",false,new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                super.handleDelivery(consumerTag, envelope, properties, body);
                System.out.println("票务信息: "+ new String(body));
            }
        });
    }

}

public class Xc {

    public static void main(String[] args) throws IOException, TimeoutException {
        Connection con = RabbitMqUtil.getConnectin();
        Channel channel = con.createChannel();
        channel.queueDeclare("xc_queue",true,false,false,null);
        channel.queueBind("xc_queue","topic_exchange","schk.#");
        channel.basicConsume("xc_queue",false,new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                super.handleDelivery(consumerTag, envelope, properties, body);
                System.out.println("票务信息: "+ new String(body));
            }
        });
    }


}

11、RabbitMQ的消息确认机制

  • 消息确认涉及两种状态:
    • Confirm代表生产者将消息送达了Broker时产生的状态,后续会出现两种情况:
      • ack代表Broker已经将数据接收
      • nack代表Broker未接收到消息
    • Return代表消息被正常接收,但Broker没有对应的队列进行投递,消息被退回给生产者的状态
  • 上述状态表示生产者与Broker之间的消息投递情况,与消费者是否接收/确认消息无关。
  • 代码实现
channel.confirmSelect();//开启消息的确认机制
        //确认机制
        channel.addConfirmListener(new ConfirmListener() {
            @Override
            public void handleAck(long l, boolean b) throws IOException {
                System.out.println("MQ已经接收到消息,消息ID:"+l);
            }
            @Override
            public void handleNack(long l, boolean b) throws IOException {
                System.out.println("MQ拒收消息,消息ID:"+l);
            }
        });
        //消息返回监听
        channel.addReturnListener(new ReturnCallback() {
            @Override
            public void handle(Return r) {
                System.out.println("-----------------------------------------------------");
                System.out.println("返回的消息状态码:"+r.getReplyCode());
                System.out.println("消息描述:"+r.getReplyText());
                System.out.println("交换机"+r.getExchange());
                System.out.println("路由key"+r.getRoutingKey());
                System.out.println("-----------------------------------------------------");
            }
        });
//参数3:表示如果没有将消息转发给对应的队列,则强制退回给生成者
channel.basicPublish("topic_exchange",key,true,null,res.get(key).getBytes());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RabbitMQ简介、概念、安装、启动、工作模式 的相关文章

  • Java进阶面试题:如何设计一个高并发系统?

    面试原题 如何设计一个高并发系统 xff1f 面试官心理分析 说实话 xff0c 如果面试官问你这个题目 xff0c 那么你必须要使出全身吃奶劲了 为啥 xff1f 因为你没看到现在很多公司招聘的 JD 里都是说啥 xff0c 有高并发就经
  • 微擎按照UID获取用户绑定手机号

    按照UID获取用户信息 users 61 pdo fetch 34 select from 34 tablename 39 users 39 34 where uid 61 W 39 uid 39 34 按照UID获取用户绑定手机号 thi
  • AD-----间距、线宽、阻焊、铺铜规则设置

    1 间距规则 快捷键 D 43 R xff0c 出现如下界面 xff0c 在Clearance 中 即可设置对应的规则 Track 走线 SMD Pad 贴片式焊盘 TH Pad 通孔焊盘 Via xff1a 过孔 Copper xff1a
  • 【Python】程序员情人节搞事情的程序

    程序员情人节搞事情的程序 效果展示源码备注1 这段代码用 python 实现2 用 pyinstaller 打包成exe3 没有 pyinstaller 的话 xff0c 可以直接用 pip 安装 效果展示 源码 import pygame
  • Maven项目在编译及导入Eclipse时出现的错误汇总处理

    Maven项目在编译及导入Eclipse时出现的错误处理汇总 Maven在构建项目时确实是比较强大 xff0c 而且也越来越流行 xff0c 目前不但越来越多的开源项目 xff0c 甚至越来越多的商业项目都在使用Maven 但是不得不说Ma
  • AS导入项目报错:Plugin with id ‘com.android.application‘ not found

    转自 xff1a https www cnblogs com cuichen16 p 10785951 html 从github或第三方Demo中获取的项目导入到AndroidStudio中报错Plugin with id com andr
  • C#向Excel报表中插入图片的2种方法

    这几天做向Excel插入数据 xff0c 其中有插入图片的需求 xff0c 经试验 xff0c 下面2种方法都可以插入图片 xff0c 但各有不同的用处 现将这2种方法共享出来 xff0c 希望需要的朋友进行参考 xff0c 代码中已经有详
  • Response.Redirect 打开新窗口的两种方法

    一般情况下 xff0c Response Redirect 方法是在服务器端进行转向 xff0c 因此 xff0c 除非使用 Response Write 34 lt script gt window location 61 39 http
  • C# 实现向浏览器的兼容性视图列表中添加、删除网站和检查网站是否在兼容性网站列表中

    今天回答论坛上的一个问题 xff0c 搜索了一下网上 xff0c 并没有找到一个完整的例子 xff0c 下面根据网上的一些资料 xff0c 经过转换 完善成一个完整的例子 下面的例子可以实现添加 删除 检测网站是否在兼容性网站列表中的功能
  • Excel中 ColorIndex 属性值和颜色对照表

    Excel中 ColorIndex 属性值和颜色对照表 资料参考 http msdn microsoft com en us library cc296089 aspx http www mvps org dmcritchie excel
  • AJAX(XMLHttpRequest)进行跨域请求方法详解(一)

    注意 xff1a 以下代码请在Firefox 3 5 Chrome 3 0 Safari 4之后的版本中进行测试 IE8的实现方法与其他浏览不同 跨域请求 xff0c 顾名思义 xff0c 就是一个站点中的资源去访问另外一个不同域名站点上的
  • 分享30道Redis面试题,面试官能问到的我都找到了

    1 什么是Redis xff1f 简述它的优缺点 xff1f Redis本质上是一个Key Value类型的内存数据库 xff0c 很像memcached xff0c 整个数据库统统加载在内存当中进行操作 xff0c 定期通过异步操作把数据
  • AJAX(XMLHttpRequest)进行跨域请求方法详解(二)

    注意 xff1a 以下代码请在Firefox 3 5 Chrome 3 0 Safari 4之后的版本中进行测试 IE8的实现方法与其他浏览不同 2 xff0c 预检请求 预检请求首先需要向另外一个域名的资源发送一个 HTTP OPTION
  • 将文本文件的内容或者文字保存成图片

    调用方法 xff1a ConvertTextFileToImage Server MapPath 34 Log txt 34 Server MapPath 34 Log png 34 实现代码 xff1a void ConvertTextF
  • Windows 文件资源管理器中搜索带特殊字符文件名的方法

    今天处理一些文件 xff0c 文件夹这包含有类似 16年普通高等学校招生全国统一考试 英语 的文件名 xff0c 想全部找出来删除掉 xff0c 直接在文件资源管理器里面输入 是搜索不到想要的文件的 xff0c 这些是特殊字符 xff0c
  • 脑成像坐标系: MNI + Talairach

    一 脑成像坐标系 xff1a MNI Talairach MNI 脑 Montreal Neurological Institute 是基于大量的正常被试MRI扫描结果得到的标准脑 xff08 当然是欧罗巴人群的 xff09 Talaira
  • windows10隐藏分区(隐藏efi系统分区)

    我们需要使用diskpart来移除这个误显示的盘符 可能使用的命令 xff1a 1 以管理员身份运行CMD xff1b 2 运行diskpart命令 xff1b 3 list disk 显示所有安装的磁盘 xff1b 4 select di
  • 干支纪年和纪日算法

    怎样从已知年份和日期得到对应的干支纪年和纪日 文 xff0f 葛民勤 摘要 xff1a 从已知年份计算干支纪年很简单 xff1a 年份数减3 xff0c 除以10的余数是天干 xff0c 除以12的余数是地 支 从已知日期计算干支纪日的公式
  • Shell 脚本监控磁盘空间

    df 命令可以展示文件系统的磁盘有效空间信息 如果不指定文件名 xff0c 则当前所有挂载的文件系统有效空间信息 实现步骤 使用 df 查看磁盘信息使用 grep命令 过滤文件系统 xff0c 获取空间使用百分比通过Shell 脚本进行监控
  • R 实现熵权法计算权重

    按照信息论基本原理的解释 xff0c 信息是系统有序程度的一个度量 xff0c 熵是系统无序程度的一个度量 xff1b 根据信息熵的定义 xff0c 对于某项指标 xff0c 可以用熵值来判断某个指标的离散程度 xff0c 其信息熵值越小

随机推荐

  • R实现KMeans聚类算法教程

    本文和你一起学习无监督机器学习算法 kmeans算法 xff0c 并在R中给详细的实现示例和步骤 什么是k means聚类算法 聚类是从数据集中对观测值进行聚类的机器学习方法 它的目标是聚类相似观测值 xff0c 不同类别之间差异较大 聚类
  • 使用gopsutil获取OS信息

    生产环境通常需要掌握主机硬盘 CPU 内存 进程等资源使用情况 xff0c 可以执行系统命令获得 xff0c 通过os exec执行命令 xff0c 如 xff1a ps cd top xff0c 然后解析命令执行结果 对于linux操作系
  • gcc工具小结

    关于 l和 Wall选项的解析 xff1a Wall 打开gcc的所有警告 l参数就是用来指定程序要链接的库 xff0c l参数紧接着就是库名 xff0c 那么库名跟真正的库文件名有什么关系呢 xff1f 就拿数学库来说 xff0c 他的库
  • 如何在Java中调用Python

    Python语言有丰富的系统管理 数据处理 统计类软件包 xff0c 因此从java应用中调用Python代码的需求很常见 实用 DataX 是阿里开源的一个异构数据源离线同步工具 xff0c 致力于实现包括关系型数据库 MySQL Ora
  • ClickHouse 基于角色访问控制(RBAC)最佳实践

    本文介绍ClickHouse RBAC访问控制模型 包括如何启用SQL管理 xff0c 创建管理员用户 xff0c 创建角色 xff0c 授权 xff0c 细粒度列和行级授权 并通过示例进行验证实现过程 启用RBAC 在users xml中
  • R语言中mean函数

    mean函数是求算术平均值 用法 xff1a mean x trim 61 0 na rm 61 FALSE x是数值型 逻辑向量 trim表示截尾平均数 xff0c 0 0 5之间的数值 xff0c 如 xff1a 0 10表示丢弃最大1
  • 使用Spring @DependsOn控制bean加载顺序

    使用Spring 64 DependsOn控制bean加载顺序 spring容器载入bean顺序是不确定的 xff0c spring框架没有约定特定顺序逻辑规范 但spring保证如果A依赖B 如beanA中有 64 Autowired B
  • 使用R中merge()函数合并数据

    使用R中merge 函数合并数据 在R中可以使用merge 函数去合并数据框 xff0c 其强大之处在于在两个不同的数据框中标识共同的列或行 如何使用merge 获取数据集中交叉部分 merge 最简单的形式为获取两个不同数据框中交叉部分
  • 介绍java中Pair

    介绍java中Pair 在这篇文章中 xff0c 我们讨论了一个非常有用的编程概念 xff0c 配对 Pair 配对提供了一种方便方式来处理简单的键值关联 xff0c 当我们想从方法返回两个值时特别有用 在核心Java库中可以使用配对 Pa
  • python numpy 中linspace函数

    python numpy 中linspace函数 numpy提供linspace函数 有时也称为np linspace 是python中创建数值序列工具 与Numpy arange函数类似 xff0c 生成结构与Numpy 数组类似的均匀分
  • Spring框架学习重点概要笔记(一)

    spring框架的注解实现 xff1a xff08 1 xff09 首先在spring的核心配置文件中开启注解配置 xff1a xff08 2 xff09 64 Component 目前Spring中提供了四个注解 xff0c 相当于时Co
  • 做个爱读书的程序员

    很多时候我们抱怨工作过于忙碌 xff0c 疲于应付各种事情 但是往往即使有时间也总是会无所事事地浪费掉 xff0c 我们可以找很多理由去给自己解脱 xff0c 固然是想在忙碌之外给自己放松一下 xff0c 大多却是过于可惜的时候 今天跟一个
  • xming Error: Can‘t open display:

    运行 xclock xhost 报错 xff1a xming Error Can 39 t open display 需要安装xorg x11 xauth在运行 xclock 或 xhost root 64 stone yum y inst
  • onItemClickListener不起作用解决办法2(原创)

    写这边文章之前 xff0c 犹豫再三 xff0c 不知道会不会冒犯一位朋友 xff0c 他给我之前的一篇文章提出的意见 但我声明真心无意 xff0c 只是想把问题拿出来分析一下 xff0c 希望获得理解 listview在android开发
  • 关于STM32系列串口打印乱码原因解析

    STM32打印串口乱码 xff0c 如果你的配置确认没有问题 xff0c 那么最有可能是 HSE VALUE 这个值不对 xff0c 你可能使用的是一份demo程序 xff0c 而demo程序的时钟晶振和你的时钟晶振不一定都是一样 xff0
  • node.js提取html中的内部引入css和js代码,并修改为外部引入

    前提 xff1a 配置好node环境 xff0c 能够使用终端 xff08 cmd或Windows PowerShell xff09 node命令运行js文件 nodejs安装教程 某位大佬整理的nodejs入门教程 node xxx sp
  • Ffplay视频播放流程

    背景说明 FFmpeg是一个开源 xff0c 免费 xff0c 跨平台的视频和音频流方案 xff0c 它提供了一套完整的录制 转换以及流化音视频的解决方案 而ffplay是有ffmpeg官方提供的一个基于ffmpeg的简单播放器 学习ffp
  • 统计机器学习方法 for NLP:基于LSA的主题模型

    前言 最近在重刷李航老师的 统计机器学习方法 尝试将其与NLP结合 xff0c 通过具体的NLP应用场景 xff0c 强化对书中公式的理解 xff0c 最终形成 统计机器学习方法 for NLP 的系列 这篇将介绍潜在语义分析LSA xff
  • 知识图谱最新权威综述论文解读:时序知识图谱部分

    从最近一两年有关知识图谱的顶会论文中可以发现 xff0c 越来越多的国内外研究者开始关注动态时序知识图谱 xff0c 可见时序知识图谱已经成为了一大研究趋势 xff0c 相信之后会有更多相关研究出来 因此 xff0c 这期我们对综述论文的时
  • RabbitMQ简介、概念、安装、启动、工作模式

    RabbitMQ简介 概念 安装 启动 工作模式 1 RabbitMQ简介 RabbitMQ是支持多种消息协议 xff0c 易于部署和使用的开源消息代理服务器 xff0c 用于在分布式系统中存储转发消息 由以高性能 健壮以及可伸缩性出名的E