Redis主从复制、哨兵以及Cluster集群

目录

1.Redis高可用

2.Redis主从复制

2.1 主从复制的作用

2.2 主从复制流程

2.3 搭建Redis 主从复制

​3.Redis哨兵模式

3.1 哨兵模式概述

3.2 哨兵模式的作用

3.3 故障转移机制

​3.4 主节点的选举

 3.5 搭建Redis哨兵模式

4. Redis 群集模式

4.1 Redis集群的数据分片

4.2 Redis集群的主从复制模型

4.3 搭建Redis群集模式

4.3.1 开启群集功能

4.3.2 启动集群

4.3.3 测试群集


1.Redis高可用


在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常服务(99.9%、99.99%、99.999%等等)。
但是在Redis语境中,高可用的含义似乎要宽泛一些,除了保证提供正常服务(如主从分离、快速容灾技术),还需要考虑数据容量的扩展、数据安全不会丢失等。
在Redis中,实现高可用的技术主要包括持久化、主从复制、哨兵和Cluster集群,下面分别说明它们的作用,以及解决了什么样的问题。

持久化:持久化是最简单的高可用方法(有时甚至不被归为高可用的手段),主要作用是数据备份,即将数据存储在硬盘,保证数据不会因进程退出而丢失。
主从复制:主从复制是高可用Redis的基础,哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复。缺陷:故障恢复无法自动化;写操作无法负载均衡;存储能力受到单机的限制。
哨兵:在主从复制的基础上,哨兵实现了自动化的故障恢复。缺陷:写操作无法负载均衡;存储能力受到单机的限制。
Cluster集群:通过集群,Redis解决了写操作无法负载均衡,以及存储能力受到单机限制的问题,实现了较为完善的高可用方案

2.Redis主从复制


主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(Master),后者称为从节点(Slave);数据的复制是单向的,只能由主节点到从节点

默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。


2.1 主从复制的作用


数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
●故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
●高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。


2.2 主从复制流程


1)首次同步:当从节点要进行主从复制时,它会发送一个SYNC命令给主节点。主节点收到SYNC命令后,会执行BGSAVE命令来生成RDB快照文件,并在生成期间使用缓冲区记录所有写操作。
2)快照传输:当主节点完成BGSAVE命令并且快照文件准备好后,将快照文件传输给从节点。主节点将快照文件发送给从节点,并且在发送过程中,主节点会继续将新的写操作缓冲到内存中。
3)追赶复制:当从节点收到快照文件后,会加载快照文件并应用到自己的数据集中。一旦快照文件被加载,从节点会向主节点发送一个PSYNC命令,以便获取缓冲区中未发送的写操作。
4)增量复制:主节点收到PSYNC命令后,会将缓冲区中未发送的写操作发送给从节点,从节点会执行这些写操作,保证与主节点的数据一致性。此时,从节点已经追赶上了主节点的状态。
5)同步:从节点会继续监听主节点的命令,并及时执行主节点的写操作,以保持与主节点的数据同步。主节点会定期将自己的操作发送给从节点,以便从节点保持最新的数据状态.

注意:当slave首次同步或者宕机后恢复时,会全盘加载,以追赶上大部队,即全量复制

2.3 搭建Redis 主从复制

Master节点:192.168.80.10  centos7-4
Slave1节点:192.168.80.11  centos7-5
Slave2节点:192.168.80.12  centos7-6

---------------------- 搭建Redis 主从复制 ----------------------------------------
Master节点:192.168.80.15  centos7-4
Slave1节点:192.168.80.50  centos7-5
Slave2节点:192.168.80.60  centos7-6


2.3.1 安装部署Redis

//环境准备
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config

(1) 修改内核参数

vim /etc/sysctl.conf
vm.overcommit_memory = 1
net.core.somaxconn = 2048sysctl -p


(2)安装redis

yum install -y gcc gcc-c++ maketar zxvf /opt/redis-7.0.13.tar.gz -C /opt/
cd /opt/redis-7.0.13
make -j 2
make PREFIX=/usr/local/redis install
#由于Redis源码包中直接提供了 Makefile 文件,所以在解压完软件包后,不用先执行 ./configure 进行配置,可直接执行 make 与 make install 命令进行安装。

 (3)创建redis工作目录

mkdir /usr/local/redis/{conf,logs,data}cp /opt/redis-7.0.13/redis.conf /usr/local/redis/conf/useradd -M -s /sbin/nologin redis  #创建nologin用户
chown -R redis.redis /usr/local/redis/ 

 (4)环境变量

