高并发环境下超发现象的详细分析,包含场景示例、影响分析及解决方案(悲观锁、乐观锁、分布式锁)
以下是针对高并发环境下超发现象的详细分析,包含场景示例、影响分析及解决方案:
高并发下的超发详解
1. 超发现象定义
超发(Over-issuance)指在并发操作中,系统实际发放的资源(如商品库存)超过实际可用量。例如,用户下单时系统显示库存充足,但实际扣减后库存为负数,导致超发。
2. 超发现象的典型场景
场景示例:商品抢购
假设某商品库存为 100
,在高并发环境下,多个用户同时发起购买请求,可能导致以下流程:
3. 超发现象的时间线分析(表格)
|
超发现象结果:
- 线程1和线程2在开始阶段都同时读入库存为1,但是在T3时刻线程1扣减库存后产品就没有库存了,线程2此时并不会感知线程1的这个操作,而是继续按自己原有的判断,按照库存为1扣减库存,这样就出现了T4时刻库存为−1,而T6时刻插入错误记录的超发现象在高并发的环境下,除了考虑超发的问题,还应该考虑性能问题,因为速度太慢会影响用户的体验。
4. 超发现象的影响
- 数据不一致:
- 库存显示与实际不符,导致用户收到订单但商品已售罄。
- 系统账目混乱,可能引发财务问题。
- 用户体验差:
- 用户支付后无法收到商品,引发投诉。
- 系统稳定性:
- 频繁的超发现象可能导致系统崩溃或数据损坏。
5. 超发的根源分析
超发现象的根本原因是 并发操作未保证原子性和一致性。具体原因如下:
- 读-修改-写操作的非原子性:
- 多个线程同时读取库存,各自计算后写回,导致覆盖。
- 缺乏锁机制:
- 未对共享资源(如库存)加锁,导致多个线程同时修改。
- 事务隔离级别不足:
- 默认的读已提交(Read Committed)隔离级别无法避免脏读或不可重复读。
6. 解决方案:悲观锁与乐观锁
6.1 悲观锁(Pessimistic Lock)
悲观锁是使用数据库内部的锁对记录进行加锁,从而使其他事务等待,以保证数据的一致性。但这样会造成过多的等待和事务上下文的切换,导致系统运行缓慢,因为使用悲观锁时资源只能被一个事务锁持有,所以悲观锁也被称为独占锁或者排他锁
原理:
通过数据库锁(如 SELECT FOR UPDATE
)独占资源,阻塞其他事务,确保操作原子性。
实现步骤:
-
加锁查询:
SELECT * FROM product WHERE id = 1 FOR UPDATE; -- 加锁查询库存
-
扣减库存:
UPDATE product SET stock = stock - 1 WHERE id = 1;
代码示例(Spring Boot + MyBatis):
@Service
public class ProductService {@Autowiredprivate ProductMapper productMapper;@Transactional(rollbackFor = Exception.class)public boolean deductStockWithPessimisticLock(Long productId, Integer quantity) {// 1. 加锁查询库存Product product = productMapper.queryForUpdate(productId);if (product == null || product.getStock() < quantity) {throw new RuntimeException("库存不足");}// 2. 扣减库存(锁定期间数据一致)productMapper.deductStock(productId, quantity);return true;}
}// Mapper接口
public interface ProductMapper {// 悲观锁查询(锁定行)@Select("SELECT * FROM product WHERE id = #{id} FOR UPDATE")Product queryForUpdate(@Param("id") Long id);// 扣减库存@Update("UPDATE product SET stock = stock - #{quantity} WHERE id = #{id}")void deductStock(@Param("id") Long id, @Param("quantity") Integer quantity);
}
优点:
- 数据一致性强,避免超发。
- 实现简单,直接依赖数据库锁。
缺点:
- 阻塞导致吞吐量低,高并发下性能下降。
- 易引发死锁(如多个线程相互等待锁)。
6.2 乐观锁(Optimistic Lock)
乐观锁是一种不使用数据库锁的机制,不会造成线程的阻塞,而是采用多版本号机制来实现请求。但是,因为版本的冲突造成请求失败的概率剧增,所以这时往往需要通过重入机制降低请求失败的概率。不过,多次的重入会带来过多运行SQL语句的问题。为了克服这个问题,可以考虑使用按时间戳或者限定重入次数的办法。可,乐观锁是一个相对复杂的机制
—比较交换(compare and swap,CAS)
—比较交换(compare and swap,CAS)方案会引发一种ABA问题
在T2到T5时刻,线程1计算剩余商品总价格的时候,当前库存会被线程2修改,它是一个
A→B→A的过程,所以被形象地称为“ABA问题”。换句话说,线程1在计算剩余商品总价格时,当前库存是一个变化的值,这样就可能出现错误的计算。显然,表14-2所示的共享值回退导致了数据的不一致,为了克服这个问题,开发者引入了一些规则,典型的如增加版本号(version),并且规定:只要操作过程中修改共享值,无论业务是正常、回退还是异常,版本号只能递增,不能递减。使用这个规则重新执行数据库事务
使用版本号解决ABA问题
可以看出,由于版本号只能递增而不能递减,因此无论是线程2进行扣减库存还是回退商品,版本号都只会递增而不会递减,这样在T6时刻,线程1使用其保存的version旧值1与当前version值3进行比较,就会发现商品被修改过了,数据已经不可信,于是便取消业务。
加入版本号导致失败数量多,请求量大,对数据库造成压力,一般会考虑使用限制时间或者重入次数的办法,压制过多的SQL语句被运行。
因为加入了版本号的判断,所以大量的请求得到了失败的结果,而且这个失败率有点高。下面我们要处理这个问题。在上面的测试中,可以看到大量的请求更新失败。为了处理这个问题,乐观锁还可以引入重入机制,也就是一旦更新失败,就重新做一次,因此有时候也可以称乐观锁为可重入的锁。其原理是一旦发现版本号被更新,不结束请求,而是重新运行一次乐观锁流程,直至成功为止。但是流程的重入可能造成大量的SQL语句被运行。例如,原本一个请求需要运行3条SQL语句,如果需要重入4次才能成功,那么就会有十几条SQL语句被运行,在高并发场景下,会给数据库带来很大的压力。为了克服这个问题,一般会考虑使用限制时间或者重入次数的办法,压制过多的SQL语句被运行。
按时间戳重入的乐观锁测试
进入方法后则记录了开始时间,然后进入循环。在执行业务逻辑之前,先判断结束时间
(end)和开始时间(start)的时间戳。如果循环时间小于等于100 ms,则继续尝试;如果大于100 ms,则返回失败。在扣减库存的时候,如果扣减成功,则返回更新条数不为0;如果为0,则扣减失败,进入下一次循环,直至扣减成功或者超时
按时间戳限制重入的方法也有一个弊端,就是系统会因为自身的忙碌而大大减少重入的次数。因此有时候也会采用限定重入次数的机制来避免重试过多
但是按时间戳限制重入的方法也有一个弊端,就是系统会因为自身的忙碌而大大减少重入的次数。因此有时候也会采用限定重入次数的机制来避免重试过多的情况,不同的地方在于使用for循环限定了最多3次尝试。在实际的测试中可以发现,请求失败的次数也会大大降低
原理:
通过版本号(Version)或时间戳检测冲突,在提交时验证数据未被修改。若冲突则回滚并重试。
实现步骤:
-
读取数据:
SELECT * FROM product WHERE id = 1; -- 读取库存和版本号
-
验证版本号:
UPDATE product SET stock = stock - 1, version = version + 1 WHERE id = 1 AND version = #{currentVersion}; -- 带版本号校验的更新
代码示例(Spring Boot + MyBatis):
@Service
public class ProductService {@Autowiredprivate ProductMapper productMapper;@Transactional(rollbackFor = Exception.class)public boolean deductStockWithOptimisticLock(Long productId,Integer quantity,int retryCount) {int retry = 0;while (retry < retryCount) {// 1. 获取当前库存和版本号Product product = productMapper.queryProduct(productId);if (product == null || product.getStock() < quantity) {throw new RuntimeException("库存不足");}// 2. 尝试扣减库存(带版本号校验)int affectedRows = productMapper.deductStockWithOptimisticLock(productId, quantity, product.getVersion());if (affectedRows > 0) {return true;}// 3. 版本冲突,重试retry++;try {Thread.sleep(10); // 避免频繁重试} catch (InterruptedException e) {Thread.currentThread().interrupt();}}throw new RuntimeException("库存扣减失败,版本冲突");}
}// Mapper接口
public interface ProductMapper {// 查询库存(不加锁)@Select("SELECT * FROM product WHERE id = #{id}")Product queryProduct(@Param("id") Long id);// 乐观锁扣减库存(带版本号校验)@Update("UPDATE product SET stock = stock - #{quantity}, version = version + 1 " +"WHERE id = #{id} AND version = #{version}")int deductStockWithOptimisticLock(@Param("id") Long id,@Param("quantity") Integer quantity,@Param("version") Integer version);
}
优点:
- 避免阻塞,高并发下吞吐量更高。
- 减少锁竞争,降低系统开销。
缺点:
- 需处理版本冲突,重试可能增加开销。
- 多次重试可能导致过多SQL语句执行。
7. 其他解决方案
7.1 分布式锁(如Redis)
通过Redis的SETNX
命令实现分布式锁,确保跨节点资源操作的原子性。
7.2 预扣减策略
- 预扣减缓存:将库存预扣减到缓存(如Redis),再异步更新数据库。
- 优点:减少数据库压力,提升性能。
- 缺点:需处理缓存与数据库的最终一致性。
7.3 限流降级
- 通过熔断器(如Hystrix)、限流算法(如令牌桶)限制并发请求,避免系统过载。
8. 总结
场景 | 推荐方案 | 原因 |
---|---|---|
高并发低冲突 | 乐观锁 | 减少锁竞争,提升吞吐量,版本冲突概率低时无需频繁重试。 |
高冲突且数据敏感 | 悲观锁 | 保证数据绝对一致性,适用于金融等对数据强一致要求高的场景。 |
混合场景 | 乐观锁+重试机制 | 结合版本号和有限次数的重试,在保证性能的同时降低冲突影响。 |
9. 关键代码注释说明
悲观锁代码关键点
SELECT FOR UPDATE
:锁定记录,阻塞其他事务。- 事务注解
@Transactional
:确保查询和更新操作的原子性。
乐观锁代码关键点
- 版本号字段
version
:记录数据修改次数。 - 重试机制:通过有限次数的重试降低版本冲突的影响。
通过以上方案,可以有效解决高并发下的超发现象,确保系统数据一致性与性能平衡。
相关文章:
高并发环境下超发现象的详细分析,包含场景示例、影响分析及解决方案(悲观锁、乐观锁、分布式锁)
以下是针对高并发环境下超发现象的详细分析,包含场景示例、影响分析及解决方案: 高并发下的超发详解 1. 超发现象定义 超发(Over-issuance)指在并发操作中,系统实际发放的资源(如商品库存)超过…...
Git 分支整合策略:Cherry-pick、Merge、Rebase 三者之间对比
Git 分支整合策略详解:Cherry-pick、Merge、Rebase 在日常的 Git 多分支协作开发中,代码合并是常见操作。Git 中主要提供以下三种方式来合并或迁移分支的提交: Cherry-pick:精确挑选部分提交复制到当前分支;Merge&am…...
嵌入式八股---计算机网络篇
前言 这块主要是结合着LWIP去理解计算机网络中常见的面试题 OSI四层/五层/七层模型 OSI分层(7层):物理层、数据链路层、网络层、传输层、会话层(http)、表示层(加密)、应用层。 TCP/IP分层(4层):网络接口层…...
使用 3D Layout 和 Icepak 进行 PCB、DCIR 和热分析
在本教程中,您将学习如何使用 3D Layout 执行 DCIR,然后使用功率损耗数据执行热分析。热分析将使用电子桌面 Icepak 进行。SIwave 及其嵌入式 icepak 可用于执行相同的分析,但有一个例外。电子桌面 Icepak 是一款功能齐全的 3D 工具。用户可以…...
UE5 Windows游戏窗口置顶
参考资料:UE5 UE4 项目设置全局置顶_ue4运行设置置顶-CSDN博客 修改完build.cs后,关掉重新生成解决方案。(不然可能编译报错,在这卡了半个小时) 不知道怎么用C的,可以用这个 Topmost - Keep Editor/Game w…...
【Linux】进程管理
一、程序与进程区别 1.程序: 存放在磁盘文件可执行文件(静态存在) 特点 静态性:程序是静态的,它只是一组指令的集合,在未被执行时,不会占用计算机的运行资源,也不会产生任何实际的…...
Android Studio PNG转SVG方法总结
在 Android Studio 中,将 PNG 位图转换为 SVG 矢量图并非直接内置的功能,但你可以通过以下步骤实现目标: 方法 1:使用在线转换工具 访问在线转换网站 推荐工具: CloudConvert Vector Magic OnlineConvertFree 上传…...
第6篇:Linux程序访问控制FPGA端LEDR<四>
Q:如何设计.c程序代码控制FPGA端外设LEDR动态显示? A:我们来设计程序实现简易计数器:将上一期点亮LEDR的程序代码*LEDR_ptr 0x2aa 改为 *LEDR_ptr *LEDR_ptr 1,读取LEDR端口的data寄存器,将寄存器值递增…...
DP扰码模块verilog仿真
在DisplayPort 1.4协议中,为了减少EMI,在8B/10B编码之前,需进行扰码Scramble。扰码用到了16-bit LFSR,表达式如下。 LFSR每移位8个bit后,用最高有效 8 位以相反的位顺序与一个字节数据进行异或从而实现数据加扰/解扰。…...
协作焊接机器人的应用场景
协作焊接机器人凭借其灵活性、安全性和高效性,在多个领域有着广泛的应用场景,以下是一些主要的方面: 汽车制造 车身焊接:在汽车车身生产线上,协作焊接机器人可与工人协同工作,完成车身各部件的焊接任务。例…...
深入解析计算机操作系统的底层架构与核心模块功能
深入解析计算机操作系统的底层架构与核心模块功能 一、操作系统底层架构总览 操作系统处于计算机系统的核心地位,是计算机硬件与用户之间的关键纽带,承担着资源管理者的重要角色。它负责统筹管理计算机的各类资源,如CPU、内存、存储设备以及…...
Elasticsearch 官网阅读学习笔记01
Elasticsearch 官网阅读学习笔记01 什么是 Elasticsearch? Elasticsearch 是位于 Elastic Stack 核心的分布式搜索和分析引擎。Elasticsearch 可为所有类型的数据提供近乎实时的搜索和分析。无论您拥有的是结构化或非结构化文本、数值数据还是地理空间数据 Elastic…...
玩转Docker | 使用Docker搭建Van-Nav导航站
玩转Docker | 使用Docker搭建Van-Nav导航站 前言一、Van-Nav介绍van-nav 简介主要特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署Van-Nav服务下载镜像创建容器检查容器状态检查服务端口安全设置四、访问Van-Nav应用访问Van-Nav首页登录后台管理五、添…...
若依 前后端部署
后端:直接把代码从gitee上拉去到本地目录 (https://gitee.com/y_project/RuoYi-Vue ) 注意下redis连接时password改auth 后端启动成功 前端:运行前首先确保安装了node环境,随后执行: !!一定要用管理员权限…...
笔记:头文件与静态库的使用及组织方式
笔记:头文件与静态库的使用及组织方式 1. 头文件的作用 接口声明:提供函数、类、变量等标识符的声明,供其他模块调用。编译依赖:编译器需要头文件来验证函数调用和类型匹配。避免重复定义:通过包含保护(如…...
PostgreSQL-常用命令
PostgreSQL 提供了丰富的命令行工具和 SQL 命令,用于管理和操作数据库。以下是一些常用的命令和操作: 1. 数据库管理 创建数据库 CREATE DATABASE dbname; 删除数据库 DROP DATABASE dbname; 列出所有数据库 \l SELECT datname FROM pg_database;…...
如何在 Postman(测试工具) 中实现 Cookie 持久化并保持同一会话
在开发基于 Spring Boot 的 Web 应用时,使用 Session 存储验证码等敏感信息是常见的做法。然而,在调试接口时,你可能会遇到这样一个问题:第一次请求接口时存入的验证码在第二次请求时无法获取,原因往往是两个请求所使用…...
粘性定位(position:sticky)——微信小程序学习笔记
1. 简介 CSS 中的粘性定位(Sticky positioning)是一种特殊的定位方式,它可以使元素在滚动时保持在视窗的特定位置,类似于相对定位(relative),但当页面滚动到元素的位置时,它会表现得…...
谷歌浏览器极速安装指南
目录 📋 准备工作 步骤一:访问官网 🌐 步骤二:获取安装包 ⬇️ 步骤三:一键安装 🖱️ 步骤四:首次启动设置 ⚙️ 步骤五:开始探索! 🌟 💬 …...
【2024年最新IEEE Trans】模糊斜率熵Fuzzy Slope entropy及5种多尺度,应用于状态识别、故障诊断!
引言 2024年11月,研究者在测量领域国际顶级期刊《IEEE Transactions on Instrumentation and Measurement》(IF 5.6,JCR 1区,中科院二区)上发表科学研究成果,以“Optimized Fuzzy Slope Entropy: A Comple…...
无人机击落技术难点与要点分析!
一、技术难点 1. 目标探测与识别 小型化和低空飞行:现代无人机体积小、飞行高度低(尤其在城市或复杂地形中),雷达和光学传感器难以有效探测。 隐身技术:部分高端无人机采用吸波材料或低可探测设计,进…...
Flink的数据流图中的数据通道 StreamEdge 详解
本文从基础原理到代码层面逐步解释 Flink 的数据通道 StreamEdge,尽量让初学者也能理解。 主要思路:从概念开始,逐步深入到实现细节,并结合伪代码来逐步推导。 第一步:什么是 StreamEdge? StreamEdge 是 F…...
OpenCV 图形API(25)图像滤波-----均值滤波(模糊处理)函数blur()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 使用归一化的方框滤波器模糊图像。 该函数使用以下核来平滑图像: K 1 k s i z e . w i d t h k s i z e . h e i g h t [ 1 1 ⋯ …...
基于频率约束条件的最小惯量需求评估,包括频率变化率ROCOF约束和频率最低点约束matlab/simulink
基于频率约束条件的最小惯量评估,包括频率变化率ROCOF约束和频率最低点约束matlab/simulink 1建立了含新能源调频的频域仿真传函模型,虚拟惯量下垂控制 2基于构建的模型,考虑了不同调频系数,不同扰动情况下的系统最小惯量需求...
.pdf,.docx,.doc文档在一页纸上显示4页内容(详细步骤)
生活中常见一页纸上显示4页内容,我们熟知的是打印文件时,选择“每页4版”,但如果也是为了方便阅读,想要设置成一张纸上显示4页内容,又该怎么做呢?下面分享.docx和.pdf文档,一张纸上显示4页内容的…...
基于CNN-BiLSTM-GRU的深度Q网络(Deep Q-Network,DQN)求解移动机器人路径规划,MATLAB代码
一、深度Q网络(Deep Q-Network,DQN)介绍 1、背景与动机 深度Q网络(DQN)是深度强化学习领域的里程碑算法,由DeepMind于2013年提出。它首次在 Atari 2600 游戏上实现了超越人类的表现,解决了传统…...
高并发场景下的 Java 性能优化
在当今数字化时代,高并发场景已成为众多 Java 应用面临的常态,如电商大促、在线直播等活动期间,系统需承受巨大的访问压力。因此,Java 性能优化在高并发场景下显得尤为重要。传统的人工编写代码优化方式不仅耗时费力,还…...
Java 设计模式:观察者模式详解
Java 设计模式:观察者模式详解 观察者模式(Observer Pattern)是一种行为型设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生变化时,所有依赖它的对象都会收到通知并自动更新。这种模式广泛…...
Linux vagrant 导入Centos
前言 vagrant 导入centos 虚拟机 前提要求 安装 virtualbox 和vagrant<vagrant-disksize> (Linux 方式 Windows 方式) 创建一键部署centos 虚拟机 /opt/vagrant 安装目录/opt/VirtualBox 安装目录/opt/centos8/Vagrantfile (可配置网络IP,内存…...
linux Ubuntu 如何删除文件,错误删除后怎么办?
一、删除文件的常用方法 命令行删除 普通删除:rm 文件名 (示例:rm old_file.txt) 强制删除(无提示):rm -f 文件名 (示例:rm -f locked_file.txt) 删除目录…...
【前端】事件循环专题
引入 以下情况是为什么呢? //q1 for (var i 0; i < 3; i) {setTimeout(() > {console.log(i);}, 1000); } // console: // 3 // 3 // 3//q2 let name;setTimeout(() > {name name;console.log(name); }, 1000);if (name) {name newname;console.log(n…...
3DMAX笔记-UV知识点和烘焙步骤
1. 在展UV时,如何点击模型,就能选中所有这个模型的uv 2. 分多张UV时,不同的UV的可以设置为不同的颜色,然后可以通过颜色进行筛选。 3. 烘焙步骤 摆放完UV后,要另存为一份文件,留作备份 将模型部件全部分成…...
【深度学习】PyTorch实现VGG16模型及网络层数学原理
一、Demo概述 代码已附在文末 1.1 代码功能 ✅ 实现VGG16网络结构✅ 在CIFAR10数据集上训练分类模型 1.2 环境配置 详见【深度学习】Windows系统Anaconda CUDA cuDNN Pytorch环境配置 二、各网络层概念 2.1 卷积层(nn.Conv2d) nn.Conv2d(in_cha…...
Spring 事务
29.Spring管理事务的方式有几种? Spring中的事务分为编程式事务和声明式事务。 编程式事务是在代码中硬编码,通过 TransactionTemplate或者 TransactionManager 手动管理事务,事务范围过大会出现事务未提交导致超时,比较适合分布…...
GPT - TransformerDecoderBlock
本节代码定义了一个 TransformerDecoderBlock 类,它是 Transformer 架构中解码器的一个基本模块。这个模块包含了多头自注意力(Multi-Head Attention)、前馈网络(Feed-Forward Network, FFN)和层归一化(Lay…...
【C语言】预处理(预编译)(C语言完结篇)
一、预定义符号 前面我们学习了C语言的编译和链接。 在C语言中设置了一些预定义符号,其可以直接使用,预定义符号也是在预处理期间处理的。 如下: 可以看到上面的预定义符号,其都有两个短下划线,要注意的是ÿ…...
【Kubernetes】Kubernetes 如何进行日志管理?Fluentd / Loki / ELK 适用于什么场景?
由于 Kubernetes 运行在容器化的环境中,应用程序和系统日志通常分布在多个容器和节点上,传统的日志管理方法(例如直接访问每个节点的日志文件)在 Kubernetes 中不适用。 因此,Kubernetes 引入了集中式日志管理方案&am…...
从 SaaS 到 MCP:构建 AI Agent 生态的标准化服务升级之路
从 SaaS 到 MCP:构建 AI Agent 生态的标准化服务升级之路 —— 以数据连接器 dslink 的技术改造实践为例 引言:AI Agent 时代的 SaaS 服务范式转型 在生成式 AI 爆发式发展的 2025 年,AI Agent 已从概念验证走向企业级应用落地,…...
Linux 入门五:Makefile—— 从手动编译到工程自动化的蜕变
一、概述:Makefile—— 工程编译的 “智能指挥官” 1. 为什么需要 Makefile? 手动编译的痛点:当工程包含数十个源文件时,每次修改都需重复输入冗长的编译命令(如gcc file1.c file2.c -o app),…...
CST入门教程:如何从SYZ参数提取电容C和电感L --- 双端口
上期解释了单端口计算S参数,然后后处理很容易提取L或C,已经满足基本需求。 这期我们看复杂一点的情况,电路中放两个端口,比如S2P: 或集总电路: 或导入SPICE: 两个端口的Y和Z参数就是四个量了,Y…...
桌面版本及服务器版本怎么查看网络源软件包的url下载路径
服务器版本: ### 利用yumdownloader工具 - 首先安装yum-utils软件包,它包含yumdownloader工具。执行命令: bash yum install yum-utils - 安装完成后,使用yumdownloader --urls <package_name>命令来获取软件包的下载UR…...
汽车零部件产线节能提效,工业网关解锁数据采集 “密码”
在汽车零部件生产领域,高效的生产监控与精准的数据采集至关重要。工业网关作为智能工厂的关键枢纽,正发挥着不可替代的作用,助力产线实现电表等多种仪表数据的采集与高效监控。 背景简析 汽车零部件产线涉及众多设备与环节,各类电…...
量化策略分类、优劣势及对抗风险解析
一、常见量化策略分类及优劣势 1. 趋势跟踪策略(Trend Following) 原理:通过捕捉价格趋势(如均线突破、动量指标)进行交易。 代表模型:海龟交易法则、Dual Thrust。 优势: 在强趋势市场&am…...
Linux调试工具——gdb/cgdb
📝前言: 这篇文章我们来讲讲Linux调试工具——gdb/cgdb: 🎬个人简介:努力学习ing 📋个人专栏:Linux 🎀CSDN主页 愚润求学 🌄其他专栏:C学习笔记,C…...
SQLite + Redis = Redka
Redka 是一个基于 SQLite 实现的 Redis 替代产品,实现了 Redis 的核心功能,并且完全兼容 Redis API。它可以用于轻量级缓存、嵌入式系统、快速原型开发以及需要事务 ACID 特性的键值操作等场景。 功能特性 Redka 的主要特点包括: 使用 SQLi…...
使用 Terraform 部署 Azure landing zone
Azure 登陆区是架构完善的环境,遵循 Microsoft 针对 Azure 云架构的最佳实践。它们为团队运行工作负载提供了良好管理的基础,从而提供了可扩展性并促进了云的采用。 如果您有兴趣部署 Azure 登陆区,Terraform 是一个不错的选择。本教程概述的…...
【搭建博客网站】老旧笔记本“零成本逆袭”
写在前面:本博客仅作记录学习之用,部分图片来自网络,如需引用请注明出处,同时如有侵犯您的权益,请联系删除! 文章目录 前言博客网站搭建免费域名本地主机安装虚拟机安装宝塔及配置花生壳内网穿透 磁盘扩容 …...
XHR、FetchAxios详解网络相关大片文件上传下载
以下是 XHR(XMLHttpRequest) 与 Fetch API 的全面对比分析,涵盖语法、功能、兼容性等核心差异: 一、语法与代码风格 XHR(基于事件驱动) 需要手动管理请求状态(如 onreadystatechange 事件)和错误处理,代码冗长且易出现回调地狱。 const xhr = new XMLHttpRequest(); x…...
共享内存(与消息队列相似)
目录 共享内存概述 共享内存函数 (1)shmget函数 功能概述 函数原型 参数解释 返回值 示例 结果 (2)shmat函数 功能概述 函数原型 参数解释 返回值 (3)shmdt函数 功能概述 函数原型 参数解释…...
【3D开发SDK】HOOPS SDKS如何在BIM行业运用?
Tech Soft 3D提供了支持核心功能的软件开发工具,使开发人员可以使用Windows,Linux,OSX和移动平台等广泛的平台来构建巨大而复杂的建筑和BIM应用程序。HOOPS SDK支持多种格式的CAD导入和3D查看技术。这些技术受到了Trimble,RIB&…...