Redis 高可用:从主从到集群的全面解析
目录
- 一、主从复制 (基础)
- 1. 同步复制
- a. 全量数据同步
- b. 增量数据同步
- c. 可能带来的数据不一致
- 2. 环形缓冲区
- a. 动态调整槽位
- 3. runid
- 4. 主从复制解决单点故障
- a. 单点故障
- b. 可用性问题
- 5. 注意事项
- a. Replica 主动向 Master 建立连接
- b. Replica 主动向 Master 拉取数据
- 二、哨兵模式
- 1. 主机下线
- 2. 备机下线
- 3. 哨兵监控
- a. 从库为主
- b. 故障转移
- 4. 连锁转换节点
- 5. 如何使用
- a. 获取主节点地址,并连接
- b. 龙卷风监控 / 监听模式
- 6. 缺点
- a. 没有预设数据交互机制
- b. 没有高效的"票机制"
- 7. 几个步骤
- a. 去中心化
- b. 主节点对称
- c. 解决了数据广播
- 8. 特性
- a. 客户端自动保持缓存位置,以服务为准,待节点异常后主机广播分配给节点ID
- b. 可人力效应迁移
- 三、集群模式 (Cluster)
- 1. 将集群内托管在一个节点
- 2. 客户端不在线节点,将初始化找回的命令、鼠标拖拽到节点
- 3. 流程
- a. 推动节点响应主机传递的数据交换
- b. 故障转移(主节点下线)
- c. 由下线主节点的副本传入数据,交给节点中的负载库作为主节点
- d. 从布置点下线主节点的副本信息供用,拷贝需接受的负载库状态作为节点
- e. 备用节点接入副信息传送
- 4. 缺点
- a. 因为主从采用同步分离库所以到存储数据尽量大防的端
- 5. 问题
- a. 多次错误响应,解决后确认,频率分段,自动解决计算
- 6. 特性
- a. 数据分化
- b. 有容有性
- c. 高可靠
- d. 动态扩容性
- e. 生产调整
- f. 实际需要 Cluster 模式或高可用以及常规管理
- 四、分布式延时队列
- 1. 数据变化化
- 2. 有存存有
- 3. 高可靠
- 4. 动态分配性
- 5. 生产性调整
- 6. 实现
- a. 使用 ZSet 存储延时任务
- b. 每个子节点多个键——分组处理
- 五、总结
- 关键要点
- 应用建议
- 参考
Redis 作为一个高性能的内存数据库,支持多种复制和高可用性机制,包括主从复制、哨兵模式、集群模式以及分布式延时队列。本文将根据提供的树状结构,详细展开介绍这些机制的原理、实现、优缺点及应用场景,帮助读者全面理解和应用 Redis 的高级功能。
一、主从复制 (基础)
主从复制是 Redis 实现数据冗余和高可用性的基础机制。通过将数据从主节点(Master)复制到从节点(replica),可以实现数据备份、读写分离以及故障恢复等功能。
1. 同步复制
同步复制是主从复制的核心,确保从节点的数据与主节点保持一致。同步复制包括全量数据同步和增量数据同步两个阶段。
a. 全量数据同步
原理:当从节点首次连接到主节点,或者在某些情况下(如主从断开连接后重新连接),需要从主节点获取完整的数据集。这一过程称为全量数据同步。
步骤:
- 从节点发送
SYNC
命令给主节点,表示希望进行数据同步。 - 主节点接收到
SYNC
命令后,创建一个子进程(使用fork()
),子进程负责生成 RDB 快照文件。 - 子进程将 RDB 文件发送给从节点,从节点接收并加载数据,确保与主节点的数据一致。
- 全量同步完成后,主节点和从节点进入增量同步阶段,继续传输主节点的新写命令。
优缺点:
- 优点:
- 保证从节点与主节点数据的一致性。
- 简单可靠,适用于初始同步和主从重连场景。
- 缺点:
- 全量同步需要传输大量数据,可能导致网络带宽占用高。
- 在数据量大的情况下,同步过程耗时较长,影响系统性能。
b. 增量数据同步
原理:在全量同步完成后,主节点将接收到的所有写命令实时传输给从节点,确保从节点数据的实时更新。这一过程称为增量数据同步。
步骤:
- 主节点将所有新的写命令通过发布/订阅机制(Pub/Sub)实时发送给从节点。
- 从节点接收到命令后,按照顺序执行这些命令,保持数据一致性。
优缺点:
- 优点:
- 实时性强,确保从节点数据与主节点同步。
- 增量同步的开销相对较小,仅传输变化的数据。
- 缺点:
- 在高并发环境下,主节点需要处理大量的命令传输,可能影响性能。
- 如果增量同步过程中出现网络延迟或中断,可能导致数据不一致。
c. 可能带来的数据不一致
尽管主从复制旨在保持数据一致性,但在某些情况下,可能会出现数据不一致的问题。
原因:
- 网络延迟或中断:主从之间的网络问题可能导致部分命令未能及时传输,导致数据不同步。
- 主节点故障:在主节点发生故障之前,未完成的命令可能未能传输到从节点,导致数据丢失。
- 从节点故障恢复:从节点在故障恢复过程中,如果没有正确执行全量和增量同步,可能导致数据不一致。
解决方法:
- 监控与报警:通过 Redis Sentinel 或其他监控工具,及时发现主从复制中的问题。
- 自动故障转移:在检测到主节点故障时,自动将从节点提升为新的主节点,确保数据服务的持续性。
- 数据验证:定期对主从节点的数据进行校验,发现不一致时进行修复。
2. 环形缓冲区
环形缓冲区(Circular Buffer)是 Redis 实现高效复制的一种数据结构,用于缓存主节点发送给从节点的命令。
a. 动态调整槽位
原理:环形缓冲区的大小可以动态调整,以适应不同负载下的复制需求。当主节点发送的命令量增加时,缓冲区会自动扩展;当命令量减少时,缓冲区会收缩。
优点:
- 高效性:减少内存分配和释放的频率,提高系统性能。
- 灵活性:能够适应不同的负载情况,确保复制过程的稳定性。
缺点:
- 复杂性:实现动态调整槽位需要更复杂的逻辑,增加代码的复杂度。
- 内存管理:需要精细管理缓冲区的内存,避免内存泄漏或溢出。
3. runid
定义:runid
是 Redis 用于唯一标识主从节点之间复制关系的标识符。
功能:
- 标识关联:通过
runid
,从节点能够识别并连接到对应的主节点,确保复制过程的正确性。 - 避免重复:在多节点环境中,确保每个从节点只能复制一个主节点,避免数据冲突。
4. 主从复制解决单点故障
主从复制不仅仅是数据备份机制,更是解决 Redis 单点故障(Single Point of Failure, SPOF)问题的重要手段。
a. 单点故障
定义:单点故障指系统中某个关键组件的失效会导致整个系统不可用。
在 Redis 中的表现:
- 主节点故障:如果主节点宕机,所有的写操作将无法进行,系统服务可能会中断。
b. 可用性问题
通过配置从节点,可以在主节点故障时迅速切换到从节点,保持系统的高可用性。
解决方法:
- 多从节点:配置多个从节点,分散复制负载,提升系统的容错能力。
- 自动故障转移:结合 Redis Sentinel,实现主节点故障时自动提升从节点为新主节点。
5. 注意事项
在配置和使用主从复制时,需要注意以下几点,以确保复制过程的稳定和高效。
a. Replica 主动向 Master 建立连接
原理:从节点(Replica)主动向主节点(Master)建立连接,确保复制链条的正确性和可靠性。
好处:
- 连接稳定:从节点主动连接主节点,可以更好地管理连接状态,避免连接被动断开。
- 负载均衡:无论复制链条中的哪个从节点,都能确保从节点主动拉取数据,避免主节点的负载过高。
b. Replica 主动向 Master 拉取数据
原理:从节点主动拉取主节点的数据,确保复制过程中的数据传输顺序和完整性。
好处:
- 数据一致性:从节点按顺序拉取主节点的写命令,确保数据的一致性。
- 复制效率:从节点主动拉取数据,可以根据自身的处理能力和网络状况,动态调整拉取速度,优化复制效率。
二、哨兵模式
Redis 哨兵(Sentinel)模式是一种高可用性解决方案,负责监控主节点和从节点的状态,并在主节点发生故障时自动进行故障转移。
1. 主机下线
情景:当主节点由于网络问题、硬件故障或其他原因下线,哨兵需要检测到这一变化,并采取相应的措施。
2. 备机下线
情景:从节点(备机)也可能由于各种原因下线,哨兵需要监控从节点的状态,确保至少有一个从节点可用。
3. 哨兵监控
哨兵通过监控主节点和从节点的状态,决定是否需要进行故障转移。
a. 从库为主
解释:当主节点下线时,哨兵会从现有的从节点中选择一个新的主节点,确保系统的持续可用。
b. 故障转移
步骤:
- 检测故障:多个哨兵实例通过心跳机制检测到主节点故障。
- 达成一致:通过投票机制,确认主节点确实发生故障。
- 选举新主:从可用的从节点中选举一个新的主节点。
- 更新配置:通知所有从节点指向新的主节点,并通知客户端更新主节点信息。
- 恢复旧主:待故障主节点恢复后,将其配置为新的从节点,重新加入复制链条。
4. 连锁转换节点
定义:哨兵在故障转移过程中,负责管理节点之间的关系,确保复制链条的完整性和数据的一致性。
功能:
- 协调节点:协调主从节点之间的转换,确保新主节点能够顺利接管主节点的角色。
- 通知客户端:通过发布订阅机制,通知客户端更新主节点信息,保证客户端能够连接到新的主节点。
5. 如何使用
a. 获取主节点地址,并连接
步骤:
- 配置哨兵:在哨兵配置文件中指定主节点的地址和端口,以及需要监控的主节点名称。
- 启动哨兵:启动多个哨兵实例,分散在不同的服务器上,避免单点故障。
- 连接主节点:哨兵实例通过配置文件连接到主节点,开始监控其状态。
b. 龙卷风监控 / 监听模式
解释:当原主节点失去响应后,哨兵进入监听模式,实时监控主节点的状态变化,并准备进行故障转移。
操作:
- 实时监控:哨兵持续监控主节点的心跳信号,检测主节点是否在线。
- 触发故障转移:当检测到主节点失联时,哨兵触发故障转移流程,选举新的主节点。
6. 缺点
尽管哨兵模式提供了高可用性,但也存在一些缺点和限制。
a. 没有预设数据交互机制
解释:哨兵模式主要负责监控和故障转移,缺乏数据同步和交互的高级机制,无法保证在故障转移过程中数据的实时同步。
影响:
- 数据一致性:在故障转移过程中,可能会存在短暂的数据不一致情况。
- 复杂性增加:需要配合其他机制(如复制链条)确保数据的一致性。
b. 没有高效的"票机制"
解释:"票机制"指的是在选举和决策过程中,通过投票方式达成一致的机制。哨兵模式中的投票机制相对简单,缺乏高效的决策流程。
影响:
- 决策效率:在高负载或网络波动情况下,哨兵的决策效率可能下降。
- 一致性问题:在多个哨兵实例之间,可能会出现决策不一致的情况,影响故障转移的可靠性。
7. 几个步骤
a. 去中心化
定义:哨兵模式采用去中心化的架构,不依赖单一的控制中心,多个哨兵实例共同监控和管理主从节点。
优点:
- 高可靠性:避免单点故障,提高系统的可靠性。
- 分布式管理:多个哨兵实例可以协同工作,提升监控和故障转移的效率。
b. 主节点对称
解释:哨兵模式中,主节点和从节点的角色对称化管理,确保每个节点的状态都能被准确监控和管理。
优点:
- 灵活性:主节点和从节点可以动态切换角色,适应不同的业务需求。
- 负载均衡:通过对称化管理,可以实现主节点和从节点之间的负载均衡,提高系统性能。
c. 解决了数据广播
解释:哨兵模式通过哨兵实例之间的协调,避免了数据广播带来的性能问题和复杂性。
优点:
- 高效性:减少不必要的数据广播,提高系统的整体性能。
- 稳定性:通过协调机制,确保数据广播的稳定性和可靠性。
8. 特性
a. 客户端自动保持缓存位置,以服务为准,待节点异常后主机广播分配给节点ID
解释:客户端在连接到 Redis 集群时,会自动缓存主节点的位置。当主节点发生故障时,哨兵会广播新的主节点信息,客户端自动更新连接信息,确保服务的连续性。
优点:
- 高可用性:客户端能够自动感知主节点的变化,保证服务的持续性。
- 简便性:无需手动干预,客户端自动完成连接切换,简化运维工作。
b. 可人力效应迁移
解释:在某些情况下,故障转移可能需要人工干预,例如在自动故障转移失败时,运维人员可以手动进行节点迁移和管理。
优点:
- 灵活性:在自动机制失效时,仍然可以通过人工操作确保系统的高可用性。
- 控制力:运维人员可以根据具体情况,灵活调整节点的角色和配置,优化系统性能。
三、集群模式 (Cluster)
Redis Cluster 是 Redis 提供的一种分布式解决方案,支持数据分片、故障转移和高可用性,适用于大规模数据和高并发访问的场景。
1. 将集群内托管在一个节点
解释:在 Redis Cluster 中,数据被分片存储在多个节点上,每个节点负责一部分数据的存储和管理。
优点:
- 数据分片:通过分片机制,支持存储海量数据,扩展性强。
- 负载均衡:数据分布在多个节点上,实现读写负载的均衡,提高系统吞吐量。
2. 客户端不在线节点,将初始化找回的命令、鼠标拖拽到节点
说明:此部分可能存在翻译或表达上的问题。应理解为:客户端在访问集群时,如果某个节点不可用,会自动重新定位数据所在的节点,确保数据访问的连续性。
实现:
- 智能路由:客户端通过集群协议,能够自动发现数据所在的节点,进行请求的路由和转发。
- 故障恢复:当某个节点下线时,集群能够自动进行故障转移,保证数据的可访问性。
3. 流程
Redis Cluster 的工作流程包括数据分片、故障转移和节点管理等步骤。
a. 推动节点响应主机传递的数据交换
解释:集群中的每个节点负责接收和处理来自客户端的请求,并与其他节点进行数据交换,确保数据的一致性和完整性。
步骤:
- 请求处理:客户端发送请求到集群中的任意节点。
- 数据路由:节点根据数据分片规则,将请求转发到负责该数据的节点。
- 数据交换:节点之间通过内部通信协议,进行数据的同步和交换,确保数据的分布和一致性。
b. 故障转移(主节点下线)
步骤:
- 检测故障:集群中的节点通过心跳机制,检测到某个主节点下线。
- 选举新主:集群中的其他主节点会选举一个从节点提升为新的主节点。
- 数据迁移:将原主节点的数据迁移到新主节点,确保数据的完整性和可访问性。
- 更新配置:通知客户端和其他节点,更新新的主节点信息,确保后续请求的正确路由。
c. 由下线主节点的副本传入数据,交给节点中的负载库作为主节点
解释:在主节点下线后,其从节点将被提升为新的主节点,承担主节点的角色,继续提供数据服务。
步骤:
- 提升从节点:选举出新的主节点,从原主节点的从节点中选择一个最优的从节点进行提升。
- 数据同步:确保新主节点的数据与其他从节点保持一致,避免数据丢失。
- 负载转移:新主节点开始承担主节点的写操作,其他节点继续作为从节点进行数据同步。
d. 从布置点下线主节点的副本信息供用,拷贝需接受的负载库状态作为节点
解释:在故障转移过程中,集群需要确保新主节点的数据状态正确,并通知其他节点进行同步和数据迁移。
步骤:
- 状态同步:新主节点与其他从节点同步数据状态,确保数据一致性。
- 通知更新:集群中的所有节点更新新的主节点信息,确保数据请求能够正确路由。
- 负载分配:根据新的数据分片规则,重新分配数据负载,优化系统性能。
e. 备用节点接入副信息传送
解释:在故障转移完成后,备用节点(从节点)继续复制新主节点的数据,确保集群的高可用性和数据冗余。
步骤:
- 重新配置:备用节点重新配置为新的从节点,连接到新的主节点。
- 数据同步:备用节点从新的主节点拉取数据,保持数据的一致性。
- 监控与维护:继续监控备用节点的状态,确保系统的稳定性和高可用性。
4. 缺点
尽管 Redis Cluster 提供了强大的分布式和高可用性功能,但也存在一些缺点和挑战。
a. 因为主从采用同步分离库所以到存储数据尽量大防的端
解释:由于 Redis Cluster 中主从节点采用同步复制机制,数据分片和存储需要尽量避免单个节点的数据量过大,以防止同步过程中的性能瓶颈和数据不一致。
影响:
- 数据分布不均:如果某个分片的数据量过大,可能导致该节点的性能瓶颈,影响整个集群的性能。
- 同步开销:大数据量的同步过程会增加网络带宽和磁盘 I/O 的负载,影响系统的整体性能。
5. 问题
a. 多次错误响应,解决后确认,频率分段,自动解决计算
解释:在集群运行过程中,可能会遇到多次错误响应,如节点不可用、数据同步失败等。Redis Cluster 需要具备自动检测和修复这些问题的能力。
解决方法:
- 错误检测:通过心跳机制和错误日志,实时检测集群中的异常状态。
- 自动修复:在检测到问题后,自动进行故障转移、数据迁移等修复操作,恢复集群的正常运行。
- 频率控制:控制故障检测和修复的频率,避免过于频繁的操作影响系统稳定性。
6. 特性
Redis Cluster 拥有以下主要特性,确保其在分布式环境中的高效运行和高可用性。
a. 数据分化
定义:通过分片机制,将数据分布在多个节点上,实现数据的水平扩展。
优点:
- 扩展性强:支持大规模数据存储,满足高并发访问需求。
- 负载均衡:数据分布在多个节点上,实现读写负载的均衡,提升系统性能。
b. 有容有性
定义:集群具备容错能力,能够在部分节点故障的情况下继续提供服务。
优点:
- 高可靠性:部分节点故障不会影响整个集群的可用性,确保系统的持续运行。
- 数据冗余:通过主从复制,保证数据的冗余备份,防止数据丢失。
c. 高可靠
定义:通过故障转移和数据复制机制,确保数据的可靠存储和高可用性。
优点:
- 数据安全:多副本存储,防止单点故障导致的数据丢失。
- 持续可用:自动故障转移机制,保证服务的持续可用性。
d. 动态扩容性
定义:支持动态添加和移除节点,实现在线扩容和缩容。
优点:
- 灵活性高:根据业务需求,随时调整集群规模,适应流量变化。
- 最小化停机:在线扩容和缩容,避免系统停机,保证业务连续性。
e. 生产调整
定义:支持在生产环境中对集群进行实时调整和优化,提升系统性能和稳定性。
优点:
- 实时监控:通过监控工具,实时了解集群状态,及时发现和解决问题。
- 优化能力:根据业务需求,调整数据分片、节点配置等,优化系统性能。
f. 实际需要 Cluster 模式或高可用以及常规管理
解释:在实际应用中,是否采用 Cluster 模式取决于业务需求和系统规模。
适用场景:
- 大规模数据和高并发访问:需要 Redis Cluster 提供的数据分片和高可用性。
- 高可用性需求:需要通过主从复制和故障转移机制,确保系统的持续可用性。
- 常规管理:需要简化集群管理和运维,提高系统的可维护性。
四、分布式延时队列
分布式延时队列是一种基于 Redis 实现的高效任务调度机制,适用于需要定时执行的任务和延时处理的场景。
1. 数据变化化
解释:任务在延时队列中的状态随着时间的推移而变化,从未处理状态逐渐转变为待处理状态,最终被执行。
实现:
- 任务状态管理:通过 Redis 的数据结构,管理任务的不同状态,确保任务按时执行。
- 状态转移:任务在队列中的状态变化由系统自动触发,确保任务按计划执行。
2. 有存存有
解释:延时队列中的任务被可靠地存储,防止任务丢失,确保任务的高可靠性。
实现:
- 持久化存储:通过 Redis 的持久化机制(RDB、AOF)保存队列中的任务,防止数据丢失。
- 数据备份:通过主从复制和集群模式,实现任务数据的冗余备份,提高系统的可靠性。
3. 高可靠
解释:分布式延时队列具备高可靠性,确保任务的准确执行和系统的稳定运行。
实现:
- 任务确认机制:任务执行后进行确认,确保任务不会重复执行或遗漏执行。
- 失败重试机制:任务执行失败时,自动进行重试,确保任务最终执行成功。
4. 动态分配性
解释:延时队列能够根据系统负载和资源情况,动态分配任务到不同的消费者,提高系统的吞吐量和资源利用率。
实现:
- 任务分片:将任务分配到不同的消费者,避免单个消费者的负载过高。
- 负载均衡:根据消费者的处理能力,动态调整任务的分配,确保系统的高效运行。
5. 生产性调整
解释:系统能够根据业务需求和负载变化,实时调整延时队列的配置和参数,优化任务处理效率。
实现:
- 动态配置:根据系统负载,实时调整队列的参数,如任务的优先级、处理速度等。
- 实时监控:通过监控工具,实时了解队列的运行状态,及时进行优化调整。
6. 实现
分布式延时队列通常使用 Redis 的有序集合(ZSet)来存储和管理延时任务。
a. 使用 ZSet 存储延时任务
原理:通过 Redis 的有序集合,将任务的执行时间作为分数(score),任务标识作为成员(member),实现任务的按时排序和管理。
步骤:
- 构建多个 ZSet:为不同的任务类型或消费者构建多个有序集合,每个 ZSet 负责存储特定类型的延时任务。
- 每个 ZSet 对应一个消费者:每个消费者负责处理一个或多个 ZSet 中的任务,确保任务的均衡处理。
- 生产者推送到某个 ZSet 中生产延时:生产者根据任务类型或负载情况,将任务添加到相应的 ZSet 中,并设置任务的执行时间。
b. 每个子节点多个键——分组处理
解释:通过将任务分组到不同的键中,实现任务的分布式处理和高效管理。
实现:
- 任务分组:根据任务类型或优先级,将任务分组到不同的 ZSet 中,方便不同消费者进行分组处理。
- 并行处理:多个消费者并行处理不同的 ZSet,提高任务处理的吞吐量和系统的整体性能。
示例:
假设有多个任务类型,如邮件发送、短信发送和数据处理,可以为每种任务类型创建一个 ZSet:
ZADD email_queue 1672531199 "email_task_1"
ZADD sms_queue 1672531199 "sms_task_1"
ZADD data_processing_queue 1672531199 "data_task_1"
消费者分别监听并处理各自的队列:
# 处理邮件任务的消费者
ZREM email_queue "email_task_1"# 处理短信任务的消费者
ZREM sms_queue "sms_task_1"# 处理数据任务的消费者
ZREM data_processing_queue "data_task_1"
五、总结
本文详细介绍了 Redis 的主从复制、哨兵模式、集群模式以及分布式延时队列的原理、实现、优缺点及应用场景。这些机制共同构建了 Redis 高性能、高可用和高可靠性的基础,适用于各种复杂的业务场景。通过合理配置和优化这些机制,用户可以充分发挥 Redis 的优势,保障系统的稳定运行和数据的可靠性。
关键要点
- 主从复制:实现数据冗余和高可用性,通过同步复制确保数据一致性。
- 哨兵模式:提供自动故障转移和监控功能,确保系统的持续可用性。
- 集群模式:支持数据分片和动态扩展,适用于大规模数据和高并发访问的场景。
- 分布式延时队列:实现高效的任务调度和延时处理,适用于需要定时执行的任务。
应用建议
- 选择合适的复制机制:根据业务需求和系统规模,选择主从复制、哨兵模式或集群模式,确保数据的高可用性和系统的稳定性。
- 优化延时队列:通过合理配置 ZSet 和消费者,提升延时任务的处理效率和系统的整体性能。
- 监控与维护:通过监控工具,实时了解系统的运行状态,及时发现和解决问题,确保 Redis 系统的高效运行。
通过深入理解和合理应用 Redis 的这些高级功能,可以有效提升系统的性能、可靠性和可扩展性,满足各种复杂业务场景的需求。
参考
0voice · GitHub
相关文章:

Redis 高可用:从主从到集群的全面解析
目录 一、主从复制 (基础)1. 同步复制a. 全量数据同步b. 增量数据同步c. 可能带来的数据不一致 2. 环形缓冲区a. 动态调整槽位 3. runid4. 主从复制解决单点故障a. 单点故障b. 可用性问题 5. 注意事项a. Replica 主动向 Master 建立连接b. Replica 主动向 Master 拉取数据 二、…...

全能型选手视频播放器VLC 3.0.21 for Windows 64 bits支持Windows、Mac OS等供大家学习参考
全能型选手视频播放器,支持Windows、Mac OS、Linux、Android、iOS等系统,也支持播放几乎所有主流视频格式。 推荐指数: ★★★★★ 优点: ◆、界面干净简洁,播放流畅 ◆、支持打开绝大多数的文件格式,包…...

解决在Vue3中使用monaco-editor创建多个实例的导致页面卡死的问题
最近在项目中使用到了monaco-editor来实现相关的业务功能,按照官方使用方法进行了相关操作,但是在使用的时候,总是会导致创建多个编辑器实例,导致页面卡死的情况,下面来看看怎么处理这种情况吧,先说一下我使…...

【某农业大学计算机网络实验报告】实验二 交换机的自学习算法
实验目的: (1)理解交换机通过逆向自学习算法建立地址转发表的过程。 (2)理解交换机转发数据帧的规则。 (3)理解交换机的工作原理。 实验器材: 一台Windows操作系统的PC机。 实…...

