非关系型数据库-----------Redis的主从复制、哨兵模式

目录

一、redis群集有三种模式

1.1主从复制、哨兵、集群的区别

1.1.1主从复制

1.1.2哨兵

1.1.3集群

二、主从复制

2.1主从复制概述

2.2主从复制的作用

①数据冗余

②故障恢复

③负载均衡

④高可用基石

2.3主从复制流程

2.4搭建redis主从复制

2.4.1环境准备

2.4.2三台机器都安装redis

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

2.4.4修改Redis配置文件(slave节点操作)

2.4.5验证主从效果

2.4.5.1在Master节点上看日志

2.4.5.2在Master节点上验证从节点

2.4.5.3在master节点上添加数据 从节点查看

三、Redis哨兵模式

3.1Redis哨兵模式概述

3.2哨兵模式原理

3.3哨兵模式的作用

3.3.1监控

3.3.2自动故障转移

3.3.3通知(提醒)

3.4哨兵结构由两部分组成,哨兵节点和数据节点:

3.5故障转移机制 (哨兵的原理)

1) 主观下线

2) 客观下线

3) 投票选举

3.5.1主节点的选举:

3.6搭建redis哨兵模式

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

3.6.2启动哨兵模式

3.6.3查看哨兵信息

3.6.4故障模拟

3.6.4.1去master查看进程号

3.6.4.2杀死 Master 节点上redis-server的进程号

3.6.5验证结果


一、redis群集有三种模式

redis群集有三种模式,分别是主从同步/复制、哨兵模式、Cluster

1.1主从复制、哨兵、集群的区别

1.1.1主从复制

主从复制是高可用Redis的基础,哨兵和集群都是在主从复制基础上实现高可用的。

主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复。

缺陷:

  • 故障恢复无法自动化;
  • 写操作无法负载均衡;
  • 存储能力受到单机的限制。

1.1.2哨兵

哨兵:在主从复制的基础上,哨兵实现了自动化的故障恢复

缺陷

  • 写操作无法负载均衡;
  • 存储能力受到单机的限制;
  • 哨兵无法对从节点进行自动故障转移,在读写分离场景下,从节点故障会导致读服务不可用,需要对从节点做额外的监控、切换操作。

1.1.3集群

集群:通过集群,Redis解决了写操作无法负载均衡,以及存储能力受到单机限制的问题,实现了较为完善的高可用方案

但是,成本比较高,通常至少三主三从,六台起步,成本比较高!!

二、主从复制

2.1主从复制概述

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

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

2.2主从复制的作用

①数据冗余

主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。

②故障恢复

当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余

③负载均衡

在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;

尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。

④高可用基石

除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。

2.3主从复制原理

(1)若启动一个Slave机器进程,则它会向Master机器发送一个“sync command”命令,请求同步连接。

(2)无论是第一次连接还是重新连接,Master机器都会启动一个后台进程,将数据快照保存到数据文件中(执行rdb操作),同时Master还会记录修改数据的所有命令并缓存在数据文件中。

(3)后台进程完成缓存操作之后,Master机器就会向Slave机器发送数据文件,Slave端机器将数据文件保存到硬盘上,然后将其加载到内存中,接着Master机器就会将修改数据的所有操作一并发送给Slave端机器。若Slave出现故障导致宕机,则恢复正常后会自动重新连接。

(4)Master机器收到Slave端机器的连接后,将其完整的数据文件发送给Slave端机器,如果Mater同时收到多个Slave发来的同步请求,则Master会在后台启动一个进程以保存数据文件,然后将其发送给所有的Slave端机器,确保所有的Slave端机器都正常。

1、从节点给主节点发送sync命令,主节点则通过bgsave命令生成RDB快照文件,然后将其文件传给从节点,之后的写操作都记录在缓冲区;
2、从节点收到快照文件后执行保存到数据集中,然后再次给主发送psync命令,获取缓冲区的数据;
3、主节点发送缓冲区的写操作,从节点执行同步到数据集中,此时完成主从数据一致;
4、后续从节点会持续监测主,主节点也会定时给从节点发送写操作,从节点同步执行,实现主从数据一致;
 
