rabbit消息队列

news2024/9/22 22:32:43

一:消息队列简介

1:主流的消息队列

目前主流的几大消息队列有:RabitMQ、ActiveMQ、RocketMQ、Kafka、ZeroMQ等,也有一些小众的比如Beanstalk,当然我们之前学过的Redis也可以实现消息队列的功能。

(1)ActiveMQ

基于JAVA语言开发,其社区算是比较成熟,但是目前来说,ActiveMQ的性能比较差,而且版本迭代很慢,不推荐使用。

(2)RocketMQ

阿里出品,Java系开源项目,源代码我们可以直接阅读,然后可以定制自己公司的MQ,并且RocketMQ有阿里巴巴的实际业务场景的实战考验。RocketMQ社区活跃度相对较为一般,不过也还可以,文档相对来说简单一些,然后接口这块不是按照标准JMS规范走的有些系统要迁移需要修改大量代码。还有就是阿里出台的技术,你得做好这个技术万一被抛弃,社区黄掉的风险,那如果你们公司有技术实力我觉得用RocketMQ挺好的

(3)Kafka

由Scala和Java编写,其特点其实很明显,就是仅仅提供较少的核心功能,但是提供超高的吞吐量,ms级的延迟,极高的可用性以及可靠性,而且分布式可以任意扩展。同时kafka最好是支撑较少的topic数量即可,保证其超高吞吐量。Kafka唯一的一点劣势是有可能消息重复消费,那么对数据准确性会造成极其轻微的影响,在大数据领域中以及日志采集中,这点轻微影响可以忽略这个特性天然适合大数据实时计算以及日志收集。

(4)RabbitMQ

在吞吐量方面虽然稍逊于Kafka和RocketMQ ,但是由于它基于erlang开发,所以并发能力很强,性能极其好,延时很低,达到微秒级。但是也因为RabbitMQ基于erlang开发,所以国内很少有公司有实力做erlang源码级别的研究和定制。如果业务场景对并发量要求不是太高(十万级、百万级),那这四种消息队列中,RabbitMQ一定是你的首选。如果是大数据领域的实时计算、日志采集等场景,用Kafka是业内标准的,绝对没问题,社区活跃度很高,绝对不会黄,何况几乎是全世界这个领域的事实性规范。

(5)ZeroMQ

只是一个网络编程的Pattern库,将常见的网络请求形式(分组管理,链接管理,发布订阅等)模式化、组件化,简而言之socket之上、MQ之下。对于MQ来说,网络传输只是它的一部分,更多需要处理的是消息存储、路由、Broker服务发现和查找、事务、消费模式(ack、重投等)、集群服务等。

2:各种不同消息队列的对比

  1. RabbitMQ/Kafka/ZeroMQ都能提供消息队列服务,但有很大的区别。
  2. 在面向服务架构中通过消息代理(比如 RabbitMQ / Kafka等),使用生产者/消费者模式在服务间进行异步通信是一种比较好的思想。
  3. ZeroMQ和RabbitMQ/Kafka 不同,它只是一个异步消息库,在套接字的基础上提供了类似于消息代理的机制。使用ZeroMQ的话,需要对自己的业务代码进行改造,不利于服务解耦。
  4. RabbitMQ支持AMQP(二进制),STOMP(文本),MQTT(二进制),HTTP(里面包装其他协议)等协议。而Kafka使用自己的协议。
  5. Kafka自身服务和消费者都需要依赖Zookeeper。
  6. RabbitMQ在有大量消息堆积的情况下性能会下降,Kafka不会,毕竟AMQP设计的初衷不是用来持久化海量消息的,而Kafka一开始是用来处理海量日志的。

总的来说,RabbitMQ和Kafka都是十分优秀的分布式的消息代理服务,只要合理部署,不作,基本上可以满足生产条件下的任何需求。

3:消息队列中角色/名词

(1)Broker:

消息服务器,作为server提供消息核心服务

(2)Producer:

消息生产者,业务的发起方,负责生产消息传输给broker

(3)Consumer:

消息消费者,业务的处理方,负责从broker获取消息并进行业务逻辑处理

(4)Topic:

主题,发布订阅模式下的消息统一汇集地,不同生产者向topic发送消息,由MQ服务器分发到不同的订阅者,实现消息的广播

(5)Queue:

队列,PTP模式下,特定生产者向特定queue发送消息,消费者订阅特定的queue完成指定消息的接收

(6)Message:

