当前位置: 首页 > news >正文

架构实践02-高性能架构模式

零、文章目录

架构实践02-高性能架构模式

1、 高性能数据库集群:读写分离

(1)引言
  • 背景:随着业务的发展和数据的增长,单个数据库服务器难以满足需求,必须考虑数据库集群。
  • 目的:介绍高性能数据库集群的第一种方式——读写分离。
(2)读写分离原理
  • 基本概念:
    • 主从集群:一主一从或多从。
    • 主从角色:
      • 主机:负责读写操作。
      • 从机:只负责读操作。
  • 数据同步:
    • 复制机制:主机通过复制将数据同步到从机。
    • 存储特性:每台数据库服务器都存储所有业务数据。

(3)设计复杂度
  • 复制延迟:
    • 问题:主从复制延迟可能导致读取不到最新数据。
    • 解决方案:
      • 写操作后的读操作指定发给主机:业务强绑定,对代码侵入较大。
      • 读从机失败后再读一次主机:实现简单,但增加主机读操作压力。
      • 关键业务读写操作全部指向主机:非关键业务采用读写分离。
  • 分配机制:
    • 程序代码封装:
      • 特点:实现简单,可定制化,但每个语言需单独实现。
      • 示例:TDDL(Taobao Distributed Data Layer)。
    • 中间件封装:
      • 特点:复杂度高,支持多种编程语言,但实现难度大。
      • 示例:MySQL Router、Atlas。
(4)读写分离的应用场景
  • 适用场景:
    • 读多写少:如博客、社交媒体等。
    • 单机并发无法支撑:读请求远多于写请求。
    • 业务优化后仍需提升性能:优化慢查询、调整业务逻辑、引入缓存后仍需进一步提升。
  • 不适用场景:
    • 高并发写入:单机写入无法支撑。
    • 缓存能解决问题:缓存可以有效缓解读压力。

2、高性能数据库集群:分库分表

(1)单台数据库服务器的瓶颈
  • 数据量过大:数据量达到千万甚至上亿条时,单台数据库服务器的存储能力和读写性能会成为瓶颈。
  • 索引性能下降:即使有索引,索引文件也会变得很大,影响性能。
  • 备份和恢复时间长:数据文件越大,备份和恢复所需的时间越长。
  • 数据丢失风险高:数据文件越大,极端情况下数据丢失的风险越高。
(2)业务分库
  • 定义:按照业务模块将数据分散到不同的数据库服务器。
  • 优点:
    • 分散存储和访问压力。
  • 缺点:
    • Join操作问题:无法使用 SQL 的 join 查询。
    • 事务问题:无法通过事务统一修改不同数据库中的表。
    • 成本问题:需要更多的服务器和备份资源。

(3)分表
  • 定义:将单表数据拆分成多个表,以提高性能和分散存储压力。
  • 方式:
    • 垂直分表:将表中某些不常用且占大量空间的列拆分出去。
    • 水平分表:将表中的行数据根据某种规则拆分到多个表中。
  • 垂直分表:
    • 适用场景:表中某些列不常用且占用大量空间。
    • 复杂性:表操作数量增加。
  • 水平分表:
    • 适用场景:表行数特别大。
    • 常见路由算法:
      • 范围路由:按有序数据列分段。
      • Hash路由:按某一列的值进行哈希运算。
      • 配置路由:用一张独立的表记录路由信息。
    • 复杂性:
      • 需要增加路由算法。
      • 数据分散在多个表中,join 和 count 操作复杂。
      • 排序操作无法在数据库中完成,需要业务代码或中间件处理。

(4)实现方式
  • 程序代码封装:在业务代码中实现分库分表的逻辑。
  • 中间件封装:使用数据库中间件(如 MyCat)来实现分库分表。
(5)何时引入分库分表
  • 数据库性能不足:当数据库性能不足,且通过硬件优化、索引优化、缓存、读写分离等手段无法解决问题时。
  • 数据量大:单表数据量超过千万或简单查询的单表数据量超过 5000 万时。
  • 业务发展:业务发展迅速,预计未来数据量会快速增长。
(6)其他优化手段
  • 硬件优化:升级服务器硬件,如使用 SSD 替代机械硬盘。
  • 数据库调优:增加索引,调整数据库参数。
  • 引入缓存:使用 Redis 等缓存技术减少数据库压力。
  • 全文检索:使用 Elasticsearch 等全文检索引擎处理复杂查询。

3、高性能 NoSQL

(1)关系数据库的局限性
  • 数据结构存储问题:关系数据库无法直接存储复杂的数据结构,如列表、嵌套对象等。
  • Schema 扩展困难:关系数据库的表结构是强约束的,增加或修改字段需要执行 DDL 语句,可能导致长时间锁表。
  • I/O 效率问题:对大量数据进行统计运算时,关系数据库需要读取整行数据,导致 I/O 开销大。
  • 全文搜索性能低:关系数据库的全文搜索只能使用 like 进行整表扫描,性能低下。