注意:从节点首次同步以及宕机恢复都需要执行一次全量数据加载,即全量备份

sync同步 RDB(完全备份文件)给从服务器 

              AOF(增量备份)给从服务器 

主从复制过程/原理:

①从---->主发送sync同步数据请求
②主redis 会fork一个子进程,然后会产生RDB文件(完全备份的文件)的过程

2.1 客户端还在持续的写入redis
③rdb文件 持久化完成后,主redis会将RDB文件和缓存起来的命令推送给我们的从服务器
④复制、推送完后,主reids 会持续的同步操作命----->利用AOF(增备)主持久化功能
⑤在下一台redis 接入主从复制之前,会持续利用AOF的方式 同步数据给从服务器

2.4搭建redis主从复制

下载安装包的链接:

https://download.redis.io/releases/

2.4.1环境准备

主机操作系统  IP地址 软件 / 安装包 / 工具
MasterCentOS7192.168.246.8 redis-5.0.7.tar.gz
Slave1  CentOS7192.168.246.9 redis-5.0.7.tar.gz
Slave2CentOS7192.168.246.10 redis-5.0.7.tar.gz

关闭防火墙、防护

systemctl stop firewalld
setenforce 0

2.4.2三台机器都安装redis

[root@localhost ~]#systemctl stop firewalld
[root@localhost ~]#setenforce 0
[root@localhost ~]#yum install gcc gcc-c++ make -y
[root@localhost ~]#cd /opt
[root@localhost opt]#ls
rh
[root@localhost opt]#rz -E
rz waiting to receive.
[root@localhost opt]#ls
redis-5.0.7.tar.gz  rh
[root@localhost opt]#tar xf redis-5.0.7.tar.gz 
[root@localhost opt]#ls
redis-5.0.7  redis-5.0.7.tar.gz  rh
[root@localhost opt]#cd /opt/redis-5.0.7/
[root@localhost redis-5.0.7]#make -j 4
[root@localhost redis-5.0.7]#make prefix=/usr/local/redis install
[root@localhost redis-5.0.7]#cd /opt/redis-5.0.7/utils/
[root@localhost utils]#./install_server.sh

Please select the redis executable path [/usr/local/bin/redis-server] /usr/local/redis/bin/redis-server
[root@localhost utils]#ln -s /usr/local/redis/bin/* /usr/local/bin/
[root@localhost utils]#/etc/init.d/redis_6379 start
/var/run/redis_6379.pid exists, process is already running or crashed
[root@localhost utils]#netstat -natp|grep redis
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      6447/redis-server 1 
[root@localhost utils]#netstat -natp|grep 6379
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      6447/redis-server 1 
[root@localhost utils]#
​​​​​​​[root@localhost ~]#yum install gcc gcc-c++ make -y

修改下主机名,好区分

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

​vim /etc/redis/6379.conf

bind 0.0.0.0                     #70行,修改监听地址为0.0.0.0
daemontze yes                    #137行,开启守护进程
logfile/var/log/redis_6379.1og   #172行,指定日志文件目录
dir/var/lib/redis/6379           #264行,指定工作目录
appendonly yes                   #700行,开启AOF持久化功能
----------------------------------------
/etc/init.d/redis_6379 restart

2.4.4修改Redis配置文件(slave节点操作)

vim /etc/redis/6379.conf

bind 0.0.0.0						#70行,修改监听地址为0.0.0.0
daemonize yes						#137行,开启守护进程
logfile /var/log/redis_6379.log		#172行,指定日志文件目录
dir /var/lib/redis/6379				#264行,指定工作目录		
replicaof 192.168.246.8 6379        #288行,指定要同步的Master节点IP和端口
appendonly yes						#700行,开启AOF持久化功能
------------------------------------

/etc/init.d/redis_6379 restart

slave2配置:

由于配置一样,我们先备份下slave2配置文件,从slave1直接远程拷贝过去到slave2,再去查看下,是否正确

2.4.5验证主从效果

2.4.5.1在Master节点上看日志
[root@master_redis ~]#tail -f /var/log/redis_6379.log

两个从同步成功

2.4.5.2在Master节点上验证从节点
redis-cli info replication

2.4.5.3在master节点上添加数据 从节点查看

三、Redis哨兵模式

3.1Redis哨兵模式概述

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

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

3.2哨兵模式原理

哨兵(sentinel):是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的 Master并将所有slave连接到新的 Master

所以整个运行哨兵的集群的数量不得少于3个节点

3.3哨兵模式的作用

3.3.1监控

哨兵会不断地检查主节点和从节点是否运作正常、还有哨兵节点是否运作正常。

3.3.2自动故障转移

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

3.3.3通知(提醒)

哨兵可以将故障转移的结果发送给客户端。

3.4哨兵结构由两部分组成,哨兵节点和数据节点:

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

3.5故障转移机制 (哨兵的原理)

1.由哨兵节点定期监控发现主节点是否出现了故障

每个哨兵节点每隔1秒会向主节点、从节点及其它哨兵节点发送一次ping命令做一次心跳检测。

如果主节点在一定时间范围内不回复或者是回复一个错误消息,那么这个哨兵就会认为这个主节点主观下线了(单方面的)。当超过半数哨兵节点认为该主节点主观下线了,这样就客观下线了。

2.当主节点出现故障,此时哨兵节点会通过Raft算法(选举算法)实现选举机制共同选举出一个哨兵节点为leader,来负责处理主节点的故障转移和通知。

所以整个运行哨兵的集群的数量不得少于3个节点。

3.由leader哨兵节点执行故障转移,过程如下:

  • 将某一个从节点升级为新的主节点,让其它从节点指向新的主节点;
  • 若原主节点恢复也变成从节点,并指向新的主节点;
  • 通知客户端主节点已经更换。

需要特别注意的是,客观下线是主节点才有的概念;

如果从节点和哨兵节点发生故障,被哨兵主观下线后,不会再有后续的客观下线和故障转移操作。

上图所示,多个哨兵之间也存在互相监控,这就形成了多哨兵模式,现在对该模式的工作过程进行讲解,介绍如下:

1) 主观下线
主观下线,适用于主服务器和从服务器。如果在规定的时间内(配置参数:down-after-milliseconds),Sentinel 节点没有收到目标服务器的有效回复,则判定该服务器为“主观下线”。比如 Sentinel1 向主服务发送了 PING命令,在规定时间内没收到主服务器 PONG回复,则 Sentinel1 判定主服务器为“主观下线”。
2) 客观下线
客观下线,只适用于主服务器。 Sentinel1 发现主服务器出现了故障,它会通过相应的命令,询问其它 Sentinel 节点对主服务器的状态判断。如果超过半数以上的  Sentinel 节点认为主服务器 down 掉,则 Sentinel1 节点判定主服务为“客观下线”。
3) 投票选举

投票选举,所有 Sentinel 节点会通过投票机制,按照谁发现谁去处理的原则,选举 Sentinel1 为领头节点去做 Failover(故障转移)操作。Sentinel1 节点则按照一定的规则在所有从节点中选择一个最优的作为主服务器,然后通过发布订功能通知其余的从节点(slave)更改配置文件,跟随新上任的主服务器(master)。至此就完成了主从切换的操作。

对上对述过程做简单总结:

Sentinel 负责监控主从节点的“健康”状态。当主节点挂掉时,自动选择一个最优的从节点切换为主节点。客户端来连接 Redis 集群时,会首先连接 Sentinel,通过 Sentinel 来查询主节点的地址,然后再去连接主节点进行数据交互。当主节点发生故障时,客户端会重新向 Sentinel 要地址,Sentinel 会将最新的主节点地址告诉客户端。因此应用程序无需重启即可自动完成主从节点切换