消息体,根据不同通信协议定义的固定格式进行编码的数据包,来封装业务数据,实现消息的传输

4:消息队列中两种工作模式

(1)Point-to-Point

    其实就是点对点,其过程理解起来比较简单。它好比是两个人打电话,这两个人是独享这一条通信链路的。一方发送消息,另外一方接收,就这么简单。在点对点模式下,消息被保留在队列中。 一个或多个消费者可以消耗队列中的消息,但是特定消息只能由最多一个消费者消费。 一旦消费者读取队列中的消息,它就从该队列中消失。 该模式的典型示例,如订单处理系统,其中每个订单将由一个订单处理器处理,但多个订单处理器也可以同时工作。

(2)Pub/Sub

    即发布/订阅模式,该模式有点类似于我们日常生活中订阅报纸。对于每一个订阅者来说,可以选择一份或者多份报纸。那么这些我们订阅的报纸,就相当于发布订阅模式里的topic。有很多个人订阅报纸,也有人可能和我订阅了相同的报纸。多人订阅了相同的报纸相当于多人在同一个topic里注册了。对于一份报纸发行方来说,它和所有的订阅者就构成了一个1对多的关系。在这种模式下,消息被保留在主题中。 与点对点模式不同,消费者可以订阅一个或多个主题并使用该主题中的所有消息。 该模式下消息生产者称为发布者,消息使用者称为订阅者。

5:消息队列缺点

由于消息队列的异步特性,直接提升了整个架构的处理效率,提升了用户体验。但凡事都有两面性,消息队列在带来性能提升的同时也伴随着缺陷。

(1)系统可用性降低

    毕竟在整个架构中,我们单独加了一个消息队列中间件,所以增加了风险,如果消息队列服务挂掉,势必会影响到整个架构。

(2)系统复杂性提高

    本来非常简单的一个逻辑设计,但偏偏要在中间插入一个消息队列,所以这增加了程序员的工作量,需要考虑如何保证消息没有被重复消费、消息有没有丢失、消息顺序等细节问题。

(3)数据一致性无法保证

    消息如果没有正确写入到消息队列里,或者说读取消息的服务并没有正确读取到消息,这都会影响到数据的一致性。

二:RabbitMQ介绍

RabbitMQ是一款在全球范围内使用非常广泛的开源消息队列中间件。它轻量级、易部署、并支持多种协议。它基于Erlang开发,天生拥有高并发的能力。

1:RabbitMQ相关术语

(1)生产者

    产生消息的进程或服务

(2)消费者

    接收消息的进程或服务

(3)队列

    RabbitMQ是消息队列中间件,而真正储存消息数据的就是队列,队列可以有很多。

(4)交换器

    类似于网络设备交换机,它可以根据不同的关键字,将消息发送到不同的队列。

 

(5)虚拟主机

    虚拟主机类似于Apache的虚拟主机,如果没有虚拟主机,当RabbitMQ中的数据越来越庞大,队列越来越多,随之而来的是令人头痛的管理问题,比如队列、交换器命名冲突,它们相互影响等等。虚拟主机能够解决这些问题,而不需要我们部署多个RabbitMQ来负责不同的业务。

    虚拟主机提供了资源的逻辑分组和分隔,每一个虚拟主机本质上是mini版的RabbitMQ服务器,他们有用自己的连接、队列、绑定、交换器,更重要的是有用自己的权限机制,这有点类似服务器和运行在服务器上的虚拟机一样。

三:CentOS7下安装RabbitMQ(单机)

1:安装erlang

[root@localhost ~]# cd /etc/yum.repos.d

[root@localhost yum.repos.d]# wget http://mirrors.aliyun.com/repo/Centos-7.repo

[root@localhost yum.repos.d]# wget http://mirrors.163.com/.help/CentOS7-Base-163.repo

[root@localhost ~]#

curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash                                                 ##安装erlang的源

[root@localhost ~]# cat /etc/yum.repos.d/rabbitmq_erlang.repo ##查看erlang的源

[root@localhost ~]# yum install -y erlang                    ##安装erlang

2:安装RabbitMQ

rpm --import https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey

rpm --import https://packagecloud.io/gpg.key

rpm --import https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc

[root@localhost ~]# vim /etc/yum.repos.d/rabbitmq.repo            ##内容如下

[bintray-rabbitmq-server]

name=bintray-rabbitmq-rpm

baseurl=https://dl.bintray.com/rabbitmq/rpm/rabbitmq-server/v3.7.x/el/7/