燕山大学23级经济管理学院 10.18 C语言作业
燕山大学23级经济管理学院 10.18 C语言作业 文章目录 燕山大学23级经济管理学院 10.18 C语言作业1C语言的基本数据类型主要包括以下几种:为什么设计数据类型?数据类型与知识体系的对应使用数据类型时需要考虑的因素 21. 逻辑运算符2. 真值表3. 硬件实现4…...

【880线代】线性代数一刷错题整理
第一章 行列式 2024.8.20日 1. 2. 3. 第二章 矩阵 2024.8.23日 1. 2024.8.26日 1. 2. 3. 4. 5. 2024.8.28日 1. 2. 3. 4. 第四章 线性方程组 2024.9.13日 1. 2. 3. 4. 5. 2024.9.14日 1. 第五章 相似矩阵 2024.9.14日 1. 2024.9.15日 1. 2. 3. 4. 5. 6. 7. 2024.9.…...

【C++语言】精妙的哈希算法:原理、实现与优化
解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 哈希算法是计算机科学中的一项基本技术,广泛应用于数据检索、加密、缓存等领域。本文将深入探讨C++中的哈希算法,详细讲解其原理、实现、优化以及在不同应用场景中的使用。通过丰富的代码示例和数学推导,本文旨…...

基于STM32的手势电视机遥控器设计
引言 本项目设计了一个基于STM32的手势电视机遥控器,利用红外线传输和加速度传感器(或陀螺仪)检测用户的手势动作,用于控制电视的音量、频道切换等操作。通过对手势的实时检测和分类,系统能够识别左右、上下、旋转等手…...