vim /etc/profile 
PATH=$PATH:/usr/local/redis/bin		#增加一行source /etc/profile


 (4)定义systemd服务管理脚本

vim /usr/lib/systemd/system/redis-server.service
[Unit]
Description=Redis Server
After=network.target[Service]
User=redis
Group=redis
Type=forking
TimeoutSec=0
PIDFile=/usr/local/redis/logs/redis_6379.pid
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true[Install]
WantedBy=multi-user.target


(4)修改 Redis 配置文件(Master节点操作)

vim /usr/local/redis/conf/redis.conf
bind 0.0.0.0                                    #87行,修改监听地址为0.0.0.0
protected-mode no                                #111行,将本机访问保护模式设置no
port 6379                                        #138行,Redis默认的监听6379端口
daemonize yes                                    #309行,设置为守护进程,后台启动
pidfile /usr/local/redis/logs/redis_6379.pid        #341行,指定 PID 文件
logfile "/usr/local/redis/logs/redis_6379.log"    #354行,指定日志文件
dir /usr/local/redis/data                        #504行,指定持久化文件所在目录
#requirepass abc123                                #1037行,可选,设置redis密码
appendonly yes                                    #1380行,开启AOF
systemctl restart redis-server.service



(5)修改 Redis 配置文件(Slave节点操作)

vim /usr/local/redis/conf/redis.conf
bind 0.0.0.0                                    #87行,修改监听地址为0.0.0.0
protected-mode no                                #111行,将本机访问保护模式设置no
port 6379                                        #138行,Redis默认的监听6379端口
daemonize yes                                    #309行,设置为守护进程,后台启动
pidfile /usr/local/redis/logs/redis_6379.pid        #341行,指定 PID 文件
logfile "/usr/local/redis/logs/redis_6379.log"    #354行,指定日志文件
dir /usr/local/redis/data                        #504行,指定持久化文件所在目录
#requirepass abc123                                #1037行,可选,设置redis密码
appendonly yes                                    #1380行,开启AOF
replicaof 192.168.80.10 6379                    #528行,指定要同步的Master节点IP和端口
#masterauth abc123                                #535行,可选,指定Master节点的密码,仅在Master节点设置了requirepasssystemctl restart redis-server.service


(6)验证主从效果

###在Master节点上添加数据内容
redis-cli -h 192.168.80.15 -p 6379 
keys *
set name kx
get name###在slave节点上查看主节点添加的数据内容
redis-cli -h 192.168.80.50 -p 6379 
keys *
get name

 

redis-cli -h 192.168.80.15 -p 6379info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.80.50,port=6379,state=online,offset=420,lag=0
slave1:ip=192.168.80.60,port=6379,state=online,offset=420,lag=1

在Master节点上验证从节点:

-----验证主从效果-----

在Master节点上看日志:
tail -f /usr/local/redis/logs/redis_6379.log


 3.Redis哨兵模式

3.1 哨兵模式概述

主从切换技术的方法是:当服务器宕机后,需要手动一台从机切换为主机,这需要人工干预,不仅费时费力而且还会造成一段时间内服务不可用。为了解决主从复制的缺点,就有了哨兵机制。

哨兵的核心功能:在主从复制的基础上,哨兵引入了主节点的自动故障转移。


3.2 哨兵模式的作用

监控:哨兵会不断地检查主节点和从节点是否运作正常

自动故障转移当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将失效主节点的其中一个从节点升级为新的主节点,并让其它从节点改为复制新的主节点。

通知(提醒):哨兵可以将故障转移的结果发送给客户端。


哨兵结构由两部分组成,哨兵节点和数据节点:
哨兵节点:哨兵系统由一个或多个哨兵节点组成,哨兵节点是特殊的redis节点,不存储数据。
数据节点:主节点和从节点都是数据节点。


3.3 故障转移机制


1.由哨兵节点定期监控发现主节点是否出现了故障
每个哨兵节点每隔1秒会向主节点、从节点及其它哨兵节点发送一次ping命令做一次心跳检测。如果主节点在一定时间范围内不回复或者是回复一个错误消息,那么这个哨兵就会认为这个主节点主观下线了(单方面的)。当超过半数哨兵节点认为该主节点主观下线了,这样就客观下线了。