①哨兵对主从复制集群进行监控     监控对象"所有redis数据节点"

②哨兵与哨兵之间进行相互监控     监控的对象: 哨兵彼此
③监控目的
3.1 哨兵与哨兵之间的监控目的:检测彼此的存活状态
3.2 哨兵监控所有的redis数据库的目的:为了实现故障自动故障切换
故障切换原理
① 当master 挂掉,哨兵会及时发现,发现之后 进行投票机制,选举出一个新的master服务器一定是基数)
② 完成salve----->master的 从向主 进行切换
③ 完成其他的从服务器对新的master配置


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

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

3.6搭建redis哨兵模式

环境准备:

主机操作系统  IP地址 软件 / 安装包 / 工具
Master、sentinel1CentOS7192.168.246.8 redis-5.0.7.tar.gz
Slave1、sentinel2CentOS7192.168.246.9 redis-5.0.7.tar.gz
Slave2、sentinel3CentOS7192.168.246.10 redis-5.0.7.tar.gz

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

哨兵模式要在基于主从复制已搭建完成的前提下才可以做哦

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

vim /opt/redis-5.0.7/sentinel.conf
------------------------------------------
protected-mode no								#17行,关闭保护模式
port 26379										#21行,Redis哨兵默认的监听端口
daemonize yes									#26行,指定sentinel为后台启动
logfile "/var/log/sentinel.log"					#36行,指定日志存放路径
dir "/var/lib/redis/6379"						#65行,指定数据库存放路径
sentinel monitor mymaster 192.168.246.8 6379 2	#84行,修改 指定该哨兵节点监控192.168.10.23:6379这个主节点,该主节点的名称是mymaster,最后的2的含义与主节点的故障判定有关:至少需要2个哨兵节点同意,才能判定主节点故障并进行故障转移
sentinel down-after-milliseconds mymaster 30000	#113行,判定服务器down掉的时间周期,默认30000毫秒(30秒)
sentinel failover-timeout mymaster 180000		#146行,故障节点的最大超时时间为180000(180秒)

可以再所有主机添加ip地址加域名,这样远程拷贝可以快一点

其他两台主机配置:/opt/redis-5.0.7/sentinel.conf

scp /opt/redis-5.0.7/sentinel.conf 192.168.246.9:/opt/redis-5.0.7/sentinel.conf
scp /opt/redis-5.0.7/sentinel.conf 192.168.246.10:/opt/redis-5.0.7/sentinel.conf

3.6.2启动哨兵模式

先启master,再启slave

先启master,再启slave

cd /opt/redis-5.0.7/
redis-sentinel sentinel.conf &

3.6.3查看哨兵信息

redis-cli -p 26379 info sentinel

3.6.4故障模拟

3.6.4.1去master查看进程号
ps -ef|grep redis

ps aux|grep redis  #查看进程

3.6.4.2杀死 Master 节点上redis-server的进程号

3.6.5验证结果

①在哨兵节点上验证master是否转换至从服务器 

tail -f /var/log/sentinel.log

再次查看哨兵信息:

②在哨兵节点上再次查看哨兵信息,查看是否转换成功

redis-cli -p 26379 info sentinel

总结

1、主从复制

redis主从复制 是为了数据冗余和读写分离

在这两种模式中,有两种角色主节点(master)和从节点(slave),主节点负责处理写的操作

并将数据更改复制到一个或多个从节点。

这样我们的主节点负载减轻,从节点可以提供数据读取服务,实现读写分离,如果主节点停止服务,从节点之一可以立即接管主节点的角色,再继续提供服务


具体流程如下:

1、从节点启动成功连接主节点后,发送一个sync命令

2、主节点接受到sync的命令后开始在后台保存快照,同时,它也开始记录接收到rsnc后所有执行写的命令,快照完成后会将这个快照文件发送给从节点。

3、从节点收到快照文件之后开始载入,并持续接受主节点发送过来的新的写命令执行

