Redis - 主从复制
在分布式系统中为了解决单点问题,通常会把数据复制多个副本部署到其他服务器,满⾜故障恢 复和负载均衡等需求。Redis也是如此,它为我们提供了复制的功能,实现了相同数据的多个Redis副 本。复制功能是⾼可⽤Redis的基础,哨兵和集群都是在复制的基础上构建的。本章内容如下:
- 介绍复制的使⽤⽅式:如何建⽴或断开复制、安全性、只读等。
- 说明复制可⽀持的拓扑结构,以及每个拓扑结构的适⽤场景。
- 分析复制的原理,包括:建⽴复制、全量复制、部分复制、⼼跳检测等。
一、配置
1.1、建⽴复制
参与复制的Redis实例划分为主节点(master)和从节点(slave)。每个从结点只能有⼀个主节点, ⽽⼀个主节点可以同时具有多个从结点。复制的数据流是单向的,只能由主节点到从节点。配置复制 的⽅式有以下三种:
- 在配置⽂件中加⼊slaveof{masterHost}{masterPort}随Redis启动⽣效。
- 在redis-server 启动命令时加⼊--slaveof{masterHost}{masterPort}⽣效。
- 直接使⽤redis命令:slaveof{masterHost}{masterPort}⽣效。
接下来,将redis.conf配置⽂件复制⼀份redis-slave.conf,并且修改其daemonize为yes。
# By default Redis does not run as a daemon. Use 'yes' if you need it.# Note that Redis will write a pid file in /var/run/redis.pid when daemonized.daemonize yes
接下来,默认启动的redis作为主Redis,重新通过命令⾏启动⼀个Redis实例作为从Redis:
# ubunturedis-server /etc/redis/redis-slave.conf --port 6380 --slaveof 127.0.0.1 6379# centosredis-server /etc/redis-slave.conf --port 6380 --slaveof 127.0.0.1 6379
注 意:修改配置主要是修改从机的配置.主机配置不变.
通过netstat-nlpt确保两个Redis均已正确启动。
[root@host ~]# netstat -nlptActive Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address StatePID/Program name tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN49264/redis-server tcp 0 0 127.0.0.1:6380 0.0.0.0:* LISTEN 272418/redis-server
通过redis-cli 可以连接主Redis实例,通过redis-cli-p6380连接从Redis。并且观察复制关系。
127.0.0.1:6379> set hello worldOK127.0.0.1:6379> get hello"world"
127.0.0.1:6380> get hello"world"
从运⾏结果中看到复制已经⼯作了,针对主节点6379的任何修改都可以同步到从节点6380中,复制 过程如图所⽰。
Redis 主从节点复制过程
可以通过inforeplication命令查看复制相关状态。
1)主节点6379复制状态信息
127.0.0.1:6379> info replication# Replicationrole:masterconnected_slaves:1slave0:ip=127.0.0.1,port=6380,state=online,offset=100,lag=0master_replid:2fbd35a8b8401b22eb92ff49ad5e42250b3e7a06master_replid2:0000000000000000000000000000000000000000master_repl_offset:100second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:100
2)从节点6380复制状态信息
127.0.0.1:6380> info replication# Replicationrole:slavemaster_host:127.0.0.1master_port:6379master_link_status:upmaster_last_io_seconds_ago:1master_sync_in_progress:0slave_repl_offset:170slave_priority:100slave_read_only:1connected_slaves:0master_replid:2fbd35a8b8401b22eb92ff49ad5e42250b3e7a06master_replid2:0000000000000000000000000000000000000000master_repl_offset:170second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:170
1.2、断开复制
slaveof 命令不但可以建⽴复制,还可以在从节点执⾏slaveofnoone来断开与主节点复制关系。 例如在6380节点上执⾏slaveofnoone来断开复制。
断开复制主要流程:
- 断开与主节点复制关系。
- 从节点晋升为主节点。
从节点断开复制后并不会抛弃原有数据,只是⽆法再获取主节点上的数据变化。
通过slaveof命令还可以实现切主操作,将当前从节点的数据源切换到另⼀个主节点。执⾏ slaveof {newMasterIp} {newMasterPort} 命令即可。
切主操作主要流程:
1)断开与旧主节点复制关系。
2)与新主节点建⽴复制关系。
3)删除从节点当前所有数据。
4)从新主节点进⾏复制操作。
1.3、安全性
对于数据⽐较重要的节点,主节点会通过设置requirepass参数进⾏密码验证,这时所有的客⼾ 端访问必须使⽤auth命令实⾏校验。从节点与主节点的复制连接是通过⼀个特殊标识的客⼾端来完 成,因此需要配置从节点的masterauth参数与主节点密码保持⼀致,这样从节点才可以正确地连接到 主节点并发起复制流程。
1.4、只读
默认情况下,从节点使⽤slave-read-only=yes配置为只读模式。由于复制只能从主节点到从节 点,对于从节点的任何修改主节点都⽆法感知,修改从节点会造成主从数据不⼀致。所以建议线上不 要修改从节点的只读模式。
1.5、传输延迟
主从节点⼀般部署在不同机器上,复制时的⽹络延迟就成为需要考虑的问题,Redis为我们提供 了repl-disable-tcp-nodelay 参数⽤于控制是否关闭TCP_NODELAY,默认为no,即开启tcp nodelay 功能,说明如下:
- 当关闭时,主节点产⽣的命令数据⽆论⼤⼩都会及时地发送给从节点,这样主从之间延迟会变⼩, 但增加了⽹络带宽的消耗。适⽤于主从之间的⽹络环境良好的场景,如同机房部署。
- 当开启时,主节点会合并较⼩的TCP数据包从⽽节省带宽。默认发送时间间隔取决于Linux的内 核,⼀般默认为40毫秒。这种配置节省了带宽但增⼤主从之间的延迟。适⽤于主从⽹络环境复杂 的场景,如跨机房部署。
二、拓扑
Redis 的复制拓扑结构可以⽀持单层或多层复制关系,根据拓扑复杂性可以分为以下三种:⼀主⼀ 从、⼀主多从、树状主从结构。
2.1、⼀主⼀从结构
⼀主⼀从结构是最简单的复制拓扑结构,⽤于主节点出现宕机时从节点提供故障转移⽀持,如图 所⽰。当应⽤写命令并发量较⾼且需要持久化时,可以只在从节点上开启AOF,这样既可以保证数据 安全性同时也避免了持久化对主节点的性能⼲扰。但需要注意的是,当主节点关闭持久化功能时,如 果主节点宕机要避免⾃动重启操作。
⼀主⼀从拓扑
2.2、⼀主多从结构
⼀主多从结构(星形结构)使得应⽤端可以利⽤多个从节点实现读写分离,如图5-3所⽰。对于 读⽐重较⼤的场景,可以把读命令负载均衡到不同的从节点上来分担压⼒。同时⼀些耗时的读命令可 以指定⼀台专⻔的从节点执⾏,避免破坏整体的稳定性。对于写并发量较⾼的场景,多个从节点会导 致主节点写命令的多次发送从⽽加重主节点的负载。
⼀主多从拓扑
2.3、树形主从结构
树形主从结构(分层结构)使得从节点不但可以复制主节点数据,同时可以作为其他从节点的主 节点继续向下层复制。通过引⼊复制中间层,可以有效降低住系欸按负载和需要传送给从节点的数据 量,如图6-4所⽰。数据写⼊节点A之后会同步给B和C节点,B节点进⼀步把数据同步给D和E节 点。当主节点需要挂载等多个从节点时为了避免对主节点的性能⼲扰,可以采⽤这种拓扑结构。
图5-4树形拓扑
三、 原理
3.1、复制过程
如图所⽰,下⾯详细介绍建⽴复制的完整流程。从图中可以看出复制过程⼤致分为6个过程:
主从节点建⽴复制流程图
1)保存主节点(master)的信息。
开始配置主从同步关系之后,从节点只保存主节点的地址信息,此时建⽴复制流程还没有开始, 在从节点6380执⾏inforeplication可以看到如下信息:
master_host: 127.0.0.1master_port: 6379master_link_status: down
从统计信息可以看出,主节点的ip和port被保存下来,但是主节点的连接状态 (master_link_status)是下线状态。
2)从节点(slave)内部通过每秒运⾏的定时任务维护复制相关逻辑,当定时任务发现存在新的主节 点后,会尝试与主节点建⽴基于TCP的⽹络连接。如果从节点⽆法建⽴连接,定时任务会⽆限重试直 到连接成功或者⽤⼾停⽌主从复制。
3)发送ping命令。连接建⽴成功之后,从节点通过ping命令确认主节点在应⽤层上是⼯作良好的。 如果ping命令的结果pong回复超时,从节点会断开TCP连接,等待定时任务下次重新建⽴连接。
4)权限验证。如果主节点设置了requirepass参数,则需要密码验证,从节点通过配置masterauth 参数来设置密码。如果验证失败,则从节点的复制将会停⽌。
5)同步数据集。对于⾸次建⽴复制的场景,主节点会把当前持有的所有数据全部发送给从节点,这步 操作基本是耗时最⻓的,所以⼜划分称两种情况:全量同步和部分同步,下⼀节重点介绍。
6)命令持续复制。当从节点复制了主节点的所有数据之后,针对之后的修改命令,主节点会持续的把 命令发送给从节点,从节点执⾏修改命令,保证主从数据的⼀致性。
3.2、数据同步psync
Redis 使⽤psync命令完成主从数据同步,同步过程分为:全量复制和部分复制。
- 全量复制:⼀般⽤于初次复制场景,Redis早期⽀持的复制功能只有全量复制,它会把主节点全部 数据⼀次性发送给从节点,当数据量较⼤时,会对主从节点和⽹络造成很⼤的开销。
- 部分复制:⽤于处理在主从复制中因⽹络闪断等原因造成的数据丢失场景,当从节点再次连上主节 点后,如果条件允许,主节点会补发数据给从节点。因为补发的数据远⼩于全量数据,可以有效避 免全量复制的过⾼开销。
PSYNC的语法格式
PSYNC replicationid offset
如果replicationid 设为?并且offset设为-1 此时就是在尝试进⾏全量复制.
如果replicationid offset 设为了具体的数值,则是尝试进⾏部分复制.
3.2.1、replicationid/replid (复制id)
主节点的复制id.主节点重新启动,或者从节点晋级成主节点,都会⽣成⼀个replicationid.(同⼀个节 点,每次重启,⽣成的replicationid也会变化).
从节点在和主节点建⽴连接之后,就会获取到主节点的replicationid.
通过 info replication 即可看到replicationid
127.0.0.1:6379> info replication# Replicationrole:masterconnected_slaves:0master_replid:1da596acecf5a34b4b2aae45bd35be785691ae69master_replid2:0000000000000000000000000000000000000000master_repl_offset:0second_repl_offset:-1repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:0
关于master_replid和master_replid2
每个节点需要记录两组master_replid.这个设定解决的问题场景是这样的:
⽐如当前有两个节点A和B,A为master,B为slave.
此时B就会记录A的master_replid.
如果⽹络出现抖动,B以为A挂了,B⾃⼰就会成为主节点.于是B给⾃⼰分配了新的master_replid.
此时就会使⽤master_replid2来保存之前A的master_replid.
- 后续如果⽹络恢复了,B就可以根据master_replid2找回之前的主节点.
- 后续如果⽹络没有恢复,B就按照新的master_replid⾃成⼀派,继续处理后续的数据
3.2.2、offset (偏移量)
参与复制的主从节点都会维护⾃⾝复制偏移量。主节点(master)在处理完写⼊命令后,会把命令的 字节⻓度做累加记录,统计信息在inforeplication中的master_repl_offset指标中。
127.0.0.1:6379> info replication# Replicationrole:master...master_repl_offset:1055130
从节点(slave)每秒钟上报⾃⾝的复制偏移量给主节点,因此主节点也会保存从节点的复制偏移量, 统计指标如下:
127.0.0.1:6379> info replicationconnected_slaves:1slave0:ip=127.0.0.1,port=6380,state=online,offset=1055214,lag=1...
从节点在接受到主节点发送的命令后,也会累加记录⾃⾝的偏移量。统计信息在inforeplication中的 slave_repl_offset 指标中:
127.0.0.1:6380> info replication# Replicationrole:slave...slave_repl_offset:1055214
复制偏移量的维护如图所⽰。通过对⽐主从节点的复制偏移量,可以判断主从节点数据是否⼀致。
3.3、复制偏移量维护
这个偏移量,就相当于"学习进度"
replid+offset共同标识了⼀个"数据集". 如果两个节点,他们的replid和offset都相同,则这两个节点上持有的数据,就⼀定相同.
3.4、psync运⾏流程
1)从节点发送psync命令给主节点,replid和offset的默认值分别是?和-1.
2)主节点根据 psync 参数和自身数据情况决定响应结果:
- 如果回复+FULLRESYNC replid offset,则从节点需要进⾏全量复制流程。
- 如果回复+CONTINEU,从节点进⾏部分复制流程。
- 如果回复-ERR,说明Redis主节点版本过低,不⽀持psync命令。从节点可以使⽤sync命令进⾏ 全量复制。
- psync⼀般不需要⼿动执⾏.Redis会在主从复制模式下⾃动调⽤执⾏.
- sync会阻塞redisserver处理其他请求.psync则不会
3.5、全量复制
全量复制是Redis最早⽀持的复制⽅式,也是主从第⼀次建⽴复制时必须经历的阶段。全量复制的运 ⾏流程如图所⽰。
全量复制流程
1)从节点发送psync命令给主节点进⾏数据同步,由于是第⼀次进⾏复制,从节点没有主节点的运 ⾏ID和复制偏移量,所以发送psync?-1。
2)主节点根据命令,解析出要进⾏全量复制,回复+FULLRESYNC响应。
3)从节点接收主节点的运⾏信息进⾏保存。
4)主节点执⾏bgsave进⾏RDB⽂件的持久化。
5)从节点发送RDB⽂件给从节点,从节点保存RDB数据到本地硬盘。
6)主节点将从⽣成RDB到接收完成期间执⾏的写命令,写⼊缓冲区中,等从节点保存完RDB⽂件 后,主节点再将缓冲区内的数据补发给从节点,补发的数据仍然按照rdb的⼆进制格式追加写⼊到收 到的rdb⽂件中.保持主从⼀致性。
7)从节点清空⾃⾝原有旧数据。
8)从节点加载RDB⽂件得到与主节点⼀致的数据。
9)如果从节点加载RDB完成之后,并且开启了AOF持久化功能,它会进⾏bgrewrite操作,得到最 近的AOF⽂件。
通过分析全量复制的所有流程,我们会发现全量复制是⼀件⾼成本的操作:主节点bgsave的时间, RDB在⽹络传输的时间,从节点清空旧数据的时间,从节点加载RDB的时间等。所以⼀般应该尽可能 避免对已经有⼤量数据集的Redis进⾏全量复制。
有磁盘复制vs⽆磁盘复制(diskless)
默认情况下,进⾏全量复制需要主节点⽣成RDB⽂件到主节点的磁盘中,再把磁盘上的RDB ⽂件通过发送给从节点.
Redis 从2.8.18版本开始⽀持⽆磁盘复制.主节点在执⾏RDB⽣成流程时,不会⽣成RDB⽂ 件到磁盘中了,⽽是直接把⽣成的RDB数据通过⽹络发送给从节点.这样就节省了⼀系列的写 硬盘和读硬盘的操作开销.
3.6、部分复制
部分复制主要是Redis针对全量复制的过⾼开销做出的⼀种优化措施,使⽤psyncreplicationId offset 命令实现。当从节点正在复制主节点时,如果出现⽹络闪断或者命令丢失等异常情况时,从节点 会向主节点要求补发丢失的命令数据,如果主节点的复制积压缓冲区存在数据则直接发送给从节点, 这样就可以保持主从节点复制的⼀致性。补发的这部分数据⼀般远远⼩于全量数据,所以开销很⼩。 整体流程如图所⽰。
图部分复制过程
1)当主从节点之间出现⽹络中断时,如果超过repl-timeout时间,主节点会认为从节点故障并终端 复制连接。
2)主从连接中断期间主节点依然响应命令,但这些复制命令都因⽹络中断⽆法及时发送给从节点,所 以暂时将这些命令滞留在复制积压缓冲区中。
3)当主从节点⽹络恢复后,从节点再次连上主节点。
4)从节点将之前保存的replicationId和复制偏移量作为psync的参数发送给主节点,请求进⾏部分 复制。
5)主节点接到psync请求后,进⾏必要的验证。随后根据offset去复制积压缓冲区查找合适的数据, 并响应+CONTINUE给从节点。
6)主节点将需要从节点同步的数据发送给从节点,最终完成⼀致性。
3.7、复制积压缓冲区
复制积压缓冲区是保存在主节点上的⼀个固定⻓度的队列,默认⼤⼩为1MB,当主节点有连接的从节 点(slave)时被创建,这时主节点(master)响应写命令时,不但会把命令发送给从节点,还会写⼊ 复制积压缓冲区,如图所⽰。
由于缓冲区本质上是先进先出的定⻓队列,所以能实现保存最近已复制数据的功能,⽤于部分复制和 复制命令丢失的数据补救。复制缓冲区相关统计信息可以通过主节点的inforeplication中:
127.0.0.1:6379> info replication# Replicationrole:master...repl_backlog_active:1 // 开启复制缓冲区repl_backlog_size:1048576 // 缓冲区最⼤⻓度repl_backlog_first_byte_offset:7479 // 起始偏移量,计算当前缓冲区可⽤范围repl_backlog_histlen:1048576 // 已保存数据的有效⻓度
根据统计指标,可算出复制积压缓冲区内的可⽤偏移量范围:[repl_backlog_first_byte_offset,repl_backlog_first_byte_offset + repl_backlog_histlen]。
这个相当于⼀个基于数组实现的环形队列.上述区间中的值就是"数组下标".
如果当前从节点需要的数据,已经超出了主节点的积压缓冲区的范围,则⽆法进⾏部分复制,只 能全量复制了.
3.8、实时复制
主从节点在建⽴复制连接后,主节点会把⾃⼰收到的修改操作,通过tcp⻓连接的⽅式,源源不断的传 输给从节点.从节点就会根据这些请求来同时修改⾃⾝的数据.从⽽保持和主节点数据的⼀致性.
另外,这样的⻓连接,需要通过⼼跳包的⽅式来维护连接状态.(这⾥的⼼跳是指应⽤层⾃⼰实现的⼼跳, ⽽不是TCP⾃带的⼼跳).
1)主从节点彼此都有⼼跳检测机制,各⾃模拟成对⽅的客⼾端进⾏通信。
2)主节点默认每隔10秒对从节点发送ping命令,判断从节点的存活性和连接状态。
3)从节点默认每隔1秒向主节点发送replconfack{offset}命令,给主节点上报⾃⾝当前的复制偏移 量。
如果主节点发现从节点通信延迟超过repl-timeout配置的值(默认60秒),则判定从节点下线,断 开复制客⼾端连接。从节点恢复连接后,⼼跳机制继续进⾏。
四、本章重点回顾
主从复制解决的问题:
单点问题
- 单个redis节点,可⽤性不⾼.
- 单个redis节点,性能有限.
主从复制的特点:
- Redis 通过复制功能实现主节点的多个副本。
- 主节点⽤来写,从节点⽤来读.这样做可以降低主节点的访问压⼒.
- 复制⽀持多种拓扑结构,可以在适当的场景选择合适的拓扑结构。
- 复制⽀持多种拓扑结构,可以在适当的场景选择合适的拓扑结构。
- 主从节点之间通过⼼跳机制保证主从节点通信正常和数据⼀致性。
主从复制配置的过程:
- 主节点配置不需要改动.
- 从节点在配置⽂件中加⼊ 主从复制的缺点: slaveof 主节点 ip 主节点端⼝ 的形式即可.
主从复制的缺点:
- 从机多了,复制数据的延时⾮常明显.
- 主机挂了,从机不会升级成主机.只能通过⼈⼯⼲预的⽅式恢复.
相关文章:

Redis - 主从复制
在分布式系统中为了解决单点问题,通常会把数据复制多个副本部署到其他服务器,满⾜故障恢 复和负载均衡等需求。Redis也是如此,它为我们提供了复制的功能,实现了相同数据的多个Redis副 本。复制功能是⾼可⽤Redis的基础,…...

UE5 HLSL 学习笔记
half的取值范围是整形的-60000 到 60000,考虑带宽的情况下使用half vector默认为float4 访问可以.xyzw,也可以.rgba,也可以[index],且顺序可以变,比如说.yzwx 矩阵的获取值的方式 第一个行代表获取第1行第0号元素 第…...

一个简单ASP.NET购物车设计
思路: 创建一个多选列表 在cs文件里初始化购物车会话变量,同,创建一个新的 List<string> 并将其赋值给会话状态中的 "Cart" 键–(利用Session) Session 是一种用于存储用户特定信息的对象,这些信息可…...

双向循环列表
双向循环列表的实现。 根据定义实现。不解释,具体细节看代码。 list.h #pragma once#pragma pack(1)typedef struct _MyListEntry {_MyListEntry* next;_MyListEntry* prev; }MyListEntry;#pragma pack()class MyListClass { public:MyListEntry* m_list0;int m_k…...

go项目出现了ambiguous import要怎么解决?
前言 最近小编在 构建一个项目时出现了问题,提示报错里ambiguous import;查询了解到是 依赖包存在多个不同版本的问题 这样的情况要怎么解决呢? 小编先是将问题抛给了 chatgpt,得到了如下的信息: # 清理缓存 go clea…...