2.当主节点出现故障,此时哨兵节点会通过Raft算法(选举算法)实现选举机制共同选举出一个哨兵节点为leader,来负责处理主节点的故障转移和通知。所以整个运行哨兵的集群的数量不得少于3个节点。

3.由leader哨兵节点执行故障转移,过程如下:
将某一个从节点升级为新的主节点,让其它从节点指向新的主节点
若原主节点恢复也变成从节点,并指向新的主节点;
●通知客户端主节点已经更换。

需要特别注意的是,客观下线是主节点才有的概念;如果从节点和哨兵节点发生故障,被哨兵主观下线后,不会再有后续的客观下线和故障转移操作。


3.4 主节点的选举


1.过滤掉不健康的(已下线的),没有回复哨兵 ping 响应的从节点。
2.选择配置文件中从节点优先级配置最高的。(replica-priority,默认值为100)
3.选择复制偏移量最大,也就是复制最完整的从节点。


哨兵的启动依赖于主从模式,所以须把主从模式安装好的情况下再去做哨兵模式

 3.5 搭建Redis哨兵模式

注意: 哨兵节点既可以单独部署,也可以和数据节点部署在一台服务器上,视服务器的数量而定。
在主从复制基础上进行下面的哨兵模式实验:
(1)设置Redis哨兵模式配置文件的属组以及属主(所有节点操作)

cp /opt/redis-7.0.13/sentinel.conf /usr/local/redis/conf/
chown redis.redis /usr/local/redis/conf/sentinel.conf 

(2)修改Redis哨兵模式的配置文件(所有节点操作)

vim /usr/local/redis/conf/sentinel.conf
protected-mode no                                    #6行,关闭保护模式
port 26379                                            #10行,Redis哨兵默认的监听端口
daemonize yes                                        #15行,指定sentinel为后台启动
pidfile /usr/local/redis/logs/redis-sentinel.pid        #20行,指定 PID 文件
logfile "/usr/local/redis/logs/sentinel.log"            #25行,指定日志存放路径
dir /usr/local/redis/data                            #54行,指定数据库存放路径
sentinel monitor mymaster 192.168.80.15 6379 2        #73行,修改 指定该哨兵节点监控192.168.80.10:6379这个主节点,该主节点的名称是mymaster,最后的2的含义与主节点的故障判定有关:至少需要2个哨兵节点同意,才能判定主节点故障并进行故障转移
#sentinel auth-pass mymaster abc123                    #76行,可选,指定Master节点的密码,仅在Master节点设置了requirepass
sentinel down-after-milliseconds mymaster 3000        #114行,判定服务器down掉的时间周期,默认30000毫秒(30秒)
sentinel failover-timeout mymaster 180000            #214行,同一个sentinel对同一个master两次failover之间的间隔时间(180秒)###将修改好的redis的配置文件复制到另外两个从服务器
scp -r /usr/local/redis/conf/sentinel.conf 192.168.80.50:`pwd`
scp -r /usr/local/redis/conf/sentinel.conf 192.168.80.60:`pwd`

(3)启动哨兵模式

先启master,再启slave
cd /usr/local/redis/conf/
redis-sentinel sentinel.conf &


(4)查看哨兵信息

###在主从节点上执行以下命令redis-cli -p 26379 info Sentinel

(5)关闭主节点进程,模拟故障切换

#查看redis-server进程号:
ps -ef | grep redis#杀死Master节点上redis-server的进程号
kill -9 12394			#Master节点上redis-server的进程号

(6)验证故障切换结果

tail -f /usr/local/redis/logs/sentinel.log
redis-cli -p 26379 info Sentinel###在新选举的主上执行以下命令
redis-cli -h 192.168.80.70 -p 6379 -a '123'
info replication

 

4. Redis 群集模式


集群,即Redis Cluster,是Redis 3.0开始引入的分布式存储方案。

集群由多组节点(Node)组成,Redis的数据分布在这些节点组中。节点组中的节点分为主节点和从节点:只有主节点负责读写请求和集群信息的维护;从节点只进行主节点数据和状态信息的复制。


集群的作用,可以归纳为两点:
(1)高可用:集群支持主从复制和主节点的自动故障转移(与哨兵类似);当任一节点发生故障时,集群仍然可以对外提供服务。

