高并发场景下解决并发数据不一致
简单的场景:
全量数据更新的情况下, 不在乎同一秒的请求都必须要成功, 只留下最新的更新请求数据
- 方案常用的是
1、数据库增加时间戳标识实现的乐观锁, 请求参数从源头带上微秒或者毫秒时间戳数据库存储, 然后在更新SQL语句上比较 (数据库的时间 < 参数传递的时间)
例如:
ALTER TABLE mytable ADD accessTime DATETIME(6) DEFAULT CURRENT_TIMESTAMP(6) not null comment ‘请求源头时间(精度高),用于更新比较,解决并发修改’;
UPDATE mytable SET updateTime = ?, accessTime=? WHERE
statusId = ?
AND
(IFNULL(accessTime, DATE_SUB(NOW(), INTERVAL 2 MINUTE)) < ?);
复杂场景:
比如, 更新数据时候不是全量数据更新的方式, 可能是增量更新或者是覆盖部分更新;
场景: 比如MongoDB数据库, 文档中的某个object字段下有很多key:value,
[图片]
一种并发情况: 并发A、B请求的时候, 他们的请求参数分别新增加不同的object字段下的Key, 或者是覆盖key, 这种新增Key的情况下需要并发的A、B请求都要成功,
{properties.label":24.700000}
{properties.thermostat.localTemp":24.800000}
另外一种情况: 并发A、B请求的时候, 他们的请求参数分别相同的object字段下的Key, 这种情况下需要并发的A、B请求只要最新请求能成功, 比如是A是先请求, B后请求, 那么就不能存在数据库最终存储的数据是A的;
{properties.thermostat.localTemp":24.700000}
{properties.thermostat.localTemp":24.800000}
- 方案
基于时间戳的乐观锁方式 + 判断keys的hash算法, 具体如下
请求参数源码增加一个时间戳, 透传到数据库存储;
根据请求测试里面的所有的keys , 按规则排序, 后进行hash算法计算出值, 然后插入到表里面;
后面更新判断hash算法是否一致, 不一致则判断为增量更新, 不用判断时间戳让其更新成功;
如果hash算法一致则判定为一致, 需要判断数据库时间戳 < 传递的时间戳;
并且这个判断不能在程序中实现, 比如先查询出来然后再比较, 后更新, 这种方式不是原子性的;
但是这种方法还是存在缺陷, 比如:
A线程先请求 参数是: b=2 {“fanMode”: “auto1”, “speedPercent”: 0} A 由于hash不同也能更新成功, 最终b=2, 但是由于是B后请求是, 其实最终数据要b=1
B线程后请求 参数是: b=1 {“fanMode”: “auto2”} B先执行成功;
上面方法主要是解决相邻的2个间隔短的相同key参数请求 - 伪代码:
// 并发控制, 组装请求参数的TreeSet排序的keys-1
Set propertiesKeys = new TreeSet<>();
for (Map.Entry<String, Object> entry : properties.entrySet()) {
if (entry.getValue() == null) {
continue;
}
// 并发控制, 组装请求参数的keys-2
propertiesKeys.add(entry.getKey());
recursiveCalculationAddKeys(entry.getValue(), propertiesKeys);
}
// 并发控制, 获取keys_Md5-3
String string = propertiesKeys.toString();
String md5DigestAsHex = DigestUtils.md5DigestAsHex(string.getBytes(StandardCharsets.UTF_8));
deviceStatus.setPropertiesKeysMd5(md5DigestAsHex);
request.setCompareAccessTime(Boolean.TRUE);
public static void recursiveCalculationAddKeys(Object value, Set propertiesKeys) {
if (Objects.isNull(value)){
return;
}
String type = value.getClass().getSimpleName();
if (value instanceof Map || type.endsWith(“HashMap”)) {
Map<String, Object> valueMap = (Map<String, Object>) value;
valueMap.forEach((k, v) -> {
propertiesKeys.add(k);
// 递归处理所有是map的值
recursiveCalculationAddKeys(v, propertiesKeys);
});
}
// 处理是List的情况
if (value instanceof List || type.endsWith("ArrayList")){List<Object> valueList = (List<Object>) value;valueList.forEach(el->{// 递归处理所有是map的值recursiveCalculationAddKeys(el, propertiesKeys);});
}
}
Criteria criteriaVar2 = Criteria.where(“statusId”).is(oldDs.getStatusId());
Query queryVar2 = new Query(criteriaVar2);
if (compareAccessTime) {
// md5比较存在情况下增加查询条件&走单更新方法
criteriaVar2.orOperator(
Criteria.where(“propertiesKeysMd5”).is(propertiesKeysMd5).and(“accessTime”).lt(accessTime),
Criteria.where(“accessTime”).is(null),
Criteria.where(“propertiesKeysMd5”).is(null),
Criteria.where(“propertiesKeysMd5”).ne(propertiesKeysMd5)
); // 匹配空值
queryVar2 = new Query(criteriaVar2);
}
mongoTemplate.findAndModify(queryVar2, update, Map.class, “…”)
1
相关文章:
高并发场景下解决并发数据不一致
简单的场景: 全量数据更新的情况下, 不在乎同一秒的请求都必须要成功, 只留下最新的更新请求数据 方案常用的是 1、数据库增加时间戳标识实现的乐观锁, 请求参数从源头带上微秒或者毫秒时间戳数据库存储, 然后在更新SQL语句上比较 (数据库的时间 < 参数传递的时间) 例如: A…...
OpenAI GPT-o1实现方案记录与梳理
本篇文章用于记录从各处收集到的o1复现方案的推测以及介绍 目录 Journey Learning - 上海交通大学NYUMBZUAIGAIRCore IdeaKey QuestionsKey TechnologiesTrainingInference A Tutorial on LLM Reasoning: Relevant methods behind ChatGPT o1 - UCL汪军教授Core Idea先导自回归…...
Excel:vba实现生成随机数
Sub 生成随机数字()Dim randomNumber As IntegerDim minValue As IntegerDim maxValue As Integer 设置随机数的范围(假入班级里面有43个学生,学号是从1→43)minValue 1maxValue 43 生成随机数(在1到43之间生成随机数)randomNumber Application.WorksheetFunctio…...
Python | Leetcode Python题解之第506题相对名次
题目: 题解: class Solution:desc ("Gold Medal", "Silver Medal", "Bronze Medal")def findRelativeRanks(self, score: List[int]) -> List[str]:ans [""] * len(score)arr sorted(enumerate(score), …...
安全见闻(6)
声明:学习视频来自b站up主 泷羽sec,如涉及侵权马上删除文章 感谢泷羽sec 团队的教学 视频地址:安全见闻(6)_哔哩哔哩_bilibili 学无止境,开拓自己的眼界才能走的更远 本文主要讲解通讯协议涉及的安全问题。…...
Promise、async、await 、异步生成器的错误处理方案
1、Promise.all 的错误处理 Promise.all 方法接受一个 Promise 数组,并返回所有解析 Promise 的结果数组: const promise1 Promise.resolve("one"); const promise2 Promise.resolve("two");Promise.all([promise1, promise2]).…...
腾讯云:数智教育专场-学习笔记
15点13分2024年10月21日(短短5天的时间,自己的成长速度更加惊人)-开始进行“降本增效”学习模式,根据小米手环对于自己的行为模式分析(不断地寻找数据之间的关联性),每天高效记忆时间࿰…...
Ovis: 多模态大语言模型的结构化嵌入对齐
论文题目:Ovis: Structural Embedding Alignment for Multimodal Large Language Model 论文地址:https://arxiv.org/pdf/2405.20797 github地址:https://github.com/AIDC-AI/Ovis/?tabreadme-ov-file 今天,我将分享一项重要的研…...
python的Django的render_to_string函数和render函数模板的使用
一、render_to_string render_to_string 是 Django 框架中的一个便捷函数,用于将模板渲染为字符串。 render_to_string(template_name.html, context, requestNone, usingNone) template_name.html:要渲染的模板文件的名称。context:传递给…...
基于Python大数据的王者荣耀战队数据分析及可视化系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
【Linux学习】(3)Linux的基本指令操作
前言 配置Xshell登录远程服务器Linux的基本指令——man、cp、mv、alias&which、cat&more&less、head&tail、date、cal、find、grep、zip&tar、bc、unameLinux常用热键 一、配置Xshell登录远程服务器 以前我们登录使用指令: ssh 用户名你的公网…...
Mac 使用脚本批量导入 Apple 歌曲
最近呢,买了一个 iPad,虽然家里笔记本台式都有,显示器都是 2个,比较方便看代码(边打游戏边追剧)。 但是在床上拿笔记本始终还是不方便,手机在家看还是小了点,自从有 iPad 之后&…...
全桥PFC电路及MATLAB仿真
一、PFC电路原理概述 PFC全称“Power Factor Correction”(功率因数校正),PFC电路即能对功率因数进行校正,或者说是能提高功率因数的电路。是开关电源中很常见的电路。功率因数是用来描述电力系统中有功功率(实际使用…...
【安当产品应用案例100集】025-确保数据安全传输——基于KMS与HSM的定期分发加密解决方案
引言: 在当今快速发展的数字化时代,企业面临着前所未有的信息安全挑战。尤其是在需要向供应商定期分发敏感数据的情况下,如何保证这些数据在传输过程中的安全性变得至关重要。为此,我们推出了结合安当KMS密钥管理平台与HSM密码机…...
十 缺陷检测解决策略之三:频域+空域
十 缺陷检测解决策略之三:频域空域 read_image (Image, 矩形) * 中间低频,四周高频 fft_image (Image, ImageFFT) * 中间低频,四周高频 fft_generic (Image, ImageFFT1, to_freq, -1, sqrt, dc_center, complex) * 中间高频,四周低频 rft_ge…...
有望第一次走出慢牛
A股已走完30多年历程。 大约每十年,会经历一轮牛熊周期。特点是每一轮周期,大约九成的时间都是熊市主导。就是我们常说的 快牛慢熊。 这一次,会不会重复历史? 历史不会简单重复。已经感受到了盘面的变化。 有人说,股市爆涨爆…...
计算机网络(十二) —— 高级IO
#1024程序员节 | 征文# 目录 一,预备 1.1 重新理解IO 1.2 五种IO模型 1.3 非阻塞IO 二,select 2.1 关于select 2.2 select接口参数解释 2.3 timeval结构体和fd_set类型 2.4 socket就绪条件 2.5 select基本工作流程 2.6 简单select的服务器代…...
电力行业 | 等保测评(网络安全等级保护)工作全解
电力行业为什么要做网络安全等级保护? 电力行业是关系到国家安全和社会稳定的基础性行业,电力行业信息化程度相对较高,是首批国家信息安全等级保护的重点行业。 01 国家法律法规的要求 1994《计算机信息系统安全保护条例》(国务…...
总裁主题CeoMax-Pro主题7.6开心版
激活方式: 1.授权接口源码ceotheme-auth-api.zip搭建一个站点,绑定www.ceotheme.com域名,并配置任意一个域名的 SSL 证书。 2.在 hosts 中添加:127.0.0.1 www.ceotheme.com 3.上传class-wp-http.php到wp-includes目录ÿ…...
深入探讨编程的核心概念、学习路径、实际应用以及对未来的影响
在当今这个数字化时代,编程已成为连接现实与虚拟世界的桥梁,它不仅塑造了我们的生活方式,还推动了科技的飞速发展。从简单的网页制作到复杂的人工智能系统,编程无处不在,其重要性不言而喻。本文旨在深入探讨编程的核心…...
3大核心步骤打造专属翻译引擎:Zotero PDF Translate高级扩展指南
3大核心步骤打造专属翻译引擎:Zotero PDF Translate高级扩展指南 【免费下载链接】zotero-pdf-translate 支持将PDF、EPub、网页内容、元数据、注释和笔记翻译为目标语言,并且兼容20多种翻译服务。 项目地址: https://gitcode.com/gh_mirrors/zo/zoter…...
保姆级教程:MogFace人脸检测模型-large快速上手,无需代码轻松体验
保姆级教程:MogFace人脸检测模型-large快速上手,无需代码轻松体验 1. 认识MogFace人脸检测模型 1.1 什么是MogFace MogFace是目前最先进的人脸检测方法之一,在Wider Face六项榜单上长期保持领先地位。这个模型通过三个创新点显著提升了检测…...
从IMU初始化到点云去畸变:深入Fast-LIO2的传感器融合核心流程
从IMU初始化到点云去畸变:Fast-LIO2传感器融合全流程解析 在自动驾驶和机器人定位领域,激光雷达与IMU的紧耦合系统正成为高精度状态估计的主流方案。Fast-LIO2作为这一技术路线的代表,其核心创新在于将IMU的动力学特性与激光点云几何特征深度…...
别再死记硬背了!用HuggingFace Diffusers库5分钟搞懂Stable Diffusion的VAE、U-Net和CLIP怎么协同工作
5分钟透视Stable Diffusion核心组件:用HuggingFace Diffusers实战VAE/U-Net/CLIP协同机制 当你在HuggingFace Diffusers库中第一次调用StableDiffusionPipeline时,是否好奇过那段简短的文本提示如何变成精美图像?这背后是VAE、U-Net和CLIP三…...
Milvus向量数据库Docker安装避坑指南:从配置到可视化工具Attu的完整流程
Milvus向量数据库Docker安装避坑指南:从配置到可视化工具Attu的完整流程 当开发者第一次接触向量数据库时,往往会遇到各种意想不到的"坑"。作为一款开源的向量数据库,Milvus因其高性能和易用性而广受欢迎,但在Docker环境…...
别再瞎装了!用NVIDIA-SMI一键查CUDA版本,保姆级PyTorch 2.6.0安装避坑指南
深度学习环境搭建实战:从CUDA版本诊断到PyTorch 2.6.0完美安装 刚接触深度学习的新手最常遇到的"入门杀"问题,往往不是模型调参或代码编写,而是环境搭建这个看似简单的环节。我见过太多人在安装PyTorch时直接复制粘贴网上的pip命令…...
每日算法题 17---205.同构字符串
题目 205.同构字符串 要求 给定两个字符串 s 和 t ,判断它们是否是同构的。如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一…...
[深度解析] AXI4-Stream Register Slice:时序优化的“外科手术刀”
1. 为什么需要AXI4-Stream Register Slice? 在FPGA设计中,时序问题就像血管中的血栓,随时可能让整个系统瘫痪。想象你正在设计一个4K视频处理流水线,每个像素都要经过十几级处理模块。当系统时钟频率提升到300MHz以上时࿰…...
nli-distilroberta-base惊艳案例:自动识别合同补充协议与主协议的潜在矛盾条款
nli-distilroberta-base惊艳案例:自动识别合同补充协议与主协议的潜在矛盾条款 1. 项目概述 在合同审查工作中,补充协议与主协议之间的条款一致性检查是法律从业者最头疼的问题之一。传统的人工比对方式不仅耗时费力,还容易遗漏关键矛盾点。…...
从源码到上架:手把手教你用Android Studio打包绿豆TVBox APK,并修改Logo、启动图和包名
从零打造个性化TV应用:Android Studio深度定制指南 在流媒体内容消费爆发的时代,拥有一个专属的影视聚合平台成为许多技术爱好者的追求。绿豆TVBox这类开源项目为开发者提供了快速入门的跳板,但真正实现个性化部署需要跨越从源码编译到定制化…...