(2)NoSQL 数据库的分类及特点
  • K-V 存储:
    • 特点:存储键值对,支持多种数据结构(如字符串、哈希、列表等)。
    • 典型代表:Redis。
    • 应用场景:缓存、会话管理、排行榜等。
  • 文档数据库:
    • 特点:存储 JSON/BSON 格式的文档,无须预先定义 Schema。
    • 典型代表:MongoDB。
    • 应用场景:电商、游戏等需要灵活存储复杂数据的场景。
  • 列式数据库:
    • 特点:按列存储数据,适合大数据统计和分析。
    • 典型代表:HBase。
    • 应用场景:离线大数据分析、数据仓库等。
  • 全文搜索引擎:
    • 特点:使用倒排索引技术,支持高效的全文搜索。
    • 典型代表:Elasticsearch。
    • 应用场景:搜索引擎、日志分析等。
(3)NoSQL 的优缺点
  • 优点:
    • 灵活性:NoSQL 数据库通常没有固定的 Schema,易于扩展和修改。
    • 性能:在特定场景下(如大数据统计、全文搜索)性能优于关系数据库。
    • 可扩展性:NoSQL 数据库通常支持水平扩展,适合分布式部署。
  • 缺点:
    • 不支持完整 ACID 事务:大多数 NoSQL 数据库不支持完整的 ACID 事务,特别是在多文档或多键操作时。
    • 缺乏标准化:NoSQL 数据库种类繁多,缺乏统一的标准和接口。
    • 复杂查询能力有限:NoSQL 数据库在复杂查询(如多表关联)方面不如关系数据库强大。
(4)关系数据库与 NoSQL 的互补关系
  • NoSQL != No SQL:NoSQL 应作为关系数据库的补充,而不是替代。
  • 混合使用:在实际应用中,可以根据业务需求选择合适的数据库类型,例如将核心事务数据存储在关系数据库中,使用 NoSQL 数据库进行缓存、搜索等辅助功能。
(5)选择数据库的考虑因素
  • 数据量:大规模数据更适合使用 NoSQL 数据库。
  • 并发量:高并发场景下,NoSQL 数据库通常表现更好。
  • 实时性:对实时性要求高的场景,可以使用 Redis 等内存数据库。
  • 一致性要求:对数据一致性要求高的场景,应优先考虑关系数据库。
  • 读写分布:读多写少的场景适合使用列式数据库,写多读少的场景适合使用行式数据库。
  • 安全性:关系数据库在数据安全和备份方面通常有更成熟的支持。
  • 运维性:NoSQL 数据库的运维复杂度通常高于关系数据库。

4、高性能缓存架构

(1)缓存的基本原理
  • 目的:将可能重复使用的数据放到内存中,一次生成、多次使用,避免每次使用都去访问存储系统。
  • 优势:显著提升系统性能,减轻存储系统的压力。

(2)缓存穿透
  • 定义:缓存没有发挥作用,业务系统虽然去缓存查询数据,但缓存中没有数据,业务系统需要再次去存储系统查询数据。
  • 常见情况:
    • 数据不存在:存储系统中没有某个数据,缓存中也不会存储相应的数据。
    • 缓存生成耗费时间:存储系统中存在数据,但生成缓存数据需要耗费较长时间或资源。
  • 解决方案:
    • 设置默认值:如果查询存储系统的数据没有找到,则直接设置一个默认值存到缓存中。
    • 预生成缓存:提前生成缓存数据,减少实时生成的压力。
(3)缓存雪崩
  • 定义:当缓存失效(过期)后引起系统性能急剧下降的情况。
  • 常见情况:
    • 缓存过期:缓存过期被清除后,业务系统需要重新生成缓存,导致大量请求集中访问存储系统。
  • 解决方案:
    • 更新锁机制:对缓存更新操作进行加锁保护,保证只有一个线程能够进行缓存更新。
    • 后台更新机制:由后台线程来更新缓存,而不是由业务线程来更新缓存,缓存本身的有效期设置为永久,后台线程定时更新缓存。
(4)缓存热点
  • 定义:特别热点的数据,如果大部分甚至所有的业务请求都命中同一份缓存数据,导致该缓存服务器压力巨大。
  • 解决方案:
    • 复制多份缓存副本:将请求分散到多个缓存服务器上,减轻单台缓存服务器的压力。
    • 随机过期时间:不同的缓存副本设置不同的过期时间,避免同时生成同时失效的情况。
(5)缓存与存储系统的一致性
  • 挑战:缓存和存储系统之间的数据一致性问题。
  • 解决方案:
    • 同步刷新缓存:当更新了某些信息后,立刻让缓存失效。
    • 适当容忍不一致:例如,商品列表中的价格可以在一定范围内容忍不一致。
    • 关键信息不缓存:对于查询简单且效率高的数据(如库存、价格),可以直接从数据库查询。
(6)缓存设计的注意事项
  • 数据选择:确定哪些数据需要缓存,哪些数据不需要缓存。
  • 触发机制:确定缓存的触发时机和方式。
  • 缓存层次和粒度:考虑网关缓存、本地缓存、分布式缓存等不同层次的缓存。
  • 缓存过期策略:设置合理的缓存过期时间和过期策略。