(2)数据分区数据分区(或称数据分片)是集群最核心的功能。
集群将数据分散到多组节点,一方面突破了Redis单机内存大小的限制,存储容量大大增加;另一方面每个主节点都可以对外提供读服务和写服务,大大提高了集群的响应能力。
Redis单机内存大小受限问题,在介绍持久化和主从复制时都有提及;例如,如果单机内存太大,bgsave和bgrewriteaof的fork操作可能导致主进程阻塞,主从环境下主机切换时可能导致从节点长时间无法提供服务,全量复制阶段主节点的复制缓冲区可能溢出。


4.1 Redis集群的数据分片

 


Redis集群引入了哈希槽的概念
Redis集群有16384个哈希槽(编号0-16383)
集群的每组节点负责一部分哈希槽
每个Key通过CRC16校验后对16384取余来决定放置哪个哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作

#以3个节点组成的集群为例:
节点A包含0到5460号哈希槽
节点B包含5461到10922号哈希槽
节点C包含10923到16383号哈希槽

4.2 Redis集群的主从复制模型


集群中具有A、B、C三个节点,如果节点B失败了,整个集群就会因缺少5461-10922这个范围的槽而不可以用。
为每个节点添加一个从节点A1、B1、C1整个集群便有三个Master节点和三个slave节点组成,在节点B失败后,集群选举B1位为的主节点继续服务。当B和B1都失败后,集群将不可用。

4.3 搭建Redis群集模式

redis的集群一般需要6个节点,3主3从。方便起见,这里所有节点在同一台服务器上模拟;
以端口号进行区分:3个主节点端口号:6001/6002/6003,对应的从节点端口号:6004/6005/6006。

 

cd /usr/local/redis/
mkdir -p redis-cluster/redis{6001..6006}for i in {6001..6006}
do
cp redis.conf src/redis-server src/redis-cli /usr/local/redis/redis-cluster/redis$i
donecd /usr/local/redis/redis-cluster
ls -R

 

 

4.3.1 开启群集功能

其他5个文件夹的配置文件以此类推修改,注意6个端口都要不一样。

cd /usr/local/redis/redis-cluster/redis6001
vim redis.conf
bind 0.0.0.0									#87行,取消注释bind项,默认监听所有网卡
protected-mode no								#111行,关闭保护模式
port 6001										#138行,修改redis监听端口,另外几个节点需要将port参数,修改为各自的端口号
daemonize yes									#309行,设置为守护进程,后台启动
pidfile /usr/local/redis/logs/redis_6001.pid		#341行,指定PID文件
logfile "/usr/local/redis/logs/redis_6001.log"	#354行,指定日志文件
dir ./											#504行,指定持久化文件所在目录
appendonly yes									#1379行,开启AOF
cluster-enabled yes								#1576行,取消注释,开启群集功能
cluster-config-file nodes-6001.conf				#1584行,取消注释,群集名称文件设置
cluster-node-timeout 15000						#1590行,取消注释群集超时时间设置

 

 

​​​​​​​ 

启动redis节点

分别进入那六个文件夹,执行命令:redis-server redis.conf ,来启动redis节点

cd /usr/local/redis/redis-cluster/redis6001
for i in {6002..6006}
do
\cp -f redis.conf /usr/local/redis/redis-cluster/redis$i
done
cd /usr/local/redis/redis-cluster/redis6002
vim redis.conf 
port 6002										#138行,修改redis监听端口,另外几个节点需要将port参数,修改为各自的端口号
pidfile /usr/local/redis/log/redis_6002.pid		#341行,指定PID文件
logfile "/usr/local/redis/log/redis_6002.log"	#354行,指定日志文件###其他几个节点的配置文件,也可以使用如下简单的替换操作
cd /usr/local/redis/redis-cluster/redis6003
sed -i 's/6001/6003/' redis.conf
sed -n '/6003/p' redis.confcd /usr/local/redis/redis-cluster/redis6004
sed -i 's/6001/6004/' redis.conf
sed -n '/6004/p' redis.confcd /usr/local/redis/redis-cluster/redis6005
sed -i 's/6001/6005/' redis.conf
sed -n '/6005/p' redis.confcd /usr/local/redis/redis-cluster/redis6006
sed -i 's/6001/6006/' redis.conf
sed -n '/6006/p' redis.conf###或者使用脚本也能实现同样的功能
for i in {6002..6006}
do
sed -i "s/6001/$i/" /usr/local/redis/redis-cluster/redis$i/redis.conf
done

使用脚本启动各个节点的redis-server服务;