2、图像的特征
一、角点检测-Harris 1、cv2.cornerHarris角点检测函数 在 cv2.cornerHarris 函数中,Sobel 算子用于计算图像的梯度,这是 Harris 角点检测的第一步。 cv2.cornerHarris(src, blockSize, ksize, k, dstNone, borderTypeNone)下面是各个参数的详细解释&…...

URL、URN和URI的区别
目录 一:URI二:URN三:URL1. URL格式 一:URI URI 是(Uniform Resource Identifier)统一资源标识符的缩写。用于唯一标识互联网上的资源。URI包含了URN和URL 二:URN URN是(Uniform …...

深入理解Spring框架几个重要扩展接口
本文介绍Spring框架的几个日常开发重要扩展接口,方便日常项目中按需扩展使用。 一、Processor 系列接口 用途: Processor 系列接口包括 BeanPostProcessor 和 BeanFactoryPostProcessor,它们的设计目的是在 Spring 容器启动过程中对 Bean 和…...

使用dotnet-counters和dotnet-dump 分析.NET Core 项目内存占用问题
在.NET Core 项目部署后,我们往往会遇到内存占用越来越高的问题,但是由于项目部署在Linux上,因此无法使用VS的远程调试工具来排查内存占用问题。那么这篇文章我们大家一起来学习一下如何排查内存占用问题。 首先,我们来看一下应用…...

1282:最大子矩阵
题目: 已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1 1)子矩阵。 比如,如下4 4的矩阵 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 的最大子矩阵是 9 2 -4 1 -1 8 这个子矩阵的大小是15。 …...