(7)实际案例
  • 缓存穿透:通过设置默认值解决数据不存在的问题。
  • 缓存雪崩:通过更新锁机制和后台更新机制解决缓存过期后的性能问题。
  • 缓存热点:通过复制多份缓存副本和随机过期时间解决热点数据的压力问题。

5、单服务器高性能模式:PPC 与 TPC

(1)高性能架构的重要性
  • 高性能追求:无论是系统设计还是代码编写,高性能都是每个程序员的目标。
  • 影响因素:磁盘、操作系统、CPU、内存、缓存、网络、编程语言、架构等都会影响系统性能。
  • 性能瓶颈:一个小的不当操作(如不恰当的 debug 日志)可能会大幅降低服务器性能。
(2)高性能架构设计的两个主要方面
  • 提升单服务器性能:将单服务器的性能发挥到极致。
  • 设计服务器集群方案:当单服务器无法支撑性能需求时,设计集群方案。
(3)单服务器高性能的关键
  • 并发模型:选择合适的并发模型是提升单服务器性能的关键。
  • I/O 模型和进程模型:并发模型的设计与操作系统的 I/O 模型及进程模型密切相关。
(4)PPC(Process Per Connection)模式
  • 定义:每次有新的连接就新建一个进程去处理该连接的请求。
  • 优点:实现简单,适合连接数较少的场景。
  • 缺点:
    • 创建进程代价高。
    • 父子进程通信复杂。
    • 支持的并发连接数量有限(通常几百个)。

(5)Prefork 模式
  • 定义:系统启动时预先创建好进程,然后开始接受用户请求。
  • 优点:减少创建进程的时间,提高响应速度。
  • 缺点:
    • 仍然存在父子进程通信复杂的问题。
    • 支持的并发连接数量有限。

(6)TPC(Thread Per Connection)模式
  • 定义:每次有新的连接就新建一个线程去处理该连接的请求。
  • 优点:
    • 创建线程比创建进程代价低。
    • 线程通信比进程通信简单。
  • 缺点:
    • 创建线程也有一定代价,高并发时仍有性能问题。
    • 存在线程调度和切换的代价。
    • 可能出现死锁问题。

(7)Prethread 模式
  • 定义:系统启动时预先创建好线程,然后开始接受用户请求。
  • 优点:减少创建线程的时间,提高响应速度。
  • 实现方式:
    • 主进程 accept,然后将连接交给某个线程处理。
    • 子线程都尝试去 accept,最终只有一个线程 accept 成功。
  • 缺点:
    • 线程间的互斥和共享引入了复杂度。
    • 多线程互相影响,可能导致整个进程退出。

(8)不同并发模式的适用场景
  • 高连接数、高请求数:例如抢购、双十一等,需要使用 I/O 复用模型或异步 I/O 模型。
  • 常量连接、高请求数:例如中间件,可以使用 PPC 或 TPC。
  • 高连接数、常量请求数:例如门户网站,可以使用 I/O 复用模型。
  • 常量连接、常量请求数:例如内部运营系统、管理系统,可以使用 PPC 或 TPC。
(9)性能指标
  • 响应时间(RT):用户请求的响应时间。
  • 并发数(Concurrency):系统可以同时处理的请求数。
  • 吞吐量(TPS):系统单位时间内处理的请求数。
  • 关系:吞吐量 = 并发数 / 平均响应时间。

6、 单服务器高性能模式:Reactor 与Proactor

(1)Reactor 模式
  • 背景:传统的 PPC(每连接一个进程)和 TPC(每连接一个线程)模式在高并发场景下性能不佳,因为每次连接都需要创建和销毁进程或线程,资源消耗大。
  • 核心思想:通过资源复用(进程池或线程池)和 I/O 多路复用技术,提高单服务器的并发处理能力。
  • 关键组件:
    • Reactor:负责监听和分配 I/O 事件。
    • 处理资源池:负责处理具体的业务逻辑。
  • 实现方式:
    • 单 Reactor 单进程/线程:简单,但无法充分利用多核 CPU。

- 单 Reactor 多线程:利用多核 CPU,但线程间同步复杂。

- 多 Reactor 多进程/线程:进一步提高并发处理能力,但实现复杂度较高。

(2)Proactor 模式
  • 背景:Reactor 模式虽然提高了并发处理能力,但 I/O 操作仍然是同步的,限制了性能。
  • 核心思想:通过异步 I/O 操作,进一步提升性能。操作系统内核在 I/O 操作完成后通知用户进程。
  • 关键组件:
    • Initiator:创建 Proactor 和 Handler,并注册到内核。
    • Asynchronous Operation Processor:处理 I/O 操作并通知 Proactor。
    • Proactor:根据事件类型调用相应的 Handler 进行业务处理。
    • Handler:完成业务处理,可以注册新的 Handler 到内核。