gpgcheck=0

repo_gpgcheck=0

enabled=1

[root@localhost ~]# yum install -y rabbitmq-server     ## 安装rabbitmq服务

3:启动RabbitMQ

[root@localhost ~]# systemctl start rabbitmq-server       ## 监听端口为4369,25672

[root@localhost ~]# ps aux |grep rabbit               ## 查看rabbit进程

[root@localhost ~]# netstat -lntp                     ## 查看监听端口

4:开启web管理控制台

[root@localhost ~]# rabbitmq-plugins enable rabbitmq_management      ##激活插件

[root@localhost ~]# rabbitmq-plugins list                 ## 查看所有插件

    此时可以通过 http://ip:15672 来访问rabbitmq的web管理控制台,用户名密码都是guest,但是有个限制,只允许127.0.0.1访问,所以还需在本机配置一个nginx代理

5:Nginx代理

[root@localhost ~]# yum install -y epel-release        ##安装可扩展源

[root@localhost ~]# yum install -y nginx              ##安装nginx

vi /etc/nginx/conf.d/rabbitmq.conf                    ##内容如下

server {

    listen 80;

    server_name www.fllrabbit.com;     #域名自定义,如果没有dns解析,只能绑定hosts

   

        location /

        {

            proxy_pass http://127.0.0.1:15672;

            proxy_set_header Host $host;     ##指定主机名,$host就是server_name

            proxy_set_header X-Real-IP $remote_addr;

            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;   

              ##后两行为了在访问日志中显示真正客户端的ip,而不是代理的ip

        }

}

[root@localhost ~]# systemctl start nginx          ##启动或重启nginx服务

现在可以通过宿主机绑定hosts,然后通过浏览器访问rabbit,账号密码都是:guest

四:rabbitmq常用命令

1:虚拟机管理

[root@localhost ~]# rabbitmqctl list_vhosts            ##列出所有的虚拟主机

[root@localhost ~]# rabbitmqctl add_vhost fll      ##创建名字叫fll的虚拟主机

[root@localhost ~]# rabbitmqctl delete_vhost fll       ##删除名字叫fll的虚拟主机

rabbitmqctl add_vhost <虚拟主机名字>        #创建虚拟主机

rabbitmqctl delete_vhost <虚拟主机名字>     #删除虚拟主机

2:用户管理

[root@localhost ~]# rabbitmqctl add_user user1 user1_passwd

                         ##创建user1用户,密码为user1_passwd

[root@localhost ~]# rabbitmqctl list_users         ##列出所有用户

[root@localhost ~]# rabbitmqctl change_password user1 new_passwd

                                   ##更改user1的密码为new_passwd

[root@localhost ~]# rabbitmqctl delete_user user1             #删除user1用户

rabbitmqctl list_users                                   #列出用户

rabbitmqctl add_user <username> <password>            #创建用户

rabbitmqctl change_password <username> <password>      ##更改用户密码

rabbitmqctl delete_user <username>                    #删除用户

rabbitmqctl clear_password <username>                 #清除用户密码

3:tags角色介绍

(1) 超级管理员(administrator):guest

    可登陆管理控制台(启用management plugin的情况下),可查看所有的信息,并且可以对用户,策略(policy)进行操作。

(2) 监控者(monitoring)

    可登陆管理控制台(启用management plugin的情况下),同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)

(3) 策略制定者(policymaker)

    可登陆管理控制台(启用management plugin的情况下), 同时可以对policy进行管理。但无法查看节点的相关信息。

(4) 普通管理者(management)

    仅可登陆管理控制台(启用management plugin的情况下),无法看到节点信息,也无法对策略进行管理。

(5) 其他

    无法登陆管理控制台,通常就是普通的生产者和消费者。

[root@localhost ~]# rabbitmqctl set_user_tags user1 managemnet 

##赋予user1用户management角色

[root@localhost ~]# rabbitmqctl set_user_tags user2 monitoring management

##同时赋予多个角色

[root@localhost ~]# rabbitmqctl set_permissions -p fll user1 '.*' '.*' '.*'

##针对fll虚拟主机给user1用户设置所有的配置、读写queue和exchange的权限。默认是没有任何权限的

rabbitmqctl set_user_tags <username> <rolename> #赋予用户某个角色

rabbitmqctl set_permissions -p <vhostname> <username> <conf> <write> <read>

 #给用户设置权限