C++编程语言:抽象机制:特殊运算符(Bjarne Stroustrup)
第19章 特殊运算符(Special Operators) 目录 19.1 引言 19.2 特殊运算符(Special Operators) 19.2.1 下标运算符(Subscripting) 19.2.2 函数调用运算符(Function Call) 19.2.3 解引用(Dereferencing) 19.2.4 递增和递减(Increment and Decrement) 19…...

图片无损放大工具Topaz Gigapixel AI v7.4.4 绿色版
Topaz A.I. Gigapixel是这款功能齐全的图象无损变大运用,应用可将智能机拍摄的图象也可以有着专业相机的高质量大尺寸作用。你可以完美地放大你的小照片并大规模打印,它根本不会粘贴。它具有清晰的效果和完美的品质。 借助AIGigapixel,您可以…...

Vue中计算属性computed—(详解计算属性vs方法Methods,包括案例+代码)
文章目录 计算属性computed3.1 概述3.2 使用3.3 计算属性vs方法Methods3.4 计算属性的完整写法 计算属性computed 3.1 概述 基于现有的数据,计算出来的新属性。 依赖的数据变化,自动重新计算 语法: 声明在 computed 配置项中,…...

Python程序设计 内置函数 日志模块
logging(日志) 日志记录是程序员工具箱中非常有用的工具。它可以帮助您更好地理解程序的流程,并发现您在开发过程中可能没有想到的场景。 日志为开发人员提供了额外的一组眼睛,这些眼睛不断关注应用程序正在经历的流程。它们可以存储信息,例…...

