高并发场景下解决并发数据不一致
简单的场景:
全量数据更新的情况下, 不在乎同一秒的请求都必须要成功, 只留下最新的更新请求数据
- 方案常用的是
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目录ÿ…...
深入探讨编程的核心概念、学习路径、实际应用以及对未来的影响
在当今这个数字化时代,编程已成为连接现实与虚拟世界的桥梁,它不仅塑造了我们的生活方式,还推动了科技的飞速发展。从简单的网页制作到复杂的人工智能系统,编程无处不在,其重要性不言而喻。本文旨在深入探讨编程的核心…...
《蔚蓝档案》鼠标指针主题:从设计到安装的完整桌面美化指南
1. 项目概述:为你的桌面注入《蔚蓝档案》的学园气息如果你和我一样,既是《蔚蓝档案》的玩家,又是个喜欢折腾桌面美化的爱好者,那么今天分享的这个项目绝对会让你眼前一亮。它不是什么复杂的软件,而是一套精心制作的Win…...
为什么93%的DeepSeek PR被拒?揭秘CI流水线自动拦截的4类“伪Clean”代码陷阱
更多请点击: https://intelliparadigm.com 第一章:为什么93%的DeepSeek PR被拒?揭秘CI流水线自动拦截的4类“伪Clean”代码陷阱 DeepSeek 开源仓库的 CI 流水线以严苛著称——最新统计显示,93% 的 PR 在 pre-commit 阶段即被自动…...
AgentVault Memory:构建本地AI编码记忆库,实现跨工具语义搜索与知识管理
1. 项目概述:为什么我们需要一个统一的AI编码记忆库如果你和我一样,每天的工作流里塞满了各种AI编码助手——Claude Code在终端里处理一个项目,Cursor在IDE里开着,偶尔切到OpenCode或者Codex处理点零碎任务。每次对话都充满了宝贵…...
不止于Java:在Termux的Ubuntu子系统里,我这样配置Python/Node.js多语言开发环境
不止于Java:在Termux的Ubuntu子系统里配置Python/Node.js多语言开发环境 将手机变成便携式开发工作站早已不是天方夜谭。通过Termux和proot-distro搭建的Ubuntu子系统,开发者可以在Android设备上构建完整的Linux开发环境。与局限于单一语言的解决方案不同…...
MCP2MQTT 完全指南:用 AI 自然语言控制硬件设备的开源 MCP 工具
前言 2025年4月,MCP2Everything 团队正式开源MCP2MQTT,这是全球首个将 MCP(模型上下文协议)与 MQTT 物联网协议无缝桥接的开源工具,彻底打通了 AI 大模型与物理硬件之间的"最后一公里"。无需编写任何胶水代码…...
Claude Code环境变量配置全解析:从入门到精通
1. 项目概述:Claude Code 环境变量配置生成器如果你和我一样,是 Claude Code 的深度用户,那你一定经历过这样的时刻:面对一个复杂的开发任务,想调整一下模型的思考深度(Effort Level)来平衡成本…...
《QGIS空间数据处理与高级制图》008:OGR2OGR命令行工具核心优势
作者:翰墨之道,毕业于国际知名大学空间信息与计算机专业,获硕士学位,现任国内时空智能领域资深专家、CSDN知名技术博主。多年来深耕地理信息与时空智能核心技术研发,精通 QGIS、GrassGIS、OSG、OsgEarth、UE、Cesium、OpenLayers、Leaflet、MapBox 等主流工具与框架,兼具…...
Nature论文检索正在失效,Perplexity底层检索逻辑重构预警(仅限科研骨干内部流通的3条技术简报)
更多请点击: https://intelliparadigm.com 第一章:Nature论文检索正在失效,Perplexity底层检索逻辑重构预警(仅限科研骨干内部流通的3条技术简报) 检索信号衰减的实证观测 近期对Nature、Science主站及PubMed Centra…...
Enzyme协议:DeFi资产管理智能合约架构与实战指南
1. 项目概述:当智能合约遇上资产管理如果你在区块链领域,特别是DeFi(去中心化金融)生态里待过一段时间,大概率听说过“Enzyme”这个名字。它不是一个新概念,但绝对是DeFi乐高积木中一块承重墙级别的组件。简…...
移动SoC设计演进:从骁龙600/400系列看芯片战略与体验竞争
1. 从一场发布会看移动芯片的十年演进2015年2月,巴塞罗那世界移动通信大会前夕,高通的一则新闻稿在业内激起了不小的涟漪。他们宣布了全新的骁龙600和400系列移动平台,其中最引人注目的,是首次将当时ARM最新的64位Cortex-A72核心引…...