说明:用户权限指的是用户对exchange(交换器),queue(队列)的操作权限,包括配置权限,读写权限。配置权限会影响到exchange,queue的声明和删除。读写权限影响到从queue里取消息,向exchange发送消息以及queue和exchange的绑定(bind)操作。例如: 将queue绑定到某exchange上,需要具有queue的可写权限,以及exchange的可读权限;向exchange发送消息需要具有exchange的可写权限;从queue里取数据需要具有queue的可读权限。

[root@localhost ~]# rabbitmqctl list_user_permissions user1       ##列出user1的权限

[root@localhost ~]# rabbitmqctl list_permissions -p fll       ##列出fll下的所有用户权限

[root@localhost ~]# rabbitmqctl clear_permissions -p fll user2

##清除user2在fll上的权限

rabbitmqctl list_user_permissions <username>

#列出某用户的权限,即该用户对哪个虚拟主机有权限

rabbitmqctl list_permissions -p <vhostname>

#列出指定虚拟主机下所有用户的权限,即哪些用户对该虚拟主机有权限

rabbitmqctl clear_permissions -p <vhostname> <user>

#清除某用户在指定虚拟机上的授权

4:插件管理

rabbitmq-plugins list                 ##获取RabbitMQ插件列表

rabbitmq-plugins enable <插件名字>       ##安装RabbitMQ插件

rabbitmq-plugins disable <插件名字>      ##卸载某个插件

5:限制

rabbitmqctl set_vhost_limits -p vhost_name '{"max-connections": 256}'

#设置虚拟主机的最大连接数

rabbitmqctl set_vhost_limits -p vhost_name '{"max-connections": 0}'

#不允许客户端连接虚拟主机

rabbitmqctl set_vhost_limits -p vhost_name '{"max-connections": -1}'

#不限制连接数

rabbitmqctl set_vhost_limits -p vhost_name '{"max-queues": 1024}'

#限制虚拟主机里最大的队列数

rabbitmqctl set_vhost_limits -p vhost_name '{"max-queues": -1}'

#不限制队列数

6:其他

rabbitmqctl list_exchanges             

#列出所有的交换器

rabbitmqctl list_bindings

#列出所有的绑定,即把exchange和queue按照路由规则绑定起来

rabbitmqctl list_queues

 #分别查看当前系统种存在的Exchange和Exchange上绑定的Queue信息。

rabbitmqctl status 

#查看运行信息

五:RabbitMQ集群

RabbitMQ本身是基于Erlang编写的,Erlang天生支持分布式(通过同步Erlang集群各节点的cookie来实现),因此不需要像Kafka那样通过ZooKeeper来实现分布式集群。

1:元数据

    RabbitMQ内部有各种基础构件,包括队列、交换器、绑定、虚拟主机等,他们组成了AMQP协议消息通信的基础,而这些构件以元数据的形式存在

2:内存节点与磁盘节点

    在集群中的每个节点,要么是内存节点,要么是磁盘节点,如果是内存节点,会将所有的元数据信息仅存储到内存中,而磁盘节点则不仅会将所有元数据存储到内存上, 还会将其持久化到磁盘。所以在搭建集群的时候,为了保证数据的安全性和性能,最好是两种节点都要有

3:规划

主机名

Ip

节点类型

centos01

192.168.10.101

磁盘节点

Centos02

192.168.10.102

内存节点

Centos03

192.168.10.103

内存节点

4:部署集群

(1)配置hosts以及hostname

三台机器设置hostname

hostnamectl set-hostname centos01

hostnamectl set-hostname centos02

hostnamectl set-hostname centos03

三台机器上都需要编辑如下hosts

192.168.10.101 centos01

192.168.10.102 centos02

192.168.10.103 centos03

(2)关闭selinux以及firewalld

三台机器都要执行

setenforce 0

systemctl stop firewalld

(3)安装rabbitmq

三台机器都要安装,步骤参考上面

(4)启动服务

三台机器都启动起来

systemctl start rabbitmq-server

(5)安装management插件

三台机器都要开启

rabbitmq-plugins enable rabbitmq_management

(6)编辑cookie文件

vim  /var/lib/rabbitmq/.erlang.cookie  #将三台机器的该文件内容编辑为一致

cat /var/lib/rabbitmq/.erlang.cookie

在centos01上操作(其实任何一个上都可以),

可以先将02,03上的cookie删除,然后再同步

rsync -av /var/lib/rabbitmq/.erlang.cookie cenos02:/var/lib/rabbitmq/.erlang.cookie

