Redis 高可用:从主从到集群的全面解析

news2024/11/30 10:29:20

目录

    • 一、主从复制 (基础)
      • 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. 全量数据同步

在这里插入图片描述

原理:当从节点首次连接到主节点,或者在某些情况下(如主从断开连接后重新连接),需要从主节点获取完整的数据集。这一过程称为全量数据同步。

步骤

  1. 从节点发送 SYNC 命令给主节点,表示希望进行数据同步。
  2. 主节点接收到 SYNC 命令后,创建一个子进程(使用 fork()),子进程负责生成 RDB 快照文件。
  3. 子进程将 RDB 文件发送给从节点,从节点接收并加载数据,确保与主节点的数据一致。
  4. 全量同步完成后,主节点和从节点进入增量同步阶段,继续传输主节点的新写命令。

优缺点

  • 优点
    • 保证从节点与主节点数据的一致性。
    • 简单可靠,适用于初始同步和主从重连场景。
  • 缺点
    • 全量同步需要传输大量数据,可能导致网络带宽占用高。
    • 在数据量大的情况下,同步过程耗时较长,影响系统性能。
b. 增量数据同步

在这里插入图片描述

原理:在全量同步完成后,主节点将接收到的所有写命令实时传输给从节点,确保从节点数据的实时更新。这一过程称为增量数据同步。

步骤

  1. 主节点将所有新的写命令通过发布/订阅机制(Pub/Sub)实时发送给从节点。
  2. 从节点接收到命令后,按照顺序执行这些命令,保持数据一致性。

优缺点

  • 优点
    • 实时性强,确保从节点数据与主节点同步。
    • 增量同步的开销相对较小,仅传输变化的数据。
  • 缺点
    • 在高并发环境下,主节点需要处理大量的命令传输,可能影响性能。
    • 如果增量同步过程中出现网络延迟或中断,可能导致数据不一致。
c. 可能带来的数据不一致

尽管主从复制旨在保持数据一致性,但在某些情况下,可能会出现数据不一致的问题。

原因

  1. 网络延迟或中断:主从之间的网络问题可能导致部分命令未能及时传输,导致数据不同步。
  2. 主节点故障:在主节点发生故障之前,未完成的命令可能未能传输到从节点,导致数据丢失。
  3. 从节点故障恢复:从节点在故障恢复过程中,如果没有正确执行全量和增量同步,可能导致数据不一致。

解决方法

  • 监控与报警:通过 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. 故障转移

步骤

  1. 检测故障:多个哨兵实例通过心跳机制检测到主节点故障。
  2. 达成一致:通过投票机制,确认主节点确实发生故障。
  3. 选举新主:从可用的从节点中选举一个新的主节点。
  4. 更新配置:通知所有从节点指向新的主节点,并通知客户端更新主节点信息。
  5. 恢复旧主:待故障主节点恢复后,将其配置为新的从节点,重新加入复制链条。

4. 连锁转换节点

定义:哨兵在故障转移过程中,负责管理节点之间的关系,确保复制链条的完整性和数据的一致性。

功能

  • 协调节点:协调主从节点之间的转换,确保新主节点能够顺利接管主节点的角色。
  • 通知客户端:通过发布订阅机制,通知客户端更新主节点信息,保证客户端能够连接到新的主节点。

5. 如何使用

a. 获取主节点地址,并连接

步骤

  1. 配置哨兵:在哨兵配置文件中指定主节点的地址和端口,以及需要监控的主节点名称。
  2. 启动哨兵:启动多个哨兵实例,分散在不同的服务器上,避免单点故障。
  3. 连接主节点:哨兵实例通过配置文件连接到主节点,开始监控其状态。
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. 推动节点响应主机传递的数据交换

解释:集群中的每个节点负责接收和处理来自客户端的请求,并与其他节点进行数据交换,确保数据的一致性和完整性。

步骤

  1. 请求处理:客户端发送请求到集群中的任意节点。
  2. 数据路由:节点根据数据分片规则,将请求转发到负责该数据的节点。
  3. 数据交换:节点之间通过内部通信协议,进行数据的同步和交换,确保数据的分布和一致性。
b. 故障转移(主节点下线)

步骤

  1. 检测故障:集群中的节点通过心跳机制,检测到某个主节点下线。
  2. 选举新主:集群中的其他主节点会选举一个从节点提升为新的主节点。
  3. 数据迁移:将原主节点的数据迁移到新主节点,确保数据的完整性和可访问性。
  4. 更新配置:通知客户端和其他节点,更新新的主节点信息,确保后续请求的正确路由。