更改Ubuntu22.04锁屏壁纸
更改Ubuntu22.04锁屏壁纸 sudo apt install gnome-shell-extensions gnome-shell-extension-manager安装Gnome Shell 扩展管理器后,打开“扩展管理器”并使用搜索栏找到“锁屏背景”扩展...

ROS2humble版本使用colcon构建包
colcon与与catkin相比,没有 devel 目录。 创建工作空间 首先,创建一个目录 ( ros2_example_ws ) 来包含我们的工作区: mkdir -p ~/ros2_example_ws/src cd ~/ros2_example_ws 此时,工作区包含一个空目录 src : . └── src1 directory, …...

CSRF 跨站请求伪造的实现原理和预防措施
CSRF(跨站请求伪造)概述 CSRF(Cross-Site Request Forgery),即跨站请求伪造,是一种攻击手段,攻击者利用受害者在网站上已认证的身份信息,诱使受害者发起未经授权的请求,从…...

【LeetCode】【算法】22. 括号生成
LeetCode 22. 括号生成 题目描述 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 解题思路 天天到处看答案,看的灵神的解题思路回溯不会写?套路在此!(Pyth…...

WPF+MVVM案例实战与特效(二十五)- 3D粒子波浪效果实现
文章目录 1、案例效果2、案例实现1、文件创建2. 功能代码实现3、粒子功能应用1、前端布局与样式2、代码解释2、 后端功能代码1、案例效果 2、案例实现 1、文件创建 打开 Wpf_Examples 项目、Models 文件夹下创建 3D粒子模型类 ParticleWaveEffectModel.cs 文件。在Tools 文件…...

wsl2安装和使用
WSL(Windows Subsystem for Linux)是一个在 Windows 操作系统上运行 Linux 二进制可执行文件的兼容层。它允许用户在 Windows 上运行 Linux 命令行工具和应用程序。 主要功能 简化开发流程:开发者可以在 Windows 上使用 Linux 的开发工具链。兼容性:支持多种 Linux 发行版,…...

【划分型 DP-最优划分】【腾讯笔试压轴】【hard】力扣132. 分割回文串 II
给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文串。 返回符合要求的 最少分割次数 。 示例 1: 输入:s “aab” 输出:1 解释:只需一次分割就可将 s 分割成 [“aa”,“b”] 这样两个回文子…...

Kubernetes-镜像加速篇-01-加速工具
[友情链接]加速三剑客 镜像加速:https://github.com/DaoCloud/public-image-mirror 二进制文件加速:https://github.com/DaoCloud/public-binary-files-mirror Helm 加速:https://github.com/DaoCloud/public-helm-charts-mirror 二进制文件…...

字母的异位数
做leetcode242题时出现了一个错误: bool isAnagram(string s, string t) {map<char,int> cnt;bool ans true;int lens s.length();int lent t.length();for(int i 0;i < lens;i){cnt[s[i]] 1;cout << cnt[s[i]] << endl;}for(int i 0;i…...

达梦数据库DM Exception字符串截断错误,略坑~
前言 我之前在使用达梦数据库的时候,遇到了很多很多的问题,主要对达梦数据库也不是很熟悉,它的语法和我所熟悉的mysql和postgresql有很大的区别。 今天,讲一下我之前遇到的一个问题。这个问题的起因是用达梦数据库迁移工具&…...

vue实现图片无限滚动播放
本人vue新手菜鸡,文章为自己在项目中遇到问题的记录,如有不足还请大佬指正 文章目录 实现效果代码展示总结 因为刚接触vue,本想着看看能不能用一些element的组件实现图片的轮播效果,尝试使用过element-UI里的走马灯Carouse&#x…...

python爬虫指南——初学者避坑篇
目录 Python爬虫初学者学习指南一、学习方向二、Python爬虫知识点总结三、具体知识点详解和实现步骤1. HTTP请求和HTML解析2. 正则表达式提取数据3. 动态内容爬取4. 数据存储5. 反爬虫应对措施 四、完整案例:爬取京东商品信息1. 导入库和设置基本信息2. 获取网页内容…...

Vivado+Vscode联合打造verilog环境
一、Vivado下载安装 详细参考我另一篇文章: Vivado2022.2下载安装_fpga vivado下载-CSDN博客https://blog.csdn.net/weixin_61081689/article/details/143460790?spm1001.2014.3001.5501 二、Vscode下载安装 详细参考我另一篇文章: VscodeAnacond…...

Python 微服务架构
Python 微服务架构 目录 🛠 微服务架构的基本概念与设计原则⚡ Python 在微服务中的应用(Flask、FastAPI等框架)🚀 微服务的自动化部署与运维🔍 服务发现与负载均衡📊 微服务中的日志集中管理与监控&…...

Android JNI 技术入门指南
引言 在Android开发中,Java是一种主要的编程语言,然而,对于一些性能要求较高的场景(如音视频处理、图像处理、计算密集型任务等),我们可能需要使用到C或C等语言来编写底层的高效代码。为了实现Java代码与C…...

实在智能受邀出席柳州市智能终端及机器人产业发展合作大会
10 月 27 日至 28 日,由中共柳州市委员会与柳州市人民政府主办的2024柳州市智能终端及机器人产业发展合作大会在柳州莲花山庄隆重举行。大会充分整合各方资源,持续深化与柳州在重大战略规划、重大平台建设、重点产业培育等领域的合作。作为智能体行业的知…...

算法求解(C#)-- 寻找包含目标字符串的最短子串算法
1. 引言 在字符串处理中,我们经常需要从一个较长的字符串中找到包含特定目标字符串的最短子串。这个问题在文本搜索、基因序列分析等领域有着广泛的应用。本文将介绍一种高效的算法来解决这个问题。 2. 问题描述 给定一个源字符串 source 和一个目标字符串 targe…...

AscendC从入门到精通系列(二)基于Kernel直调开发AscendC算子
本次主要讨论下AscendC算子的开发流程,基于Kernel直调工程的算子开发。 1 AscendC算子开发的基本流程 使用Ascend C完成Add算子核函数开发; 使用ICPU_RUN_KF CPU调测宏完成算子核函数CPU侧运行验证; 使用<<<>>>内核调用符…...

DAO模式的理解
目录 DAO模式 含义 DAO模式 的理解 分层思维 分层含义 分层目的 dao层 dao包(对接的是操作数据库的接口) dao包下lmpl 包(dao包中接口的实现类) 补充 1 你创建的实体类需要和数据库中建的表一一对应。 总结 DAO模式 含义…...

使用GitHub Actions实现CI/CD流程
💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 使用GitHub Actions实现CI/CD流程 GitHub Actions 简介 创建仓库 配置工作流 示例工作流文件 触发和运行工作流 部署应用 最佳实…...

机器人助力Bridge Champ游戏:1.4.2版本如何提升玩家体验
在Bridge Champ游戏中,机器人扮演着桥牌游戏的“无名英雄”角色,默默地提升玩家体验。凭借智能化的设计,这些机器人不仅能够陪练,也大大提升了比赛的流畅度与趣味性。 Bridge Champ是什么 Bridge Champ是一个基于Ignis公链的在线…...

滑动窗口(单调队列维护窗口)-acwing
题目: 154. 滑动窗口 - AcWing题库 代码(删除队列窗口多余的>单调队列) 判断最值是否滑出窗口可以放在 入队的后面。 但是,判断,准备入队元素比前面小,要从队尾出队,放在入队前。 总之&a…...

ALB搭建
ALB: 多级分发、消除单点故障提升应用系统的可用性(健康检查)。 海量微服务间的高效API通信。 自带DDoS防护,集成Web应用防火墙 配置: 1.创建ECS实例 2.搭建应用 此处安装的LNMP 3.创建应用型负载均衡ALB实例 需要创建服务关联角…...

c# 动态lambda实现二级过滤(支持多种参数类型和模糊查询)
效果 调用方法 实体类(可以根据需求更换) public class ToolStr50 {public bool isSelected { get; set; }public string toolStr1 { get; set; }public string toolStr2 { get; set; }public string toolStr3 { get; set; }public string toolStr4 { …...

第J5周:DenseNet+SE-Net实战
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 任务: ●1. 在DenseNet系列算法中插入SE-Net通道注意力机制,并完成猴痘病识别 ●2. 改进思路是否可以迁移到其他地方呢 ●3. 测试集acc…...