rsync -av /var/lib/rabbitmq/.erlang.cookie cenos03:/var/lib/rabbitmq/.erlang.cookie

(7)分配节点

centos01为磁盘节点,centos02和centos03为内存节点

centos02和centos03上都执行:

停止rabbitmq

systemctl start rabbitmq-server

rabbitmqctl stop_app 

将centos02作为内存节点连接到centos01

rabbitmqctl join_cluster --ram rabbit@centos01

开启rabbitmq

rabbitmqctl start_app

查看集群状态

rabbitmqctl cluster_status

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2041993.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android全面解析之Context机制(一) :初识Android context

什么是Context 回想一下最初学习Android开发的时候&#xff0c;第一用到context是什么时候&#xff1f;如果你跟我一样是通过郭霖的《第一行代码》来入门android&#xff0c;那么一般是Toast。Toast的常规用法是&#xff1a; Toast.makeText(this, "我是toast", To…

详解【网路编程】之Socket套接字编程

谢谢帅气美丽且优秀的你看完我的文章还要点赞、收藏加关注 没错&#xff0c;说的就是你&#xff0c;不用再怀疑&#xff01;&#xff01;&#xff01; 希望我的文章内容能对你有帮助&#xff0c;一起努力吧&#xff01;&#xff01;&#xff01; 1、Socket套接字 Socket 是一个…

4G 和 5G 中的单域注册(VoLTE和VoNR适用)VoNR 中的 CSRetry

目录 1. 4G 和 5G 中的单域注册&#xff08;VoLTE和VoNR适用&#xff09; 1.1 主要内容 1.2 什么是 4/5G 网络中的单域注册 1.3 为什么需要单域注册 1.4 单域注册主要参数之&#xff1a;Dual-Registration-5G-Indicator 1.5 单域注册主要参数之&#xff1a;DualRegistrat…

基于微信小程序地图实现点位标注、覆盖物、地图聊天

目录 小程序部分map标签的使用获取用户经纬度并转换地址地图点击事件覆盖物标注点击并实现弹窗交互数据库及接口部分数据库表结构设计API搭建小程序接口使用注意事项wx.getLocation深入控制地图小程序部分 map标签的使用 创建小程序的步骤这里不再重复赘述,在wxml页面中放一个…

EtherCAT运动控制器PT/PVT实现用户自定义轨迹规划

ZMC408CE硬件介绍 ZMC408CE是正运动推出的一款多轴高性能EtherCAT总线运动控制器&#xff0c;具有EtherCAT、EtherNET、RS232、CAN和U盘等通讯接口&#xff0c;ZMC系列运动控制器可应用于各种需要脱机或联机运行的场合。 ZMC408CE支持8轴运动控制&#xff0c;最多可扩展至32轴…

美团到店面经

redis中大key引起的问题 1、阻塞请求 Big Key对应的value较大&#xff0c;我们对其进行读写的时候&#xff0c;需要耗费较长的时间&#xff0c;这样就可能阻塞后续的请求处理。Redis的核心线程是单线程&#xff0c;单线程中请求任务的处理是串行的&#xff0c;前面的任务完不成…

【RabbitMQ】 相关概念 + 工作模式

本文将介绍一些MQ中常见的概念&#xff0c;同时也会简单实现一下RabbitMQ的工作流程。 MQ概念 Message Queue消息队列。是用来存储消息的队列&#xff0c;多用于分布式系统之间的通信。 系统间调用通常有&#xff1a;同步通信和异步通信。MQ就是在异步通信的时候使用的。 同…

Go 1.19.4 错误处理-Day 11

1. 错误处理机制 1.1 先看一段代码&#xff0c;引出Golang错误处理机制 看到了上面的代码后&#xff0c;思考两个问题&#xff1f; &#xff08;1&#xff09;有没有办法&#xff0c;能让test()执行出错了&#xff0c;它下面的fmt代码依然能够运行。 &#xff08;2&#xff09…

service 管理 web 管理插件

clusterIP 资源清单文件 [rootmaster ~]# kubectl create service clusterip websvc --tcp80:80 --dry-runclient -o yaml 解析域名 创建后端应用 负载均衡 固定 IP 服务 端口别名 nodePort 对外发布服务 Ingress 对外发布服务 查询 ingress 控制器类名称 kubectl g…

一个功能强大、易于使用的开源WEB表单构建工具Formbricks