c. 由下线主节点的副本传入数据,交给节点中的负载库作为主节点

解释:在主节点下线后,其从节点将被提升为新的主节点,承担主节点的角色,继续提供数据服务。

步骤

  1. 提升从节点:选举出新的主节点,从原主节点的从节点中选择一个最优的从节点进行提升。
  2. 数据同步:确保新主节点的数据与其他从节点保持一致,避免数据丢失。
  3. 负载转移:新主节点开始承担主节点的写操作,其他节点继续作为从节点进行数据同步。
d. 从布置点下线主节点的副本信息供用,拷贝需接受的负载库状态作为节点

解释:在故障转移过程中,集群需要确保新主节点的数据状态正确,并通知其他节点进行同步和数据迁移。

步骤

  1. 状态同步:新主节点与其他从节点同步数据状态,确保数据一致性。
  2. 通知更新:集群中的所有节点更新新的主节点信息,确保数据请求能够正确路由。
  3. 负载分配:根据新的数据分片规则,重新分配数据负载,优化系统性能。
e. 备用节点接入副信息传送

解释:在故障转移完成后,备用节点(从节点)继续复制新主节点的数据,确保集群的高可用性和数据冗余。

步骤

  1. 重新配置:备用节点重新配置为新的从节点,连接到新的主节点。
  2. 数据同步:备用节点从新的主节点拉取数据,保持数据的一致性。
  3. 监控与维护:继续监控备用节点的状态,确保系统的稳定性和高可用性。

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),实现任务的按时排序和管理。

步骤

  1. 构建多个 ZSet:为不同的任务类型或消费者构建多个有序集合,每个 ZSet 负责存储特定类型的延时任务。
  2. 每个 ZSet 对应一个消费者:每个消费者负责处理一个或多个 ZSet 中的任务,确保任务的均衡处理。
  3. 生产者推送到某个 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

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

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

相关文章

腾讯云宝塔面板前后端项目发版

后端发版 1. 打开“网站”页面,找到java项目,点击状态暂停服务 2.打开“文件”页面,进入jar包目录,删除原有的jar包,上传新jar包 3. 再回到第一步中的网站页面,找到jar项目,启动项目即可 前端发…

C#的小数位保留以及四舍五入

C#使用Math.Round("数值","保留位","保留方式")进行小数位保留以及四舍五入 //1.MidpointRounding.ToEven(四舍六入五成双) //当保留小数位后一位为0~4时,舍去末位 var x1 Math.Round(1.124, 2, MidpointRo…

立仪科技:光谱共焦传感器精准测量玻璃

光谱共焦测量技术作为一种创新的光学检测方法,近年来在工业领域引起了广泛关注。 它以其高精度、非接触式的特点,特别适用于透明或半透明材料如玻璃的厚度和表面形貌测量。 接下来,立仪科技小编将深入探讨光谱共焦技术在玻璃测量上的应用及其…

计算机毕业设计Hadoop+Hive+Spark+Flink广告推荐系统 广告预测 广告数据分析可视化 广告爬虫 大数据毕业设计 深度学习 机器学习

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 专业 小四号宋体 班级 小…

飞机大战告尾

参考 PPO算法逐行代码详解 链接 通过网盘分享的文件:PlaneWar 链接: https://pan.baidu.com/s/1cbLKTcBxL6Aem3WkyDtPzg?pwd1234 提取码: 1234 10.17关于博客发了又改这件事 悲催的事 今天训练了一早上ppo模型,满怀期待的检测成果时发现一点长进都…

mac安装brew时踩坑解决方案

安装包 mac上如果按照git等工具可能会使用brew,例如使用:$ brew install git命令,如果电脑没有按照brew,则会提示:zsh: command not found: brew 解决方案 需要我们打开brew的官网https://brew.sh/,复制…

动态规划一>下降路径最小和

1.题目&#xff1a; 2.解析&#xff1a; 代码&#xff1a; /**1.创建dp表2.初始化3.填表4.返回值*/public int minFallingPathSum(int[][] matrix) {int n matrix.length;int[][] dp new int[n1][n2];int minNum Integer.MAX_VALUE; for(int i 1; i < n; i) dp[i][0]…

【CSS】纯CSS Loading动画组件

<template><div class"ai-loader-box"><!-- AI loader --><div class"ai-loader"><div class"text"><p>AI智能分析中....</p></div><div class"horizontal"><div class&quo…

简单说说 spring是如何实现AOP的(源码分析)