cd /usr/local/redis/redis-cluster/redis6004
for i in {6001..6006}
do
cd /usr/local/redis/redis-cluster/redis$i
./redis-server ./redis.conf
doneps -ef | grep redis

 

4.3.2 启动集群

redis-cli --cluster create 127.0.0.1:6001 127.0.0.1:6002 127.0.0.1:6003 127.0.0.1:6004 127.0.0.1:6005 127.0.0.1:6006 --cluster-replicas 1

 #六个实例分为三组,每组一主一从,前面的做主节点,后面的做从节点。下面交互的时候 需要输入 yes 才可以创建。
–replicas 1 表示每个主节点有1个从节点。

 

4.3.3 测试群集

redis-cli -h 127.0.0.1 -p 6001 -c					#加-c参数,节点之间就可以互相跳转
127.0.0.1:6002> cluster slots			#查看节点的哈希槽编号范围127.0.0.1:6002> cluster nodes   #查看当前集群的所有节点状态  

 

 

127.0.0.1:6002> set name kx127.0.0.1:6002> cluster keyslot name                    #查看name键的槽编号redis-cli -p 6005 -c  #登录主库6002的从库6005
127.0.0.1:6005> keys *                            #对应的slave节点也有这条数据,但是别的节点没有
redis-cli -p 6001 -c    #登录其他从库节点

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VS2022+Qt+OpenCV Debug模式下,循环中格式转换引起的内存异常问题 debug_heap.cpp

文章目录 前言一、问题二、报错1.提示图片2.提示堆栈3.反汇编位置 三、解决办法总结 前言 最近在使用VS2022,C,OpenCV,Qt开发时,遇到了一个疑难杂症-在循环中执行字符串格式转换会触发内存异常,经过痛苦的排查过程&am…

python自动化运维--DNS处理模块dnspython

1.dnspython介绍 dnspython是Pyhton实现的一个DNS工具包,他几乎支持所有的记录类型,可以用于查询、传输并动态更新ZONE信息,同事支持TSIG(事物签名)验证消息和EDNS0(扩展DNS)。在系统管理方面&a…

从零开始实现大语言模型(二):文本数据处理