中标麒麟v5安装qt512.12开发软件
注意 需要联网操作 遇到问题1:yum提示没有可用软件包问题 终端执行如下命令 CentOS7将yum源更换为国内源保姆级教程 中标麒麟V7-yum源的更换(阿里云源) wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Cento…...

每日算法一练:剑指offer——数组篇(3)
1.报数 实现一个十进制数字报数程序,请按照数字从小到大的顺序返回一个整数数列,该数列从数字 1 开始,到最大的正整数 cnt 位数字结束。 示例 1: 输入:cnt 2 输出:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,1…...

Java代码说明设计模式
以下是使用 Java 代码分别说明设计模式中的工厂模式、抽象工厂模式(这里推测你可能想说的是抽象工厂模式而非虚拟工厂模式)、建造者模式和观察者模式。 一、工厂模式 工厂模式是一种创建对象的设计模式,它提供了一种创建对象的方式…...

Golang笔记_day06
一、GMP 调度器 1、调度器理解思路 理解golang的调度器要从进程到协程演进来说明: 进程--->线程--->协程---> golang的协程(goroutine) 从上图可以看出,进程到多线程到协程,最终目的就是为了提高CPU的利用率…...

「从零开始的 Vue 3 系列」:第十一章——跨域问题解决方案全解析
前言 本系列将从零开始,系统性地介绍 Vue 3 的常用 API,逐步深入每个核心概念与功能模块。通过详尽的讲解与实战演示,帮助大家掌握 Vue 3 的基础与进阶知识,最终具备独立搭建完整 Vue 3 项目的能力。 第十一章:跨域问…...