(3)I/O 模型
  • 阻塞 I/O:I/O 操作过程中进程会被阻塞。
  • 非阻塞 I/O:I/O 操作过程中进程不会被阻塞,但需要不断轮询。
  • I/O 多路复用:通过一个阻塞对象监听多个 I/O 事件,提高效率。
  • 信号驱动 I/O:通过信号通知 I/O 事件。
  • 异步 I/O:操作系统内核在 I/O 操作完成后通知用户进程。
(4)应用场景
  • 单 Reactor 单进程/线程:适用于业务处理非常快速的场景,如 Redis。
  • 单 Reactor 多线程:适用于需要充分利用多核 CPU 的场景,如 Netty。
  • 多 Reactor 多进程/线程:适用于高并发、高性能要求的场景,如 Nginx 和 Memcache。

7、高性能负载均衡:分类与架构

(1)高性能集群的重要性
  • 性能天花板:单服务器的性能总有上限,无法满足高并发需求。
  • 计算特点:相同输入和逻辑应产生相同输出,适合分布式计算。
(2)负载均衡的分类
  • DNS 负载均衡
    • 优点:简单、成本低、就近访问。
    • 缺点:更新不及时、扩展性差、分配策略简单。

  • 硬件负载均衡
    • 优点:功能强大、性能高、稳定性强、支持安全防护。
    • 缺点:价格昂贵、扩展能力差。
  • 软件负载均衡
    • 优点:便宜、灵活、扩展性强。
    • 缺点:性能一般、功能不如硬件负载均衡强大。

(3)负载均衡的典型架构
  • 地理级别负载均衡:使用 DNS 实现,根据用户地理位置分配到最近的机房。
  • 集群级别负载均衡:使用硬件负载均衡设备(如 F5)实现,将请求分配到多个集群。
  • 机器级别负载均衡:使用软件负载均衡(如 Nginx 或 LVS)实现,将请求分配到具体服务器。

(4)设计日活跃用户 1000 万的论坛负载均衡集群
  • 流量评估:
    • 平均 QPS:1000 万 DAU 换算成秒级,平均约 116 QPS。
    • 峰值 QPS:考虑波峰波谷,峰值约为均值的 3-5 倍。
  • 架构设计:
    • DNS 负载均衡:实现地理级别的负载均衡,将用户分配到最近的机房。
    • 硬件负载均衡:在每个机房内部使用 F5 设备实现集群级别的负载均衡。
    • 软件负载均衡:在每个集群内部使用 Nginx 实现机器级别的负载均衡。
  • 其他考虑:
    • 高可用:使用 Keepalived 实现故障转移。
    • 读写分离:数据库采用一主多从架构,提高读性能。
    • 缓存设计:使用缓存减少数据库压力,提高响应速度。

8、高性能负载均衡:算法

(1)负载均衡算法分类
  • 任务平分类:将任务平均分配给服务器,可以是绝对数量的平均,也可以是比例或权重上的平均。
  • 负载均衡类:根据服务器的当前压力进行任务分配,压力可以用 CPU 负载、连接数、I/O 使用率等指标衡量。
  • 性能最优类:根据服务器的响应时间进行任务分配,优先将任务分配给响应最快的服务器。
  • Hash 类:根据任务中的某些关键信息进行 Hash 运算,将相同 Hash 值的请求分配到同一台服务器上。
(2)常见负载均衡算法及其优缺点
  • 轮询
    • 优点:简单,无须关注服务器状态。
    • 缺点:无法感知服务器状态,可能导致任务分配不合理。
  • 加权轮询
    • 优点:解决了不同服务器处理能力差异的问题。
    • 缺点:仍然无法根据服务器的实时状态进行任务分配。
  • 负载最低优先
    • 优点:能够根据服务器的当前压力进行任务分配,提高资源利用率。
    • 缺点:复杂度高,需要收集和分析服务器状态。
  • 性能最优优先
    • 优点:从客户端角度优化,优先分配给响应最快的服务器。
    • 缺点:复杂度高,需要收集和分析响应时间。
  • Hash 类
    • 优点:满足特定业务需求,如会话保持。
    • 缺点:可能导致某些服务器负载过高。
(3)微信抢红包高并发架构
  • 发红包:可以采用加权轮询算法,简单适用,成功后返回红包ID给客户端。
  • 抢红包:根据红包ID进行Hash负载均衡,将所有相关请求路由到同一台服务器,减少后端逻辑复杂度。
  • 查询红包:同样根据红包ID进行Hash负载均衡,确保数据一致性。
  • 回收红包:并发要求较低,可以采用简单的轮询算法。
(4)其他注意事项
  • 负载均衡系统需要感知服务器状态:对于负载最低优先和性能最优优先算法,负载均衡系统需要收集和分析服务器状态,这增加了复杂度。
  • 业务特点决定算法选择:不同的业务场景需要选择不同的负载均衡算法,如会话保持业务适合使用Hash类算法,高并发业务适合使用负载最低优先算法。
  • 调优和测试:无论选择哪种算法,都需要进行调优和测试,确保系统在高并发场景下的稳定性和性能。

相关文章:

架构实践02-高性能架构模式