1. 前言 神经网络不能直接处理自然语言文本,文本数据处理的核心是做tokenization,将自然语言文本分割成一系列tokens。 本文介绍tokenization的基本原理,OpenAI的GPT系列大语言模型使用的tokenization方法——字节对编码(BPE, byte pair en…

认识一下HttpMessageHandler处理管道

[S1208]HttpClient的默认管道结构 接下来我们通过如下的演示程序使用IHttpClientFactory工厂创建了 一个HttpClient对象,并查看其管道依次由哪些类型的HttpMessageHandler对象组成。如代码片段所示,我们定义了一个辅助方法PrintPipeline方法以递归的形式…

C++ ariac2 Windows库编译

cd "F:\\aria2" gmp-6.1.2.tar.lz expat-2.2.0.tar.bz2 sqlite-autoconf-3160200.tar.gz zlib-1.2.11.tar.gz c-ares-1.12.0.tar.gz libssh2-1.8.0.tar.gz --enable-libaria2 --enable-static libgnutls-dev(对于HTTPS,BitTorrent&#xff0…

vue+js实现鼠标右键页面时在鼠标位置出现弹窗

首先是弹窗元素 <div class"tanchuang move-win1"id"tanchuang1"><el-button>111</el-button></div>然后在需要弹窗的地方监听点击事件&#xff0c;可以将这个方法写在页面载入事件中 // 获取弹窗元素 var tanchuang document.…

【开发篇】明明配置跨域声明,为什么却仍可以发送HTTP请求

一、问题 在SpringBoot项目中&#xff0c;明确指定仅允许指定网站跨域访问&#xff1a; 为什么开发人员却仍旧可以通过HTTP工具调用接口&#xff1f; 二、为什么 在回答这个问题之前&#xff0c;我们首先要了解一下什么是CORS&#xff01; 1、什么是CORS CORS的全称为跨域资源…

springcloud-config服务器,同样的配置在linux环境下不生效

原本在windows下能争取的获取远程配置但是部署到linux上死活都没有内容&#xff0c;然后开始了远程调试&#xff0c;这里顺带讲解下获取配置文件如果使用的是Git源&#xff0c;config service是如何响应接口并返回配置信息的。先说问题&#xff0c;我的服务名原本是abc-abc-abc…

文生图功能介绍

Stable Diffusion WebUI&#xff08;SD WebUI&#xff09;及文生图功能介绍 一、引言 随着人工智能技术的飞速发展&#xff0c;AI绘画作为一种新兴的艺术形式&#xff0c;逐渐走入人们的视野。Stable Diffusion WebUI&#xff08;简称SD WebUI&#xff09;作为AI绘画领域的重…

Rust: polars行遍历,从dataframe到struct及Bar设计比较

pandas提供了iterrows()、itertuples()、apply等行遍历的方式&#xff0c;还是比较方便的。 polars的列操作功能非常强大&#xff0c;这个在其官网上有详细的介绍。由于polars底层的arrow是列存储模式&#xff0c;行操作效率低下&#xff0c;官方也不推荐以行方式进行数据操作。…

通过shell脚本创建MySQl数据库

通过shell脚本创建数据库 #!/bin/bashserverIP10.1.1.196 SERVER_NAMEecho $serverIP | cut -d . -f4cat<<EOF>db.sql drop database if exists ${SERVER_NAME}_scheduler; drop database if exists ${SERVER_NAME}_kms; drop database if exists ${SERVER_NAME}_uim…

修改CentOS7 yum源

修改CentOS默认yum源为阿里镜像源 备份系统自带yum源配置文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 下载ailiyun的yum源配置文件 CentOS7 yum源如下&#xff1a; wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun…

【0299】Postgres内核之哈希表(Hash Tables)

0. 哈希表(Hash Tables) 哈希表是 一种用于存储键值对的数据结构。与使用索引号访问元素的基本数组不同,哈希表使用键来查找表条目。这使得数据管理对于用户来说更易于管理,因为按属性对数据条目进行分类比按它们在一个巨大的列表中的数量更容易。 在 C++ 中,我们将哈希…

单向链表结构

链表结构简介 链表结构是一种用比较特殊的数据结构类型&#xff0c;它也是线性数据结构中的一种&#xff0c;但是与栈结构等线性数据结构不同&#xff0c;它的内部结构并不是一个简单的存储空间&#xff0c;而是一个带有指向性质的单元。要理解链表结构要弄清楚两个问题&#x…

鸿蒙:路由Router原理

页面路由&#xff1a;在应用程序中实现不同页面之间的跳转和数据传递 典型应用&#xff1a;商品信息返回、订单等多页面跳转 页面栈最大容量为32个页面&#xff0c;当页面需要销毁可以使用router.clear()方法清空页面栈 router有两种页面跳转模式&#xff1a; router.pushUrl…

入门Axure:快速掌握原型设计技能

2002 年&#xff0c;维克托和马丁在旧金山湾区的一家初创公司工作&#xff0c;发现自己一再被软件开发生命周期的限制所困扰&#xff0c;而且产品团队在编写规范之前很难评估他们的解决方案&#xff0c;开发人员经常不理解&#xff08;或不阅读&#xff09;给出的规范&#xff…

线程池666666

1. 作用 线程池内部维护了多个工作线程&#xff0c;每个工作线程都会去任务队列中拿取任务并执行&#xff0c;当执行完一个任务后不是马上销毁&#xff0c;而是继续保留执行其它任务。显然&#xff0c;线程池提高了多线程的复用率&#xff0c;减少了创建和销毁线程的时间。 2…

如何指定Microsoft Print To PDF的输出路径

在上一篇文章中&#xff0c;介绍了三种将文件转换为PDF的方式。默认情况下&#xff0c;在Microsoft Print To PDF的首选项里&#xff0c;是看不到输出路径的设置的。 需要一点小小的手段。 运行输入 control 打开控制面板&#xff0c;选择硬件和声音下的查看设备和打印机 找到…

ardupilot开发 --- 坐标变换 篇

Good Morning, and in case I dont see you, good afternoon, good evening, and good night! 0. 一些概念1. 坐标系的旋转1.1 轴角法1.2 四元素1.3 基于欧拉角的旋转矩阵1.3.1 单轴旋转矩阵1.3.2 多轴旋转矩阵1.3.3 其他 2. 齐次变换矩阵3. visp实践 0. 一些概念 相关概念&am…

github仓库的基本使用-创建、上传文件、删除

1.第一步 先点击左侧菜单栏的远程仓库 2.点击NEW 3.创建仓库 然后点击右下角的 CREATE 4.点击code 点击SSH,然后我出现了You don’t have any public SSH keys in your GitHub account. You can add a new public key, or try cloning this repository via HTTPS. 1&#xff…