C语言结构体数组 java静动数组及问题
1. (1)先声明,后定义:如上一天 //(2).声明时直接定义 #define N 5 typedef struct student { int num; int score; }STU; int main(void) { STU class3[N] { {10,90},{14,70},{8,95} }; …...

uniapp项目结构基本了解
基本结构的解释 App.vue:应用的根组件,定义全局布局和逻辑。pages/:存放各个页面的 .vue 文件,定义应用的具体页面和功能模块。main.js:应用入口文件,初始化应用,挂载 App.vue。manifest.json&…...

常见Web知识1
List item 常见Web知识1 JSON: JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人类阅读和编写,同时也易于机器解析和生成。它通常用于客户端和服务器之间的数据传输。 JSON 结构 JSON 主要由两…...

新版idea菜单栏展开与合并
新版idea把菜单栏合并了看着很是不习惯,找了半天原来在这里展开 ① 点击文件 -> 设置 ② 点击外观与行为 -> 外观 -> 合并主菜单和窗口标题 然后确定,重启即可...

聊聊Go语言的异常处理机制
背景 最近因为遇到了一个panic问题,加上之前零零散散看了些关于程序异常处理相关的东西,对这块有点兴趣,于是整理了一下golang对于异常处理的机制。 名词介绍 Painc golang的内置方法,能够改变程序的控制流。 当函数调用了pan…...

复习:如何理解 React 中的 fiber
React 中的 Fiber 可以理解为 React 16 引入的一种新的协调(reconciliation)引擎,旨在提高 React 应用的性能和响应性。以下是对 React Fiber 的详细解释: 一、Fiber 的定义与背景 Fiber 是对 React 核心算法的一次重新实现,它将渲染工作分解成一系列小的任务单元,这些任…...

10分钟了解腾讯云混元大模型AIGC系列产品
前言 其实说到AIGC,作为开发者,大家其实已经见怪不怪了,那么AIGC是什么,这里我再简单科普一下。 AIGC的全称是Artificial Intelligence Generated Content (人工智能生成内容)或者说叫生成式人工智能&…...

Unity发送Http
本篇实现在Unity中发送Http请求。 讲解Get,Post,用于在Unity中进行数据对接。 一、Get IEnumerator Get() {string url "";//链接UnityWebRequest request UnityWebRequest.Get(url);//创建UnityWebRequest实例并设置请求方式为Getyield …...