在spring生命周期流程中&#xff0c;有一个过程是执行BeanPostProcessor的后置方法 BeanPostProcessor 是一个接口&#xff0c;其实现有 aop实现的核心类是AbstractAutoProxyCreator&#xff0c;其位于spring-aop包下&#xff0c;实现了BeanPostProcessor //BeanPostProcesso…

【Java小白图文教程】-04-分支结构

本套课程将会从0基础讲解Java语言核心技术&#xff0c;适合人群&#xff1a; 大学中开设了Java语言课程的同学想要专升本或者考研的同学想要考计算机等级证书的同学想要从事Java相关开发开发的同学 精品专题&#xff1a; 01.《C语言从不挂科到高绩点》课程详细笔记 https:/…

transformers 推理 Qwen2.5 等大模型技术细节详解(一)transformers 初始化和对象加载(文末免费送书)

上周收到一位网友的私信&#xff0c;希望老牛同学写一篇有关使用 transformers 框架推理大模型的技术细节的文章。 老牛同学刚开始以为这类的文章网上应该会有很多&#xff0c;于是想着百度几篇质量稍高一点的回复这位网友。结果&#xff0c;老牛同学搜索后发现&#xff0c;类…

力扣61~65题

题61&#xff08;中等&#xff09;&#xff1a; 分析&#xff1a; python代码&#xff1a; # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next next class Solution:def rot…

【含开题报告+文档+PPT+源码】基于SpringBoot电脑DIY装机教程网站的设计与实现

开题报告 随着科技的发展和人们对电脑需求的增加&#xff0c;越来越多的人开始自己组装电脑。然而&#xff0c;针对初学者来说&#xff0c;如何选择合适的硬件配置并进行装机是一个相对复杂的过程。随着各种品牌、型号和规格的硬件不断增多&#xff0c;用户需要一个方便快捷的…

Java项目编译不通过,IDEA无法运行或调试Unit test类

mvn test可以通过&#xff0c;但是通过IDEA无法运行或调试&#xff0c;总是弹出一些依赖错误比如&#xff1a; 程序包xxx.xxx.xxx 不存在或找不到符号 解决办法 步骤1&#xff1a;IDEA 打开 File -> Setting ->Compiler &#xff0c;找到“Automatically show first …

20 Shell Script输入与输出

标出输入、标准输出、错误输出 一、程序的基本三个IO流 一&#xff09;文件描述符 ​ 任何程序在Linux系统中都有3个基本的文件描述符 ​ 比如: ​ cd/proc/$$/fd ​ 进入当前shell程序对于内核在文件系统的映射目录中: [rootlocalhost ~]# cd /proc/$$/fd [rootlocalhos…

基于System.js的微前端实现(插件化)

目录​​​​​​​ 写在前面 一、微前端相关知识 &#xff08;一&#xff09;概念 &#xff08;二&#xff09; 优势 &#xff08;三&#xff09; 缺点 &#xff08;四&#xff09;应用场景 &#xff08;五&#xff09;现有框架 1. qiankun 2. single-spa 3. SystemJ…

【MR开发】在Pico设备上接入MRTK3(一)——在Unity工程中导入MRTK3依赖

写在前面的话 在Pico上接入MRTK3&#xff0c;目前已有大佬开源。 https://github.com/Phantomxm2021/PicoMRTK3 也有值得推荐的文章。 MRTK3在PICO4上的使用小结 但由于在MacOS上使用MRTK3&#xff0c;无法通过Mixed Reality Feature Tool工具管理MRTK3安装包。 故记录一下…

Dockerr安装Oracle以及使用DBeaver连接

拉取镜像 pull container-registry.oracle.com/database/free:latest 创建容器 说明一下我现在的最新版本是23 docker run -d --name oracle23i -h xrilang -p 1521:1521 container-registry.oracle.com/database/free:latest 查看日志 docker logs oracle23i 设置密码 因为创建…

登录时用户名密码加密传输(包含前后端代码)

页面输入用户名密码登录过程中&#xff0c;如果没有对用户名密码进行加密处理&#xff0c;可能会导致传输过程中数据被窃取&#xff0c;就算使用https协议&#xff0c;在浏览器控制台的Request Payload中也是能直接看到传输的明文&#xff0c;安全感是否还是不足。 大致流程&a…

第二百八十八节 JPA教程 - JPA查询连接OrderBy示例

JPA教程 - JPA查询连接OrderBy示例 以下代码显示如何使用ORDER BY子句和连接条件。 List l em.createQuery("SELECT e " "FROM Project p JOIN p.employees e " "WHERE p.name :project " "ORDER BY e.name").setParameter("pr…