总的来说 通过主从复制,redis 能够实现数据的备份(master 产生的数据能slave备份),负责均衡(读操作可以分摊到slave上去)和高可用(master宕机后,可以由slave进行故障切换)


2、redis  哨兵机制

哨兵是一个高可用的行解决方案 官方认可 默认模式

1、监控:redis 哨兵 会持续监控master和slave实例是否正常运行

2、通知:如某个redis实例有问题,哨兵可以通过API向管理员或者其他应用发信通知

3、自动故障转移:如果master节点不工作,哨兵会开始故障转移的过程,选择一个slave节点晋升为新的master,其他剩余slave的节点会被重新配置为新的master节点的slave

4、配置提供服务:客户端可以使用哨兵来查询被认证的master节点该master节点的目录所有的slave节点


redis 哨兵是一个用于管理多个reids服务的系统,它提供监控、通知、自动故障转移、配置提供服务的功能,以实现redis高可用性

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Sy6 编辑器vi的应用(+shell脚本3例子)

实验环境: 宿主机为win11,网络:10.255.50.5 6389 WSL2 ubuntu 目标机的OS:Ubuntu 内核、版本如下: linuxpeggy0223:/$ uname -r 5.15.146.1-microsoft-standard-WSL2 linuxpeggy0223:/$ cat /proc/version Linux vers…

解析二极管的单向导电性

二极管是电子电路中很常用的元器件,非常常见,二极管具有正向导通,反向截止的特性。 在二极管的正向端(正极)加正电压,负向端(负极)加负电压,二极管导通,有电流…

云计算的安全需求

目录 一、概述 二、云安全服务基本能力要求 三、信息安全服务(云计算安全类)资质要求 3.1 概述 3.2 资质要求内容 3.2.1 组织与管理要求 3.2.2 技术能力要求 四、云安全主要合规要求 4.1 安全管理机构部门的建立 4.2 安全管理规范计划的编制 4…

计算机视觉之三维重建(5)---双目立体视觉

文章目录 一、平行视图1.1 示意图1.2 平行视图的基础矩阵1.3 平行视图的极几何1.4 平行视图的三角测量 二、图像校正三、对应点问题3.1 相关匹配法3.2 归一化相关匹配法3.3 窗口问题3.4 相关法存在的问题3.5 约束问题 一、平行视图 1.1 示意图 如下图即是一个平行视图。特点&a…

大数据设计为何要分层,行业常规设计会有几层数据

大数据设计通常采用分层结构的原因是为了提高数据管理的效率、降低系统复杂度、增强数据质量和可维护性。这种分层结构能够将数据按照不同的处理和应用需求进行分类和管理,从而更好地满足不同层次的数据处理和分析需求。行业常规设计中,数据通常按照以下…

java框架学习——注解/元注解概述及使用案例

前言: 整理下学习笔记,打好基础,daydayup!!! 注解 注解(Annotation)是java代码里的特殊标记。作用为:让其他程序根据注解信息来决定怎么执行该程序,如:Override,Test等。同时可以根…

安装pillow库的方法最终解答!

安装pillow库,记录留痕。 Pillow库是一个非常强大的图像处理库。它提供了广泛的图像处理功能,让我们可以轻松地操作图像,实现图像的转换、裁剪、缩放、旋转等操作。此外,Pillow还支持多种图像格式的读取和保存,包括JP…

「每日跟读」句型公式 第2篇

「每日跟读」句型公式 第2篇 1. I’m thinking about____ 我在考虑____ I’m thinking about my future career (我正在思考我未来的职业) I’m thinking about our marriage (我在考虑我们的婚姻) I’m thinking about taking a vacation (我在考虑度一个假) I’m think…

【RedHat9.0】Timer定时器——创建单调定时器实例

一个timer(定时器)的单元类型,用来定时触发用户定义的操作。要使用timer的定时器,关键是要创建一个定时器单元文件和一个配套的服务单元文件,然后启动这些单元文件。 定时器类型: 单调定时器:即…

回溯算法 DFS

