会员购交易系统架构演进
本期作者
1.背景
会员购是B站2017年推出的IP消费体验服务平台,在售商品以手办、漫画、JK制服等贴合平台生态的商品为主。随着业务发展,会员购从最开始的预售,现货拓展到全款预售,盲盒,众筹等多种售卖方式,销售渠道也遍布 猫耳(现已下线),QQ小程序,漫画等多个业务渠道,再加上不断增加的营销活动玩法,每年几次大促活动的爆发式流量,对于会员购交易系统来说,无疑是一个巨大的挑战。
2.性能
每年的拜年纪,626(公司周年庆),919(会员购周年庆),会员购都会搞大促活动,运营会挑选一些比较热门的手办进行首发,加上提前发放红包优惠券,各种优惠活动的刺激,每次大促0点开售流量就是几百倍的爆发,早期也因为压力太多出过几次事故,所以如何优化性能,提高交易的吞吐量是首要的。
2.1调用链路优化
面临问题:
在最初版的系统中,下单接口有明显的等待时间,用户体验不是很好,能支持的最大qps也有限
如图 2-1 所示 通看分析下单调用链路发现,存在多个接口重复调用,接口全是串行调用的情况,下单接口耗时太长,达到400+ms,已经严重影响系统性能及用户体验
图 2-1 初版下单链路图
从链路上可有看出下单是IO密集型应用,CPU 利用率低,代码串行执行的话同步等待时间较长,为止我们重新梳理下单业务逻辑,对下单流程进行责任链模式改造,如2-2图所示
2-2 下单链路简单示意图
同时我们对系统做了以下优化
-
对没有依赖的服务进行并发调用(商品/店铺/活动/用户信息等一起并发调用),如图2-3所示
-
优化调用链减少冗余调用,推动下游服务接口改造及合并,保证一次请求下来,每个基础接口只会被调用一次,如图2-3所示
-
设置合理的超时时间和及连接重试(200ms, 部分接口99分位上浮100%,connect连接重试)
-
排除事务内的外部调用(服务依赖,mq,缓存)
-
对弱依赖接口进行mq或异步调用(设置关注/缓存手机号/回滚库存优惠券等)
2-3 优化后的调用链路
经过优化后的接口耗时如2-4图所示,从原来300ms降低100ms左右,效果比较显著,用户的下单体验得到较大提升
2-4 下单耗时对比图
2.2异步下单优化
面临问题:电商活动离不开秒杀场景,通常情况下小库存秒杀做好限流的话问题不大,但拜年祭手办通常有5000个左右的库存,如2-5如图所示,属于大库存秒杀 , 限流值设得太小会严重影响用户体验 ,大库存抢购时下单qps遇到瓶颈 600+qps的时候库存服务行锁比较严重,耗时开始大幅上升,大量数据库操作占用连接数较高。
2-5 拜年纪商品
思考:服务器的处理能力是恒定的,就像早高峰一样,需要错峰限行,这就是我们说的削峰,对流量进行削峰不仅让服务器处理得更加平稳,也节省服务器资源。一般削峰的手段有验证码,排队等方式,这里我们主要是采用异步下单这种排队的做法。
说到排队,最容易想到的就是消息队列,可以通过消息队列把两个系统模块进行解耦,对于抢购场景来说也是非常合适的,可以有效把流量通过队列来承接,然后平滑得进行处理,如图2-6所示
2-6 消息队列解耦
按照消息队列的排队方案,我们把整个下单流程调整为异步批量下单链路(图2-7所示) ,在合法校验过后生成订单号提交到databus消息队列 (图2-8所示),再监听databus批量拉取订单进行合并下单(图2-9所示),目前设置的是最多20个一消费,下单结果会在数据库及redis中保存。
2-7异步下单链路
2-8 提交下单请求直mq
2-9 从mq消费订单消息
如图2-10所示,在进入队列后,前端会提示活动火爆,正在努力下单中 ,同时在0~2秒内随机调用下单结果查询接口,轮询30秒(必须设置最大时间兜底,防止无限查询)
对于合并的订单进行批量冻结库存,并行冻结优惠券,批量合并sql插入数据库,最大限度上减少性能消耗
2-10 异步下单示例图
其他优化细节
-
下单限频/限流
-
其中对于一些弱依赖的操作直接进行降级,比如设置商铺关注,缓存手机号,记录操作日志等
-
批量操作异常时(接口超时则fail fast),会分解为单个订单重新进行调用(库存操作会试探单库存扣减 单库存扣减成功 并发请求剩余订单,单库存扣减失败 剩余订单全部置为失败)
-
下单结果查询走redis,异常情况降级为数据库
-
databus异常时,直接降级为同步下单(库存服务也会做限流)
-
databus消费者会做幂等及超时判断(订单投递时间跟当前时间差值),超过一定时间会自动抛弃,下单失败
经过改造,压测下单支持4000+tps,最终也顺利利用异步下单支撑了早期的拜年祭手办抢购,如图2-11所示
2-11 活动抢购qps图
2.3分库分表
首先并不是所有表都需要进行切分,主要还是看数据的增长速度。切分后会在某种程度上提升业务的复杂度,避免"过度设计"和"过早优化"。分库分表之前,不要为分而分,先尽力去做力所能及的事情,例如:升级硬件、升级网络、垂直拆分、读写分离、索引优化等等。当数据量达到单表的瓶颈时候,再考虑分库分表。
数据量过大的风险如下:
1)高负载下主从延迟严重,影响用户体验,并且对数据库备份,如果单表太大,备份时需要大量的磁盘IO和网络IO。例如1T的数据,网络传输占50MB时候,需要20000秒才能传输完毕,整个过程的风险都是比较高的
2)对一个很大的表进行DDL修改时,MySQL会锁住全表,这个时间会很长,这段时间业务不能访问此表,影响很大。如果使用pt-online-schema-change,使用过程中会创建触发器和影子表,也需要很长的时间。在此操作过程中,都算为风险时间。将数据表拆分,总量减少,有助于降低这个风险。
3)大表会经常访问与更新,就更有可能出现锁等待,一旦出现慢查询,风险很大,容错性很低。将数据切分,用空间换时间,变相降低访问压力,而且利用水平切分,当一个数据库出现问题时,不会影响到100%的用户,每个库只承担业务的一部分数据,这样整体的可用性就能提高
这里我们明确下分库 分表到底能解决什么问题
-
分表:解决单表过大导致的查询效率下降(海量存储,即使索引正确也会很慢) MySQL 为了提高性能,会将表的索引装载到内存中。InnoDB buffer size 足够的情况下,其能完成全加载进内存,查询不会有问题。但是,当单表数据库到达某个量级的上限时,导致内存无法存储其索引,使得之后的 SQL 查询会产生磁盘 IO,从而导致性能下降。当然,这个还有具体的表结构的设计有关,最终导致的问题都是内存限制。这里,增加硬件配置,可能会带来立竿见影的性能提升。
-
分库:解决Master服务器无法承受读写操作压力(高并发访问,吞吐量)
在2020年的时候,会员购随着业务发展,订单数据快速增长,基本每半年数据量就会翻倍,所有核心表均达到千万级别 大表的DDL,查询效率,健壮性都有问题 ,并且高负载下,会有较为明显的主从延迟,影响到用户体验。
首先是技术选型:
站在巨人的肩膀上能省力很多,目前分库分表已经有一些较为成熟的开源解决方案:
-
阿里的TDDL,DRDS和cobar
-
开源社区的sharding-jdbc(3.x开始已经更名为sharding-sphere)
-
民间组织的MyCAT
-
360的Atlas
-
美团的zebra
这么多的分库分表中间件全部可以归结为两大类型:CLIENT模式 PROXY模式
无论是CLIENT模式,还是PROXY模式。几个核心的步骤是一样的:SQL解析,重写,路由,执行,结果归并。
经过讨论大家更倾向于CLIENT模式,架构简单,性能损耗较小,运维成本低,而且目前部分项目中都已经被引入shardingjdbc,并且部分模块已经在使用其分库分表功能,网上文档丰富,框架比较成熟 。
选择sharding key:
sharding column的选取是很重要的,sharding column选择的好坏将直接决定整个分库分表方案最终是否成功。
sharding column的选取跟业务强相关,选择sharding column的方法最主要分析你的API流量,优先考虑流量大的API,将流量比较大的API对应的SQL提取出来,将这些SQL共同的条件作为sharding column 例如一般的OLTP系统都是对用户提供服务,这些API对应的SQL都有条件用户ID,那么,用户ID就是非常好的sharding column。
非sharding column查询该怎么办?
1. 建立非sharding column属性到sharding column的映射关系
2. 双写冗余全量数据(不需要二次查询)
3. 数据异构(TIDB,ES,HIVE等,应对复杂条件查询,近实时或离线查询)
4. 基因融合(比如订单号里融合mid基因,最新的订单号规则:orderId+mid%512 比如4004164057659338)
切分策略:
1.范围切分
比如按照时间区间或ID区间来切分,如图3-1所示,优点:单表大小可控,天然水平扩展。缺点:无法解决集中写入瓶颈的问题。
3-1 范围切分
2.Hash切分
如图3-2所示,如果希望一劳永逸或者是易于水平扩展的,还是推荐采用mod 2^n这种一致性Hash
3-2 Hash切分
3.会员购交易切分策略
如图3-3所示,切分键选择:mid 和 order_id相关
根据 mid 分表,使用新的orderid 生成规则,orderid 融入(mid%512)
库表数量:4个集群(主从),每个集群4个库,每个库16张表,总计256张表
库路由策略:mid %16
表路由策略:(mid%512)/32
公式:
中间变量 = MID % (库数量*表数量)
库路由 = 中间变量 % 库数量
表路由 = 取整(中间变量 /库数量)
3-3 库表策略示意图
我们采用的是不清洗老数据的方式,好处是老的订单数据依然走老库,这样能节省一部分清洗数据的工作量
梳理sql:
项目中的sql有些是不满足分片条件的,所以我们是要提前梳理项目中的sql的
1.通过 druid 界面 可以统计到所有运行的 sql
2.配合静态扫描sql工具
3.DBA 拉取 SQL
4.人工查看代码 当梳理出对应所有 SQL
针对没有分片键的SQL进行改造,不确定的SQL进行验证,不支持的SQL给出处理方式
当然如何进行迁移也是很重要的步骤,我们是采用下面的步骤,如图3-4所示
-
历史数据归档,不做迁移,老数据修改依旧路由到老库
-
切读写请求,即将读写流量请求引入到新系统中
-
回写数据,binlog 监听新数据库回写到老系统中,并进行校验
3-4 不停机迁移示意图
最后总结下整个分库分表的步骤
1.根据容量(当前容量和增长量)评估分库分表个数
2.选key(均匀)
3.分表规则(hash或range等)
4.梳理sql并验证
5.执行(一般双写)
在整个交易系统完成分库分表后,彻底解决了数据库的瓶颈问题,历经多次大促压测突发流量等场景都没有出问题,保障了整个平台系统的稳定性。
3.总结
在经过调研链路优化,异步下单改造,数据库分库分表后,整个交易系统的性能得到了较大的提升,也较为顺利得支撑了历次大促活动,后续我们也会继续对一些历史系统(比如票务系统)进行改造升级来提升用户体验。
相关文章:
会员购交易系统架构演进
本期作者 1.背景 会员购是B站2017年推出的IP消费体验服务平台,在售商品以手办、漫画、JK制服等贴合平台生态的商品为主。随着业务发展,会员购从最开始的预售,现货拓展到全款预售,盲盒,众筹等多种售卖方式,销…...
在Linux系统下修改Docker的默认存储路径
在Linux系统下修改Docker的默认存储路径可以通过多种方法实现,下边是通过修改daemon.json文件方式实现 查看当前Docker存储路径 使用命令 docker info | grep "Docker Root Dir" 查看当前Docker的存储路径,默认为 /var/lib/docker 停止Docker…...
【人工智能】释放数据潜能:使用Featuretools进行自动化特征工程
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 特征工程是机器学习流程中至关重要的一步,它直接影响模型的性能。然而,手动特征工程既耗时又需要领域专业知识。Featuretools是一个强大的…...
shell脚本备份PostgreSQL数据库和库下表
注意: 以下为对PostgreSQL13.16版本数据库备份shell脚本参考请确认备份节点上psql和pgdump的版本不至于太低,建议>13.16该脚本目前是对于整库、(默认针对public这个schema,如果有其他schema,请自行添加一层循环&am…...
java面试笔记(一)
1. 一万个string类型的数据,设计一个算法如何按照String长度来排序 以使用 Arrays.sort() 方法,并结合一个自定义的比较器。以下是实现的示例代码: public class StringLengthSort {public static void main(String[] args) {// 定义一万个字符串的示例…...
网络分析仪E5071C的回波损耗测量
回波损耗(Return Loss)是评估射频/微波元件(如滤波器、天线、电缆等)信号反射特性的关键参数,反映端口阻抗匹配性能。E5071C矢量网络分析仪(VNA)通过以下步骤实现高精度回波损耗测量:…...
sql注入中,如果information_schema被过滤,该怎么绕过
目录 一、sys.schema_auto_increment_columns 1.功能 2.利用思路 二、sys.schema_table_statistics_with_buffer 1.功能 2.利用思路 三、mysql.innodb_table_stats和mysql.innodb_index_stats 1.mysql.innodb_table_stats 1.1功能 2.mysql.innodb_index_stats 2.1功…...
若依Flowable工作流版本监听器使用方法
1.前言 本文详细介绍如何在若依Flowable工作流版本(RuoYi-Vue-Flowable)中配置执行监听器和任务监听器。是以我二次开发的代码为基础,介绍如何配置监听器,已解决源码在新增或删除监听器出现的问题,如果需要二次开发的…...
Linux(Centos 7.6)命令详解:cat
1.命令作用 将文件或标准输入连接到标准输出(Concatenate FILE(s), or standard input, to standard output), 即将文件内容输出到屏幕上,或者将多个文件合并成一个文件。 2.命令语法 Usage: cat [OPTION]... [FILE]... 3.参数详解 OPTION: -A, -…...
使用DeepSeek+本地知识库,尝试从0到1搭建高度定制化工作流(自动化篇)
7.5. 配图生成 目的:由于小红书发布文章要求图文格式,因此在生成文案的基础上,我们还需要生成图文搭配文案进行发布。 原实现思路: 起初我打算使用deepseek的文生图模型Janus进行本地部署生成,参考博客:De…...
罗德与施瓦茨ZNB20,矢量网络分析仪9KHz-20GHz
罗德与施瓦茨ZNB20矢量网络分析仪9KHz-20GHz R&SZNB20矢量网络分析仪 产品型号: ZNB20 产品品牌:罗德与施瓦茨 R&S 产品名称: 矢量网络分析仪 频率范围:9kHz - 20GHz R&S ZNB 矢量网络分析仪 良好的测量速度、动态范围和操作方便性&am…...
Linux 固定 IP 地址和网关
Linux 固定 IP 地址和网关 查看 IP ifconfig ifconfig eth0 ip addr ip addr show eth0 查看网关 ip route show route -n netstat -rn 设置固定 IP // 配置静态IP文件/etc/network/interfaces $ vi /etc/network/interfacesauto eth0 iface eth0 inet static addre…...
C++ ——const关键字
const关键字通常表示只读,不可修改,可以保证数据的安全性 1、修饰局部变量 const修饰的局部变量,叫做常局部变量,表示该局部变量不可被修改,这种用法常用于引用参数 2、修饰成员变量 const修饰的成员变量…...
MySQL:MySQL8.0 JSON类型使用整理,基于用户画像的案例
摘要:MySQL,JSON类型,多值索引, 用户画像 MySQL是结构化数据存储,JSON是非结构化格式,在MySQL中使用JSON类型可以打通关系型和非关系型数据的存储之间的界限,为业务提供更好的架构选择ÿ…...
Python MoviePy 视频处理全攻略:从入门到实战案例
第1章 环境安装与配置 # 案例1:安装MoviePy及FFmpeg !pip install moviepy # Windows安装FFmpeg:https://ffmpeg.org/download.html # Linux: sudo apt-get install ffmpeg# 验证安装 from moviepy.editor import * print("MoviePy版本:", __…...
30道Qt面试题(答案公布)
前五个答案 ✦ 1. Qt中常用的五大模块是哪些? Qt中常用的五大模块包括: • Qt Core:提供核心非GUI功能,如数据结构、文件操作、国际化等。 • Qt GUI:提供与平台无关的图形和基本窗口功能。 • Qt Widgets:提供用于创建传统桌面应用程序的UI组件。 • Qt Netw…...
深入解析 MySQL 数据删除操作:DELETE、TRUNCATE 与 DROP 的原理与选择
引言 在 MySQL 中,删除数据或表结构的操作看似简单,但不同操作(如 DELETE、TRUNCATE、DROP)背后的原理和适用场景差异巨大。错误选择可能导致性能问题或数据丢失!本文通过通俗的比喻、流程图和表格,带你深入理解它们的原理与差异。 DELETE 操作的原理 DELETE … IN 执…...
spring cloud gateway限流常见算法
目录 一、网关限流 1、限流的作用 1. 保护后端服务 2. 保证服务质量 (QoS) 3. 避免滥用和恶意攻击 4. 减少资源浪费 5. 提高系统可扩展性和稳定性 6. 控制不同用户的访问频率 7. 提升用户体验 8. 避免API滥用和负载过高 9. 监控与分析 10. 避免系统崩溃 2、网关限…...
华为FusionCompute虚拟化平台
一、华为FusionCompute虚拟化套件介绍 华为FusionCompute虚拟化套件是业界领先的虚拟化解决方案,能够帮助客户带来如下的价值,从而大幅提升数据中心基础设施的效率。 帮助客户提升数据中心基础设施的资源利用率;帮助客户成倍缩短业务上线周期…...
自然语言处理入门1——单词的表示和距离
随着DeepSeek的火爆,AI大模型越来越被大众所接受,我们在日常生活和工作学习中也开始越来越频繁的使用豆包、通义千问、Kimi、DeepSeek、文心一言等大模型工具了。这些大模型底层技术都是Transformer模型,属于自然语言处理范畴。 今天开始&am…...
UART(一)——UART基础
一、定义 UART(Universal Asynchronous Receiver/Transmitter)是一种广泛使用的串行通信协议,用于在设备间通过异步方式传输数据。它无需共享时钟信号,而是依赖双方预先约定的参数(如波特率)完成通信。 功能和特点 基本的 UART 系统只需三个信号即可提供稳健的中速全双工…...
【数据结构初阶第十节】队列(详解+附源码)
好久不见。。。别不开心了,听听喜欢的歌吧 必须有为成功付出代价的决心,然后想办法付出这个代价。云边有个稻草人-CSDN博客 目录 一、概念和结构 二、队列的实现 Queue.h Queue.c test.c Relaxing Time! ————————————《有没…...
确保设备始终处于最佳运行状态,延长设备的使用寿命,保障系统的稳定运行的智慧地产开源了
智慧地产视觉监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。通过计算机视觉和…...
SP字体UI放大代码
代码: echo off set QT_SCALE_FACTOR放大倍数 start "" "你的SP.exe启动路径"...
信息安全之网络安全防护
信息安全之网络安全防护 先来看看计算机网络通信面临的威胁: 截获——从网络上窃听他人的通信内容中断——有意中断他人在网络上的通信篡改——故意篡改网络上传送的报文伪造——伪造信息在网络上传送 截获信息的攻击称为被动攻击,而更改信息和拒绝用…...
idea无法联网,离线安装插件
插件地址:https://plugins.jetbrains.com/ JetBrains Marketplace 如果无法进入,可以试试 配置hosts 3.163.125.103 plugins.jetbrains.com ip 变了,可以查询个最新的: https://tool.chinaz.com/speedtest/plugins.jetbrai…...
数据结构——哈希表
一、哈希表 1.1 哈希表的概念 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函…...
学习查看 linux 关于进程的文件信息 cat /proc/968/status
(1) 在 Linux 系统中,/proc 文件系统是一个伪文件系统,提供了一个接口来访问内核数据结构。/proc/[pid]/status 文件包含了关于特定进程的状态信息。当你运行 cat /proc/968/status 时,它会输出与进程 ID 为 968 的进程…...
记一次一波三折的众测SRC经历
视频教程和更多福利在我主页简介或专栏里 (不懂都可以来问我 专栏找我哦) 目录: 前言 波折一:RCE漏洞利用失败 波折二:SQL时间盲注 波折三:寻找管理后台 总结 前言 先谈个人SRC心得体会吧,我虽…...
python绘图之箱型图
箱型图(Boxplot),也称为箱线图或盒须图,是一种用于展示一组数据的分布情况的统计图表。它通过简洁的图形形式,直观地呈现数据的集中趋势、离散程度、偏态以及异常值等信息。本节我们来学习使用python绘制箱型图 # 导入…...
http 响应码影响 video 标签播放视频
背景 使用后端给的文件下载接口地址实现视频播放,但是 video 标签一直无法播放视频如下图,把接口地址放到浏览器请求能直接下载。但就是不能播放 原因 http 响应码不正确,返回201是无法播放视频200可以如下图 状态码的影响: 20…...
【ClickHouse 特性及应用场景】
Clickhouse是一个用于联机分析处理(OLAP)的列式数据库管理系统(columnar DBMS)。 传统数据库在数据大小比较小,索引大小适合内存,数据缓存命中率足够高的情形下能正常提供服务。但残酷的是,这种…...
【基础架构篇九】《DeepSeek模型版本管理:Git+MLflow集成实践》
各位在模型迭代中反复去世的炼丹师们,扔掉你们那些混乱的v1.2.3_final_fix2模型压缩包!今天我们不聊什么单纯的Git分支管理,也不讲MLflow的入门教程,而是直接掀开算法迭代的黑箱,手把手教你用"外科手术级"的版本控制方案,让模型迭代从玄学变成精准的流水线作业…...
EasyExcel 自定义头信息导出
需求:需要在导出 excel时,合并单元格自定义头信息(动态生成),然后才是字段列表头即导出数据。 EasyExcel - 使用table去写入:https://easyexcel.opensource.alibaba.com/docs/current/quickstart/write#%E4%BD%BF%E7%94%A8table%E…...
MySQL 之INDEX 索引(Index Index of MySQL)
MySQL 之INDEX 索引 1.4 INDEX 索引 1.4.1 索引介绍 索引:是排序的快速查找的特殊数据结构,定义作为查找条件的字段上,又称为键 key,索引通过存储引擎实现。 优点 大大加快数据的检索速度; 创建唯一性索引,保证数…...
Linux驱动学习(二)--字符设备
设备分类 字符设备块设备网络设备 内核结构图: 字符设备号 字符设备号是32位的无符号整型值 高12位:主设备号低20位:次设备号 查看设备号 cat /proc/devices 设备号构造 直接使用宏MKDEV #define MKDEV(ma,mi) (((ma) << MINORBITS…...
计算机毕业设计--基于深度学习技术(Yolov11、v8、v7、v5)算法的高效人脸检测模型设计与实现(含Github代码+Web端在线体验界面)
基于深度学习技术(Yolov11、v8、v7、v5)算法的高效人脸检测模型 Yolo算法应用之《基于Yolo的花卉识别算法模型设计》,请参考这篇CSDN作品👇 计算机毕业设计–基于深度学习技术(Yolov11、v8、v7、v5)算法的…...
leetcode-414.第三大的数
leetcode-414.第三大的数 code review! 文章目录 leetcode-414.第三大的数一.题目描述二.代码提交 一.题目描述 二.代码提交 class Solution { public:int thirdMax(vector<int>& nums) {set<int> set_v(nums.begin(), nums.end());auto it set_v.rbegin()…...
使用API有效率地管理Dynadot域名,参与过期域名竞价
关于Dynadot Dynadot是通过ICANN认证的域名注册商,自2002年成立以来,服务于全球108个国家和地区的客户,为数以万计的客户提供简洁,优惠,安全的域名注册以及管理服务。 Dynadot平台操作教程索引(包括域名邮…...
iOS 上自定义编译 FFmpeg
在 iOS 上自定义编译 FFmpeg 是一个复杂但非常灵活的过程。通过自定义编译,您可以选择启用或禁用特定的功能和编解码器,以满足项目的需求,同时减少二进制文件的大小。 1. 自定义编译 FFmpeg 1.1 准备工作 在开始编译之前,您需要以下工具和环境: macOS:运行编译的主机。…...
解锁 JavaScript 异步编程:Promise 链式操作、async/await 与 Promise.all 深度剖析
1.引言 在 JavaScript 的世界里,异步编程是一个核心且关键的概念。随着 Web 应用的复杂度不断提升,处理多个异步操作的需求也日益增长。传统的回调函数方式容易陷入 “回调地狱”,让代码的可读性和可维护性大打折扣。而 Promise 的出现为异步编程带来了新的曙光,后续又衍生…...
30 款 Windows 和 Mac 下的复制粘贴软件对比
在日常电脑操作中,复制粘贴是极为高频的操作,一款好用的复制粘贴软件能极大提升工作效率。以下为你详细介绍 30 款 Windows 和 Mac 下的复制粘贴软件,并对比它们的优缺点,同时附上官网下载地址,方便大家获取软件。 Pa…...
复现论文:DPStyler: Dynamic PromptStyler for Source-Free Domain Generalization
论文:[2403.16697] DPStyler: Dynamic PromptStyler for Source-Free Domain Generalization github: TYLfromSEU/DPStyler: DPStyler: Dynamic PromptStyler for Source-Free Domain Generalization 论文: 这篇论文还是在PromptStyler:Prompt-driven Style Gener…...
【数据库维护】Clickhouse数据库维护关键系统表相关指标说明,支撑定位慢SQL及多实例场景下分析各实例运行情况
背景 当前使用环境上以Docker容器化部署Clickhouse服务8个实例,但在实际运行过程中,发现8个实例内存负载不均衡,ck-0实例在固定时间段内存会直线上升,直至服务报错memory exceeded max memory limit。 为排查ck-0节点内存直线上升…...
java爬虫抓取网页搜索数据
首先访问这个使用必应并搜索想要的内容 https://www.bing.com/images/search?q[把这里替换成想要的搜索内容] 按下f12来查看源码 我们可以找到a.iusc这个元素可以获取图片的源地址 注意,直接选中网页上的图片只能看到它的缩略图在哪。 由此可以编写出来爬虫脚本来…...
智能编程助手功能革新与价值重塑之:GitHub Copilot
引言: GitHub Copilot 的最新更新为开发者带来了显著变化,其中 Agent Mode 功能尤为引人注目。该模式能够自动识别并修复代码错误、自动生成终端命令,并具备多级任务推理能力,这使得开发者在开发复杂功能时,可大幅减少…...
Linux3-文件io、时间有关函数
一、前情回顾 1.当scanf输入10\n直接结束程序,因为scanf接收了10,fgets(接收了\n结束程序), 因此可以加一个getchar();消耗一个\n。 2.fgets();所接收的\n利用buff[strlen(buff)-1]0; 二、文件io 1.目的:…...
VScode运行C语言提示“#Include错误,无法打开源文件stdio.h”
C/C环境配置 参考: VS Code 配置 C/C 编程运行环境(保姆级教程)_vscode配置c环境-CSDN博客 基本步骤 - 安装MinGW-W64,其包含 GCC 编译器:bin目录添加到环境变量;CMD 中输入gcc --version或where gcc验证…...
【Linux】线程全解:概念、操作、互斥与同步机制、线程池实现
🎬 个人主页:谁在夜里看海. 📖 个人专栏:《C系列》《Linux系列》《算法系列》 ⛰️ 道阻且长,行则将至 目录 📚一、线程概念 📖 回顾进程 📖 引入线程 📖 总结 &a…...
【第4章:循环神经网络(RNN)与长短时记忆网络(LSTM)— 4.3 RNN与LSTM在自然语言处理中的应用案例】
咱今天来聊聊在人工智能领域里,特别重要的两个神经网络:循环神经网络(RNN)和长短时记忆网络(LSTM),主要讲讲它们在自然语言处理里的应用。你想想,平常咱们用手机和别人聊天、看新闻、听语音助手说话,背后说不定就有 RNN 和 LSTM 在帮忙呢! 二、RNN 是什么? (一)…...