大家好&#xff0c;今天给大家分享的是一个功能强大、易于使用的表单构建工具Formbricks&#xff0c;能够帮助开发者和非开发者快速构建各种类型的表单。 项目介绍 Formbricks 是一个开源的、基于 Web 的表单构建器&#xff0c;旨在帮助开发者和非开发人员轻松创建复杂的表单&…

大数据技术——Hadoop运行环境搭建

目录 一、 Hadoop运行环境搭建 1.1 模板虚拟机环境准备 1.2 克隆虚拟机 一、 Hadoop运行环境搭建 1.1 模板虚拟机环境准备 0&#xff09;安装模板虚拟机&#xff0c;IP地址192.168.10.100、主机名称hadoop100、内存4G、硬盘50G 具体操作参照下列文档 大数据技术之模板虚…

8.15日学习打卡---Spring Cloud Alibaba(三)

8.15日学习打卡 目录&#xff1a; 8.15日学习打卡为什么需要服务网关Higress是什么安装DockerCompose部署Higress创建网关微服务模块Higress路由配置Higress策略配置-跨域配置Higress解决如何允许跨域Higress策略配置之什么是HTTP认证Higress策略配置-Basic 认证什么是JWT认证J…

腾讯云AI代码助手 —— 编程新体验,智能编码新纪元

阅读导航 引言一、开发环境介绍1. 支持的编程语言2. 支持的集成开发环境&#xff08;IDE&#xff09; 二、腾讯云AI代码助手使用实例1. 开发环境配置2. 代码补全功能使用&#x1f4bb;自动生成单句代码&#x1f4bb;自动生成整个代码块 3. 技术对话3. 规范/修复错误代码4. 智能…

C++ | stack/queue

前言 本篇博客讲解cSTL中的stack/queue &#x1f493; 个人主页&#xff1a;普通young man-CSDN博客 ⏩ 文章专栏&#xff1a;C_普通young man的博客-CSDN博客 ⏩ 本人giee: 普通小青年 (pu-tong-young-man) - Gitee.com 若有问题 评论区见&#x1f4dd; &#x1f389;欢迎大…

LMDeploy 量化部署实践闯关任务-50%的A100跑的过程

基础任务&#xff08;完成此任务即完成闯关&#xff09; 使用结合W4A16量化与kv cache量化的internlm2_5-7b-chat模型封装本地API并与大模型进行一次对话&#xff0c;作业截图需包括显存占用情况与大模型回复&#xff0c;参考4.1 API开发(优秀学员必做)使用Function call功能让…

docker compose部署rabbitmq集群,并使用haproxy负载均衡

一、创建rabbitmq的data目录 mkdir data mkdir data/rabbit1 mkdir data/rabbit2 mkdir data/rabbit3 二、创建.erlang.cookie文件&#xff08;集群cookie用&#xff09; echo "secretcookie" > .erlang.cookie 三、创建haproxy.cfg配置文件 global log stdout fo…

力扣 | 动态规划 | 动态规划在树的应用

文章目录 一、96. 不同的二叉搜索树二、95. 不同的二叉搜索树 II三、337. 打家劫舍 III 一、96. 不同的二叉搜索树 LeetCode&#xff1a;96. 不同的二叉搜索树 只求个数实际上比较简单&#xff0c;定义dp[i]表示结点个数为i的二叉搜索树的种树。&#xff08;其实和记忆化搜索…

SpringBoot 自定义 starter

1. 官方文档 SpringBoot 版本 2.6.13&#xff0c;相关链接 Developing with Spring Boot 1.1 什么是 Starter Starters are a set of convenient dependency descriptors that you can include in your application. You get a one-stop shop for all the Spring and relate…

【Redis】数据结构篇

文章目录 键值对数据库是怎么实现的&#xff1f;动态字符串SDSC 语言字符串的缺陷SDS结构设计 整数集合整数集合结构设计整数集合的升级操作 哈希表哈希表结构设计哈希冲突链式哈希Rehash渐进式rehashrehash触发条件 压缩列表压缩列表结构设计连续更新压缩列表的缺陷 quicklist…

深入InnoDB核心:揭秘B+树在数据库索引中的高效应用

目录 一、索引页与数据行的紧密关联 &#xff08;一&#xff09;数据页的双向链表结构 &#xff08;二&#xff09;记录行的单向链表结构 二、未创建索引情况 &#xff08;一&#xff09;无索引下的单页查找过程 以主键为搜索条件 以非主键列为搜索条件 &#xff08;二…