目录 回溯算法和dfs的区别回溯算法基本框架例题:【1,2,3】的全排列代码详解完整代码 DFS 本文思路、代码均参考于:https://labuladong.online/algo/essential-technique/backtrack-framework-2/#%E4%B8%80%E3%80%81%E5%85%A8%E6%8E%92%E5%88%…

【数字图像处理】图像的最近邻插值、双线性插值和双三次插值

图像最近邻插值、双线性插值和双三次插值 用 O ( X , Y ) O(X,Y) O(X,Y)表示 H W H\times W HW的原始图像, G ( X ^ , Y ^ ) G(\hat{X},\hat{Y}) G(X^,Y^)表示 H ^ Y ^ \hat{H}\times\hat{Y} H^Y^的目标图像。 最近邻插值 最近邻插值法令目标图像在 ( x ^ , y…

深入理解直播美颜SDK背后的深度学习原理

直播美颜SDK技术背后涉及了深度学习原理的应用,今天我将为大家讲解美颜SDK其中的深度学习算法,还有一些基本原理与关键技术。 一、深度学习在直播美颜中的应用 直播美颜SDK的核心是基于深度学习的算法模型。这些模型通常由多个卷积神经网络组成&#xf…

SCI一区 | Matlab实现BES-TCN-BiGRU-Attention秃鹰算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测

SCI一区 | Matlab实现BES-TCN-BiGRU-Attention秃鹰算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测 目录 SCI一区 | Matlab实现BES-TCN-BiGRU-Attention秃鹰算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测预测效果基本介绍模型描述程序…

VS2022配置boost库-Windows为例

1. boost库下载 1)下载boost库源码:https://www.boost.org/ 2)以1.81版本为例,安装包如下 3)下载后解压 比如我是放在E盘下面的boost文件夹 2. 安装配置 1)打开VS2022命令行 2)切换安装…

智慧城市治理:构建全域覆盖的城市时空感知体系

TSINGSEE青犀AI算法中台是一款平台型产品,专注于提供各行业中小场景部署解决方案。平台具备接入广、性能强、支持跨平台、芯片国产化等特点,可提供丰富的视图接入能力和智能分析能力。 平台采用了多项IT高新技术,包括视频编解码技术、嵌入式…

蓝桥杯刷题-04-岛屿个数-DFS

#include <iostream> #include<bits/stdc.h> #define int long long using namespace std; const int N2e510; typedef pair<int,int>pii;map<pii, int>st;//记录从{x&#xff0c;y}的距离是多少 int a[N];//存储原始路径vector<pii>edge[N];//存…

C语言 | Leetcode C语言题解之第6题Z字形变换

题目&#xff1a; 题解&#xff1a; char * convert(char * s, int numRows){int n strlen(s), r numRows;if (r 1 || r > n) {return s;}int t r * 2 - 2;char * ans (char *)malloc(sizeof(char) * (n 1));int pos 0;for (int i 0; i < r; i) { // 枚举矩阵的…

回溯算法|46.全排列

力扣题目链接 class Solution { public:vector<vector<int>> result;vector<int> path;void backtracking (vector<int>& nums, vector<bool>& used) {// 此时说明找到了一组if (path.size() nums.size()) {result.push_back(path);re…

Acwing.1388 游戏(区间DP对抗思想)

题目 玩家一和玩家二共同玩一个小游戏。 给定一个包含 N个正整数的序列。 由玩家一开始&#xff0c;双方交替行动。 每次行动可以在数列的两端之中任选一个数字将其取走&#xff0c;并给自己增加相应数字的分数。&#xff08;双初始分都是 0分&#xff09; 当所有数字都被…

做好产品定位的3个重点

产品定位对于项目而言至关重要&#xff0c;正确的产品定位有助于项目锁定目标市场&#xff0c;精准满足客户需求。通过差异化产品策略&#xff0c;让产品在众多竞品中脱颖而出&#xff0c;形成独特竞争优势&#xff0c;从而有助于产品价值的实现。 因此做好产品定位迫在眉睫&am…