零、文章目录 架构实践02-高性能架构模式 1、 高性能数据库集群:读写分离 (1)引言 背景:随着业务的发展和数据的增长,单个数据库服务器难以满足需求,必须考虑数据库集群。目的:介绍高性能数…...

leetcode-73.矩阵置零-day5

class Solution {public void setZeroes(int[][] mat) {int m mat.length, n mat[0].length;// 1. 扫描「首行」和「首列」记录「首行」和「首列」是否该被置零boolean r0 false, c0 false;for (int i 0; i < m; i) {if (mat[i][0] 0) {r0 true;break;}}for (int j …...

Docker与虚拟机:虚拟化技术的差异解析

在信息技术飞速发展的今天&#xff0c;虚拟化技术已成为现代IT架构不可或缺的一部分。而虚拟化从技术层面划分则分为以下几种&#xff1a; 完全虚拟化&#xff1a;虚拟机能够完全模拟底层硬件的特权指令的执行过程&#xff0c;客户操作系统无须进行修改。 硬件辅助虚拟化&#…...

数据结构——ST表

ST表的定义 ST表&#xff0c;又名稀疏表&#xff0c;是一种基于倍增思想&#xff0c;用于解决可重复贡献问题的数据结构 倍增思想 这里列举一个去寻找一个区间内的最大值的例子 因为每次会将将区间增大一倍&#xff0c;所以才被称之为倍增思想 &#xff0c;这种思想十分好用…...

flutter命令行直接指定设备

> flutter driver Found 3 connected devices:sdk gphone16k x86 64 (mobile) • emulator-5554 • android-x64 • Android 15 (API 35) (emulator)Linux (desktop) • linux • linux-x64 • Ubuntu 22.04.5 LTS 6.8.0-49-genericChrome (…...

【STM32】RTT-Studio中HAL库开发教程九:FLASH中的OPT

文章目录 一、概要二、内部FLASH排布三、内部FLASH主要特色四、OTP函数介绍五、测试验证 一、概要 STM32系列是一款强大而灵活的微控制器&#xff0c;它的片内Flash存储器可以用来存储有关代码和数据&#xff0c;在实际应用中&#xff0c;我们也需要对这个存储器进行读写操作。…...

COLA学习之代码规范(二)

小伙伴们&#xff0c;你们好&#xff0c;我是老寇&#xff0c;上一节&#xff0c;我们学习了DDD相关术语&#xff0c;继续跟老寇学习COLA代码规范 代码规范 包命名 层次包名功能必选Adapter层web处理页面请求Controller否Adapter层wireless处理无线端适配否Adapter层wap处理…...

【优选算法】二分算法(在排序数组中查找元素的第一个和最后一个位置,寻找峰值,寻找排序数组中的最小值)

二分算法简介&#xff1a; 提到二分我们可能都会想起二分查找&#xff0c;二分查找要求待查找的数组是有序的&#xff0c;与我们今天讲的二分算法不同&#xff0c;并不是数组元素严格按照有序排列才可以使用二分算法&#xff0c;只要数组中有一个点可以将数组分为两个部分&…...

数据结构-排序(来自于王道)

排序的基本概念 插入排序 在这个算法中&#xff0c;除了输入的数组本身&#xff0c;没有使用额外的数据结构来存储数据&#xff0c;所有的操作都是在原数组上进行的。因此&#xff0c;无论输入数组的大小 n 是多少&#xff0c;算法执行过程中所占用的额外空间是固定的&#xff…...

用 Python 实现经典的 2048 游戏:一步步带你打造属于你的小游戏!

用 Python 实现经典的 2048 游戏&#xff1a;一步步带你打造属于你的小游戏&#xff01;&#xff08;结尾附完整代码&#xff09; 简介 2048 是一个简单而又令人上瘾的数字拼图游戏。玩家通过滑动方块使相同数字的方块合并&#xff0c;目标是创造出数字 2048&#xff01;在这篇…...

《C++:计算机视觉图像识别与目标检测算法优化的利器》

在当今科技飞速发展的时代&#xff0c;计算机视觉领域正经历着前所未有的变革与突破。图像识别和目标检测作为其中的核心技术&#xff0c;广泛应用于安防监控、自动驾驶、智能医疗等众多领域&#xff0c;其重要性不言而喻。而 C语言&#xff0c;凭借其卓越的性能、高效的资源控…...

医学分割数据集白内障严重程度分割数据集labelme格式719张3类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数)&#xff1a;719 标注数量(json文件个数)&#xff1a;719 标注类别数&#xff1a;3 标注类别名称:["normal","severe","mi…...

VirtIO实现原理之数据结构与数据传输演示(4)

接前一篇文章:VirtIO实现原理之数据结构与数据传输演示(3) 本文内容参考: VirtIO实现原理——vring数据结构-CSDN博客 VirtIO实现原理——数据传输演示-CSDN博客 特此致谢! 一、数据结构总览 2. 相关数据结构 前文书介绍了《Virtual I/O Device (VIRTIO) Version 1.3…...

C语言:详解指针最终篇(3)

一.字符指针变量 在指针的类型中我们知道有一种指针类型为字符指针char*。一般我们这样使用&#xff1a; 我们来看另一种使用方式&#xff1a; 这个常量字符串就相当于它本身首字符的地址&#xff0c;收地址加上方括号下标就可以访问该表达式中对应下标的元素。可以把该表达式…...

03篇--二值化与自适应二值化

二值化 定义 何为二值化&#xff1f;顾名思义&#xff0c;就是将图像中的像素值改为只有两种值&#xff0c;黑与白。此为二值化。 二值化操作的图像只能是灰度图&#xff0c;意思就是二值化也是一个二维数组&#xff0c;它与灰度图都属于单信道&#xff0c;仅能表示一种色调…...

Java 小抄|解析 JSON 并提取特定层级数据

文章目录 前言环境准备依赖库 示例代码JSON 数据Java 类定义解析 JSON 数据代码解释 结论 前言 在日常开发中&#xff0c;我们经常需要从 JSON 数据中提取特定的信息。本文将介绍如何使用 Java 和 Gson 库解析 JSON 数据&#xff0c;并通过流式处理提取特定层级的数据。我们将…...

qt 设置系统缩放为150%,导致的文字和界面的问题

1 当我们设置好布局后&#xff0c;在100%的设置里面都是正常的&#xff0c;但是当我们修改缩放为150%后&#xff0c;字体图标&#xff0c;界面大小就出现问题了&#xff0c;这就需要我们设置一些参数。 QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);QCoreAppl…...

【echarts】数据过多时可以左右滑动查看(可鼠标可滚动条)

1. 鼠标左右拖动 在和 series 同级的地方配置 dataZoom&#xff1a; dataZoom: [{type: inside, // inside 鼠标左右拖图表&#xff0c;滚轮缩放&#xff1b; slider 使用滑动条start: 0, // 左边的滑块位置&#xff0c;表示从 0 开始显示end: 60, // 右边的滑块位置&#xf…...

深度学习入门课程学习笔记(第25周)

摘要 本周报的目的在于汇报第25周的学习成果&#xff0c;本周主要聚焦于基于深度学习的目标检测领域算法的总体框架的学习。 在这本周的学习中&#xff0c;内容主要涵盖了目标检测算法的发展历程&#xff0c;包括发展历程和发展阶段&#xff0c;然后纤细说明了目标检测算法的…...

【Python】Matplotlib基本图表绘制

目录 Matplotlib基本图表绘制折线图更多外观外观类型颜色线条样式图例位置使用本地字体 散点图条形图横向条形图 直方图频率分布直方图 Matplotlib基本图表绘制 折线图 from matplotlib import pyplot as plt import matplotlib #字典类型的字体预设&#xff0c;键值对依次…...

【1211更新】腾讯混元Hunyuan3D-1文/图生3D模型云端镜像一键运行

目录 项目介绍 显存占用 11月21 新增纹理烘焙模块Dust3R 烘焙相关参数&#xff1a; AutoDL云端镜像 启动说明 标准模型下载 【1212更新】腾讯混元Hunyuan3D-1文图生3D模型云端镜像一键运行 项目介绍 https://github.com/Tencent/Hunyuan3D-1 腾讯混元 3D 生成模型,支持…...

工业大数据分析算法实战-day05

文章目录 day05分而治之中的MARS算法神经网络逼近能力解释 day05 今天是第5天&#xff0c;昨日从统计分析开始利用统计学的知识判断当前样本的分布以及估计总体的参数和假设检验的情况&#xff0c;以及介绍了线性回归算法的相关优化点&#xff0c;但是毕竟线性回归是线性划分的…...

Go 语言结构

Go 语言结构 Go 语言,也称为 Golang,是一种由 Google 开发和支持的静态类型、编译型编程语言。它于 2009 年首次发布,旨在提高多核处理器、网络资源和大型代码库的性能。Go 语言以其简洁的语法、并发支持和强大的标准库而闻名,特别适合构建高性能的网络服务和分布式系统。…...

【Python篇】PyQt5 超详细教程——由入门到精通(序篇)

文章目录 PyQt5 超详细入门级教程前言序篇&#xff1a;1-3部分&#xff1a;PyQt5基础与常用控件第1部分&#xff1a;初识 PyQt5 和安装1.1 什么是 PyQt5&#xff1f;1.2 在 PyCharm 中安装 PyQt51.3 在 PyCharm 中编写第一个 PyQt5 应用程序1.4 代码详细解释1.5 在 PyCharm 中运…...

9_less教程 --[CSS预处理]

LESS&#xff08;Leaner Style Sheets&#xff09;是一种CSS预处理器&#xff0c;它扩展了CSS语言&#xff0c;增加了变量、嵌套规则、混合&#xff08;mixins&#xff09;、函数等功能&#xff0c;使得样式表的编写更加灵活和易于维护。下面是一些LESS的基础教程内容&#xff…...

macOS:安装第三方软件

基于安全性考虑&#xff0c;Mac 系统通常不允许安装那些从网络上下载下来的第三方软件包。 比如&#xff0c;在打开镜像盘时&#xff0c;报错为“该镜像已损坏&#xff0c;请移至废纸篓”&#xff0c;或者打开软件时提示“XXX 已损坏&#xff0c;打不开。您应该将它移到废纸篓”…...

HTML+CSS+Vue3的静态网页,免费开源,可当作作业使用

拿走请吱一声&#xff0c;点个关注吧&#xff0c;代码如下&#xff0c;网页有移动端适配 HTML <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width…...

昇思25天学习打卡营第33天|共赴算力时代

文章目录 一、平台简介二、深度学习模型2.1 处理数据集2.2 模型训练2.3 加载模型 三、共赴算力时代 一、平台简介 昇思大模型平台&#xff0c;就像是AI学习者和开发者的超级基地&#xff0c;这里不仅提供丰富的项目、模型和大模型体验&#xff0c;还有一大堆经典数据集任你挑。…...

IAR环境下STM32静态库编译及使用

IAR环境下STM32静态库编译及使用 前言 最近了解到了STM32的静态库与动态库&#xff0c;在此记录一下STM32静态库的生成与使用。 静态库的作用主要是对代码进行封装及保护&#xff0c;使其他使用者只知其然而不知其所以然&#xff0c;因为封装后的静态库只有.h文件没有.c文件。…...

前端如何性能优化

前端性能优化是提高网页加载速度和响应速度的重要手段。优化前端性能不仅能提升用户体验&#xff0c;还能提高SEO排名&#xff0c;降低服务器负担&#xff0c;节省带宽等。下面是一些常见的前端性能优化方法&#xff1a; 1. 减少 HTTP 请求 每个页面资源&#xff08;如图片、…...

【开源】为Stable Diffusion工作流程提供的一个更加灵活易用的Web界面

一个开源项目&#xff0c;旨在为Stable Diffusion工作流程提供一个更加灵活、易用的Web界面。这个项目特别适用于图像生成和编辑&#xff0c;具有以下几个显著特点&#xff1a; 分层和非破坏性编辑&#xff1a;OpenDream支持非破坏性编辑&#xff0c;允许用户在保留原始图像数据…...

安全见闻(1)

Target 开阔见闻&#xff0c;不做井底之蛙 Trial 建议 前期小白到中级红队&#xff1a;把python学好 C\C&#xff1a;偏向底层&#xff0c;适合逆向&#xff0c;不适合前期web渗透 编程语言 C语言: 一种通用的、面向过程的编程语言&#xff0c;广泛应用于系统软件和嵌入…...

基于32单片机的RS485综合土壤传感器检测土壤PH、氮磷钾的使用(超详细)

1-3为RS485综合土壤传感器的基本内容 4-5为基于STM32F103C8T6单片机使用RS485传感器检测土壤PH、氮磷钾并显示在OLED显示屏的相关配置内容 注意&#xff1a;本篇文件讲解使用的是PH、氮磷钾四合一RS485综合土壤传感器&#xff0c;但里面的讲解内容适配市面上的所有多合一的RS…...

SQL server学习03-创建和管理数据表

目录 一&#xff0c;SQL server的数据类型 1&#xff0c;基本数据类型 2&#xff0c;自定义数据类型 二&#xff0c;使用T-SQL创建表 1&#xff0c;数据完整性的分类 2&#xff0c;约束的类型 3&#xff0c;创建表时创建约束 4&#xff0c;任务 5&#xff0c;由任务编写…...

Windows 系统下 Python 环境安装

一、引言 Python 作为一种广泛应用的编程语言&#xff0c;在数据分析、人工智能等领域发挥着重要作用。本文将详细介绍在 Windows 系统上安装 Python 环境的步骤。 二、安装前准备 系统要求 Windows 7 及以上版本一般都能支持 Python。硬件方面&#xff0c;通常 2GB 内存、几…...

Redis 在Go项目中的集成和统一管理

本节我们在项目中安装和集成 go-redis&#xff0c;让项目能访问Redis&#xff0c;后面实战项目中的用户认证体系会依赖Redis来实现&#xff0c;像Token、Session这些都是在Redis中存储的。 本节大纲如下&#xff1a;‍‍ Redis的使用场景有不少&#xff0c;不过有一点需要提醒的…...

Hive——HQL数据定义语言

文章目录 Hive HQL数据查询语言更多大数据资源持续更新中。。。学习目标一、HQL数据定义语言&#xff08;DDL&#xff09;概述1、DDL语法的作用2、Hive中DDL使用☆ 创建数据库☆ 查询数据库☆ 切换数据库☆ 修改数据库☆ 删除数据库 二、Hive DDL建表基础1、完整建表语法树2、H…...

Python机器视觉的学习

一、二值化 1.1 二值化图 二值化图&#xff1a;就是将图像中的像素改成只有两种值&#xff0c;其操作的图像必须是灰度图。 1.2 阈值法 阈值法&#xff08;Thresholding&#xff09;是一种图像分割技术&#xff0c;旨在根据像素的灰度值或颜色值将图像分成不同的区域。该方法…...

使用navicat新旧版本,连接PostgreSQL高版本报错问题图文解决办法

使用navicat新旧版本&#xff0c;连接PostgreSQL高版本报错问题图文解决办法 一、问题现象&#xff1a;二、出现原因三、解决方法&#xff1a;1、升级Navicat版本&#xff1a;2、使用低版本的postgreSQL&#xff1a;3、修改Navicat的dll二进制文件&#xff1a;navicat版本15nav…...

秒杀抢购场景下实战JVM级别锁与分布式锁

背景历史 在电商系统中&#xff0c;秒杀抢购活动是一种常见的营销手段。它通过设定极低的价格和有限的商品数量&#xff0c;吸引大量用户在特定时间点抢购&#xff0c;从而迅速增加销量、提升品牌曝光度和用户活跃度。然而&#xff0c;这种活动也对系统的性能和稳定性提出了极…...

【iOS】OC高级编程 iOS多线程与内存管理阅读笔记——自动引用计数(四)

目录 ARC规则 规则 对象型变量不能作为C语言结构体的成员 显式转换id和void* 属性 数组 ARC规则 规则 在ARC有效的情况下编译源代码必须遵守一定的规则&#xff1a; 主要解释一下最后两条 对象型变量不能作为C语言结构体的成员 要把对象型变量加入到结构体成员中时&a…...

Reactor 响应式编程(第一篇:Reactor核心)

系列文章目录 Reactor 响应式编程&#xff08;第一篇&#xff1a;Reactor核心&#xff09; Reactor 响应式编程&#xff08;第二篇&#xff1a;Spring Webflux&#xff09; Reactor 响应式编程&#xff08;第三篇&#xff1a;R2DBC&#xff09; Reactor 响应式编程&#xff08…...

数据挖掘之聚类分析

聚类分析&#xff08;Clustering Analysis&#xff09; 是数据挖掘中的一项重要技术&#xff0c;旨在根据对象间的相似性或差异性&#xff0c;将对象分为若干组&#xff08;簇&#xff09;。同一簇内的对象相似性较高&#xff0c;而不同簇间的对象差异性较大。聚类分析广泛应用…...

修改uniapp下拉刷新圆圈颜色

直接看图 修改前就是常规的绿色 自定义更符合我们的软件 直接说方法 修改 在App.vue的style样式里添加一行 .uni-page-refresh--refreshing .uni-page-refresh__path{stroke:#FF2442; }我是通过 不执行 uni.stopPullDownRefresh(); 下拉刷新 之后通过F12看出来的 希望可以帮…...

SparkSQL与Hive的整合

文章目录 SparkSQL与Hive的整合1.1. Spark On Hive1.1.1. Hive的准备工作1.1.2. Spark的准备工作1.1.3. Spark代码开发1.1.4. Spark On Hive案例 1.2. Hive On Spark1.3. SparkSQL命令行1.4. SparkSQL分布式查询引擎1.4.1. 开启ThriftServer服务1.4.2. beeline连接ThriftServer…...

电子科技大学考研,计算机与软件专业怎么选择?

电子科技大学在计算机与软件领域具备卓越实力&#xff0c;其毕业生就业前景及薪资水平均颇为可观。因此&#xff0c;学生应依据个人课程专长来选定专业。若各项课程均表现出色&#xff0c;推荐25届考生优先考虑软件专业&#xff0c;因其上岸难度相对较低。 接下来&#xff0c;C…...

MSF(Metasploit Framework)

渗透测试中MSF是一个非常强大的工具&#xff0c;可以用来验证系统漏洞、执行攻击以及开发自定义的漏洞利用代码。以下是使用MSF进行渗透测试的基本步骤&#xff1a; 1.启动MSF 启动MSF控制台。 msfconsole2. 搜索漏洞 在MSF中搜索已知漏洞。 search <vulnerability nam…...

@SpringBootTest 报错: UnsatisfiedDependencyException

Spring Boot Test 报错: UnsatisfiedDependencyException 在使用 SpringBootTest 测试时&#xff0c;出现 UnsatisfiedDependencyException 报错&#xff0c;原因和解决方法如下。 报错原因分析 1. Spring 存在涉及 Bean 没有被添加 Spring Boot 测试中&#xff0c;默认会加…...

QT数据库操作详解

在Qt中&#xff0c;操作数据库通常使用Qt SQL模块&#xff0c;该模块提供了一组类来与数据库进行交互。 数据库连接与查询执行 QSqlDatabase::addDatabase(): 添加一个数据库连接。 QSqlDatabase::open(): 打开数据库连接。 QSqlDatabase::close(): 关闭数据库连接。 QSql…...

Coding Caprice - dynamic programming13

647. 回文子串 class Solution { public:int countSubstrings(string s) {int s_len s.size();vector<int> dp{0};int out(1);for(int i1; i<s_len; i){out;vector<int> dq{i};if(s[i]s[i-1]){dq.push_back(i-1);out;}for(int j:dp){if(j>0&&s[j-1…...