性能优化全景图:七大维度深度解析
代码之所以把代码放到第一位,是因为这一点最容易引起技术人员的忽视。很多技术人员拿到一个性能优化的需求以后,首先想到的是缓存、异步、JVM等。实际上,第一步就应该是分析相关的代码,找出相应的瓶颈,再来考虑具体的优化策略。有一些性能问题,完全是由于代码写的不合理,通过直接修改一下代码就能解决问题的,比如for循环次数过多、作了很多无谓的条件判断、相同逻辑重复多次等。 数据库数据库的调优,总的来说分为以下三部分: SQL调优这是最常用、每一个技术人员都应该掌握基本的SQL调优手段(包括方法、工具、辅助系统等)。这里以MySQL为例,最常见的方式是,由自带的慢查询日志或者开源的慢查询系统定位到具体的出问题的SQL,然后使用explain、profile等工具来逐步调优,最后经过测试达到效果后上线。 架构层面的调优这一类调优包括读写分离、多从库负载均衡、水平和垂直分库分表等方面,一般需要的改动较大,但是频率没有SQL调优高,那么什么时候需要做这些事情?我们可以通过内部监控报警系统,定期跟踪一些指标数据是否达到瓶颈,一旦达到瓶颈或者警戒值,就需要考虑这些事情。 连接池调优我们的应用为了实现数...
翻译翻译什么是惊喜:一次线上问题的思考
💡TIP在线上商城的一次功能迭代中,我们遇到了一个线上问题。虽然很快解决,但是觉得这个问题在软件设计开发中非常典型,对问题产生的原因以及如何避免类似问题的产生做一次复盘分析 背景商城的用户具有不同的会员等级,包括黄金会员、白银会员和普通会员。根据会员等级的不同,商品的价格策略也不同。具体来说,黄金会员购买商品时享受黄金会员价,普通会员购买时享受普通会员价,白银会员比较特殊购买时享受黄金会员价。 商品的后台管理功能只维护商品的黄金会员价和普通会员价,白银会员的价格显示和购买时的价格计算在业务代码中进行判断,如果是白银会员价格按照黄金会员执行。 数据库设计:一个商品sku和会员价格存在一对多的关系 产生问题在优惠券功能迭代中,产品要求增加商品兑换券的功能,兑换券在进行商品购买时==优惠金额 = 商品价格 - 0.01元==,由于不同会员等级享受的商品价格不同,那么同一个兑换券对于不同的会员来说,优惠金额也就不一样,优惠金额需要根据使用优惠券时当前会员等级以及能够兑换的商品进行计算。 在功能开发时,遗漏了一个场景,...
计算机组成原理
计算机结构计算机的经典结构是冯·诺依曼结构,它由五大部件组成:运算器、控制器、存储器、输入设备和输出设备。现代计算机结构通常包括中央处理器(CPU)、内存、存储设备、输入/输出设备以及连接这些设备的总线系统。 运算器 算数逻辑单元(ALU):执行算数和逻辑运算 累加寄存器(AC):通用寄存器,为ALU提供一个工作区,用在暂存数据 数据缓冲寄存器(DR):读/写内存时,暂存指令或数据 状态条件寄存器(PSW):存状态标志与控制标志 软考中存在争议,也有将其归为控制器的 控制器 程序计数器(PC):存储下一条要执行指令的地址 指令寄存器(IR):存储正在执行的指令 指令译码器(ID):对指令中的操作码字段进行分析解释 时序部件:产生时钟脉冲(Clock Pulse),为整个CPU提供基准时序信号 计算机体系结构分类-FlynnSISD - 单指令流单数据流 (Single Instruction, Single Data) 描述: 单指令流:在任何时钟周期,只有一个控制单元(CU)从内存中取出一条指令。 单数据流:该指令在单个处理单元(PU)上操作一个数据...
使用nvs工具切换node版本
安装nvs官方仓库 nvs 有跨平台的特性,支持 Windows 、 macOS和 Linux 系统,下面分别介绍两种安装方法。 windows推荐通过 msi 的方式安装,就跟正常安装软件一下,双击下一步即可: https://github.com/jasongin/nvs/releases mac用下面三行命令即可: 1export NVS_HOME="$HOME/.nvs" git clone https://github.com/jasongin/nvs "$NVS_HOME" . "$NVS_HOME/nvs.sh" install 常见命令添加Node版本如果你想安装最新的 LTS 版本,可以用命令: 1nvs add lts 如果你需要新增一个 Node.js 16的版本,可以用以下命令: 1nvs add 16 更新当前的 Node 小版本如果你想要升级 Node 小版本,比方说从 20.13.1升级到20.14.0(当前大版本的最新版),可以使用如下命令: 1nvs upgrade 配置默认 N...
蒙提霍尔问题-经典的三扇门问题
问题设定 三扇门:一扇后面有汽车(奖品),两扇后面有山羊。 你随机选择一扇门(比如 1 号门)。 主持人(知道汽车在哪里)打开另一扇门,露出一只山羊(比如 3 号门)。 主持人问你:是否换到剩下的那扇门(2 号门)? 关键点 主持人 总是 会打开一扇有山羊的门,且不会打开你选的门。 主持人的行动不是随机的,而是根据你的选择和门后的情况刻意为之,这提供了额外信息。 概率分析初始概率 你第一次选择时,选中汽车的概率是 1/3,选中山羊的概率是 2/3。 两种情形 你第一次选中了汽车(概率 1/3) 剩下的两扇门都是山羊。 主持人打开其中一扇山羊门。 如果你 换门,会换到另一扇山羊门 → 失败。 如果你 不换,保留原来的门 → 获胜。 你第一次选中山羊(概率 2/3) 剩下的两扇门中,一扇是汽车,一扇是山羊。 主持人 只能 打开剩下的那扇山羊门(因为不能打开你的门,也不能直接打开汽车门)。 如果你 换门,一定会换到剩下的那扇汽车门 → 获胜。 如果你 不换,保留原来的山羊门 → 失败。 总结策略结果...
事件驱动架构:业务解耦与异步处理
1. 事件驱动架构概述事件驱动是一种经典的编程和系统设计模式,其核心思想是系统的运作由事件来驱动。当事件发生时,系统的各个组件会对事件做出反应并执行相应的操作。这些事件可以是外部触发的(如用户点击、网络请求),也可以是系统内部产生的(如状态变更、定时调度)。 2. 事件驱动在业务系统中的价值2.1 接口解耦在业务系统中,事件驱动机制被广泛用于接口解耦。以电商系统为例: 商品发布、订单变更等都可以作为事件进行发布 商品信息同步、订单信息推送等操作可以作为事件监听器 主业务流程只需关注核心业务逻辑,使功能更加内聚,耦合性更低 2.2 划分主业务流程与事件消费者的方法一个简单的判断标准是:如果某些操作不执行,仅从业务域本身考虑,系统是否仍能正常运行?如果答案是肯定的,那么这些操作就可以被定义为事件的消费者。 示例分析:在电商系统的商品发布流程中,将商品信息同步给下游系统如果失败或未执行,商品系统本身仍应能正常发布商品。同步问题可以通过定时推送、失败补偿等机制解决,因此商品信息同步操作适合作为事件消费者。 3. 实践中的挑战与解决方案3.1 下游系统约束的处理当下游系统对业务有约束...
Spring事件监听在业务使用中的优化
事件驱动的开发方式在业务系统开发中扮演着关键角色,若能妥善运用,将对系统的拓展性产生至关重要的影响。Spring框架对事件驱动进行了出色的封装,然而在实际业务应用中,我们发现了一些可优化的领域,因此针对这些问题进行了封装和优化工作。 Spring事件驱动的使用在电商订单创建的场景中,一旦订单成功创建,必须执行一系列附加的业务操作。这些操作包括向用户发送相关信息,并将订单信息同步到相关系统中。考虑到此场景的特点,事件驱动的开发方式被广泛认为是最合适的选择,因其能够在不对业务系统造成负面影响的前提下进行处理。 事件定义在订单创建事件中,可以定义包含订单对象以及与订单相关的属性,例如订单ID等。通过此事件,能够有效地传递订单信息,并为其他业务操作提供必要的数据依据。 12345678@Data@AllArgsConstructorpublic class CreateTradeEvent{ // 可以在此定义订单创建事件中的相关属性 private Trade trade; } 事件发布在订单成功创建之后,我们可以获取到订单实体或其他...
知其然知其所以然:Boolean类型命名规范
对应阿里巴巴开发手册-编码规约-命名风格第9条,规约中写的比较模糊,之前只知道这样命名可能会存在问题,这里探索一下具体什么场景会存在问题。 对上面举的反例感觉有些怪,**基本数据类型Boolean isDeleted属性的Getter方法是isDeleted()**,手册应该写的有问题,印象中基本数据类型boolean是这样的,但是Boolean包装类型并不是如此,后面会对这里进行探索,坑很大。 实例深究JavaBean规范首先了解下JavaBean的规范,属性应该由一组读写方法(Getter/Setter)来访问,如果操作的字段为boolean类型,此时Getter不应命名为getXXX方法,而应该是isXXX,如果boolean类型的属性名以is开头,则将属性名中的is自动去除,例如boolean isSuccess的Getter是isSuccess(),但是对于Boolean类型的属性并没有明确的规范进行约定。 以下示例基于IDEA 2023.1 JDK11 布尔类型存在基本数据类型和包装类型,所以存在四种情况 1234private boolean succe...
Ubuntu 安装 Docker 操作手册
官方操作手册 操作系统要求要安装 Docker 引擎,您需要以下 Ubuntu 版本的 64 位版本之一: Ubuntu Questing 25.10 Ubuntu 探索版 25.10 Ubuntu Plucky 25.04 Ubuntu 勇敢版 25.04 Ubuntu Noble 24.04 (LTS) Ubuntu 贵族版 24.04 (LTS) Ubuntu Jammy 22.04 (LTS) Ubuntu 甜蜜版 22.04 (LTS) Ubuntu 的 Docker Engine 与 x86_64(或 amd64)、armhf、arm64、s390x 和 ppc64le(ppc64el)架构兼容。 查看系统版本 1234567891011121314sharkidon@ubuntu:~$ cat /etc/os-releasePRETTY_NAME="Ubuntu 25.10"NAME="Ubuntu"VERSION_ID="25.10"VERSION="25.10 (Questing ...
Ubuntu修改国内源解决下载问题
经常使用Ubuntu的同学都会遇到软件安装下载速度慢的情况,究其原因,是因为Ubuntu默认源的地址都在国外所导致,其实国内也有很多优秀的源,比如阿里源、中科大源、清华源、163源等,只需要简单的更换一下源,下载度立刻就上来了。 以下操作都必须在管理员模式下(使用su命令进入)进行,否则会执行失败 备份官方源 1mv /etc/apt/sources.list /etc/apt/sources.list.bk 下载第三方源文件更换 具体使用哪一个,可以自行测试按照效果选用 1234567891011#163源wget 'https://gitee.com/zaozuotime/ubuntu-update-source-file/raw/master/163.sources.list' -O /etc/apt/sources.list#阿里源wget 'https://gitee.com/zaozuotime/ubuntu-update-source-file/raw/master/aliyun.sources.list' -O /etc...
Tomcat进程残留问题
运行shutdown.sh,tomcat停止, 但它的java进程还在, 不过状态为S(sleep), 不是运行时的R(Runnable), 如果不kill的话, 这种进程越来越多,导致JVM进程越来越多, 占据了大量的内存空间, 有可能使得新程序在启动JVM时由于内存不够用而无法启动。 kill强制杀死进程1ps -ef|grep java 若显示以下内容代表使用的java进程还存在,没有完全停止 12345root 50530 1 99 10:25 pts/0 00:00:45 /usr/local/java/jdk1.7.0_51/jre/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/apache-tomcat-7.0.92/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Dign...
Oracle特殊字符处理
在Oracle数据库中,有时字段中会存入一些特殊字符(设计不当或者程序BUG),例如制表符、换行符以及回车符等,如果包含特殊字符是看不出来的,但是在进行字段关联的时候就会查不出数据。 特殊字符ASCII码定义: 制表符 chr(9)换行符 chr(10)回车符 chr(13) 去掉表中的特殊字符1update table set field=replace(field,chr(9), '') where instr(field, chr(9)) > 0 其他特殊字符也可以使用ascii函数查出ASCII码然后进行替换1select ascii('?') from dual;








